- Proje Hakkında
- Özellikler
- Sistem Gereksinimleri
- Teknoloji Stack'i
- Kurulum ve Yapılandırma
- Docker ile Veritabanı Kurulumu
- Proje Kurulum Adımları
- Kullanıcı Rolleri ve Yetkiler
- Kimlik Doğrulama
- API Dokümantasyonu
- Güvenlik ve Şifreleme
- Redis Cache Sistemi
- Audit Log Sistemi
- Raporlama
- Test Rehberi
- Sorun Giderme
- Katkıda Bulunma
PAPARA Expense Tracking System, şirketlerin giderlerini takip edebileceği kapsamlı bir sistem sunmaktadır. Kullanıcılar giderlerini kategorilere ayırabilir, ödeme yöntemlerini seçebilir ve detaylı raporlar oluşturabilir. Proje, rol bazlı yetkilendirme sistemi ile güvenli bir yapı sunar ve modern teknolojiler kullanılarak kolay kurulum ve yönetim sağlar.
API testleri ve örnek senaryoları içeren bir PDF dosyasını Papara_ExpenseTracking.pdf indirebilirsiniz.
Şirketlerin gider yönetimi süreçlerini dijitalleştirerek operasyonel verimliliği artırmak ve detaylı raporlama ile şeffaflık sağlamak.
-
Personel:
- Kendi masraflarını sisteme giren ve takip eden kullanıcılar.
- Masraf ekleme, düzenleme ve kendi raporlarını görüntüleme yetkisine sahiptirler.
-
Admin (Yönetici):
- Sistemin tümünü yönetir.
- Kullanıcı ve rol yönetimi yapabilir.
- Gider kategorileri ve ödeme yöntemlerini düzenleyebilir.
- Tüm giderleri görüntüleyip onay/red işlemlerini gerçekleştirebilir.
- Departman ve çalışan yönetimi ile tüm raporlara erişim yetkisine sahiptir.
- Rol Bazlı Yetkilendirme: Admin ve Personel rolleri ile güvenli erişim.
- JWT Token ile Kimlik Doğrulama: Tüm API isteklerinde güvenli oturum yönetimi.
- Güvenli Şifre Yönetimi: SHA256 hash algoritması ile şifreler güvenli şekilde saklanır.
- Otomatik Şifre Oluşturma: İlk kurulumda güvenli şifreler otomatik olarak üretilir.
- Kategorize Gider Girişi: Esnek kategori sistemi ile masraflar detaylı şekilde kaydedilir.
- Dosya Yükleme: Fatura ve fiş gibi belgeler masraflara eklenebilir.
- Durum Takibi: Masraflar Beklemede, Onaylandı, Reddedildi, Ödendi statülerinde izlenir.
- Filtreleme ve Arama: Masraflar kategori, tarih, durum, konum, tutar, ödeme yöntemi gibi kriterlerle filtrelenebilir.
- Hızlı Onay/Red İşlemleri: Yöneticiler masrafları hızlıca onaylayabilir veya reddedebilir.
- Ödeme Simülasyonu: Onaylanan masraflar ödeme simülasyonuna aktarılır.
- Sanal Banka Entegrasyonu: Masrafların ödemesi için sanal banka simülasyonu.
- Otomatik EFT İşlemleri: Onaylanan masraflar için otomatik ödeme işlemleri.
- Zaman Bazlı Raporlar: Günlük, haftalık, aylık raporlar oluşturulabilir.
- Çalışan Bazlı Analiz: Her çalışanın masraf performansı analiz edilebilir.
- Statü Bazlı Raporlama: Masraflar statülerine göre raporlanabilir.
- Kişisel Gider Raporları: Personel kendi giderlerini detaylı görebilir.
- Katmanlı Mimari: API, servis, veri erişim ve DTO katmanları ile sürdürülebilir kod yapısı.
- Generic Repository: Kod tekrarını azaltan, merkezi veri erişim yapısı.
- Middleware: Merkezi hata yönetimi ve loglama için özel middleware yapısı.
- Audit Log: Tüm önemli veri işlemleri otomatik olarak kaydedilir.
- Redis Cache: Sık erişilen veriler için performans optimizasyonu.
- Seed Data: İlk kurulumda örnek veriler otomatik olarak eklenir.
- DTO/Schema Kullanımı: Entity’ler doğrudan dışarıya açılmaz, güvenli ve kontrollü veri transferi sağlanır.
- Serilog ile Loglama: Tüm önemli işlemler ve hatalar detaylı şekilde loglanır.
- .NET 8.0 SDK
- Docker Desktop
- Git
- 8 GB RAM
- 20 GB Disk Alanı
- .NET 8.0 SDK (Latest)
- Docker Desktop (Latest)
- Visual Studio 2022 veya VS Code
- 16 GB RAM
- 50 GB SSD Disk
- Framework: .NET 8.0 Web API
- ORM: Entity Framework Core
- Architecture: Repository Pattern + Unit of Work
- Primary: PostgreSQL / SQL Server
- Caching: Redis
- JWT Authentication: JWT Bearer Token
- FluentValidation: Girdi doğrulamaları
- SHA256 Encryption: Şifre şifreleme
- AutoMapper: DTO ve Entity dönüşümleri
- **Swagger *: API dokümantasyonu
- Serilog: Loglama sis(Swashbuckle)*temi
- Docker: Konteynerizasyon
- Database Approach: Code First Migration
- Data Access: Dapper (Raporlama için)
- Validation: FluentValidation
- Logging: Serilog
- Configuration: appsettings.json
Sistemde aşağıdaki araçların yüklü olması gerekmektedir:
# SQL Server container'ını başlat
docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourStrong@Passw0rd" \
-p 1433:1433 --name mssql \
-d mcr.microsoft.com/mssql/server:2019-latest
# Redis container'ını persistence ile başlat
docker run --name redis-expense \
-p 6379:6379 \
-v redis-data:/data \
-d redis:alpine redis-server --appendonly yes
# PostgreSQL container'ını başlat (isteğe bağlı)
docker run --name postgres-expense \
-e POSTGRES_PASSWORD=YourStrong@Passw0rd \
-e POSTGRES_DB=ExpenseTracking \
-p 5432:5432 \
-d postgres:15
# Çalışan container'ları göster
docker ps
# Container loglarını kontrol et
docker logs mssql
docker logs redis-expense
git clone https://github.com/nalbantseymaa/papara-bootcamp-final-case.git
cd papara-bootcamp-final-case
dotnet restore
appsettings.json
dosyasını düzenleyin:
{
"ConnectionStrings": {
"DefaultConnection": "Server=localhost,1433;Database=ExpenseTracking;User Id=sa;Password=YourStrong@Passw0rd;TrustServerCertificate=true;"
},
"Redis": {
"Configuration": "localhost:6379"
},
"JwtConfig": {
"Secret": "YourSuperSecretKeyThatIsAtLeast32Characters",
"Issuer": "ExpenseTrackingAPI",
"Audience": "ExpenseTrackingUsers",
"AccessTokenExpiration": 60
}
}
# Migration'ları uygula ve seed data'yı yükle
dotnet ef database update --project ExpenseTracking.Api
# API'yi başlat
dotnet run --project ExpenseTracking.Api
Tarayıcınızda şu adrese gidin:
- Swagger UI:
https://localhost:5001/swagger
- API Base URL:
https://localhost:5001/api
- Tüm sistem üzerinde tam yetki
- Kullanıcı ve rol yönetimi
- Gider yönetimi
- Ödeme yöntemleri yönetimi
- Departman ve çalışan yönetimi
- Tüm raporlara erişim
- Kendi giderlerini ekleme/düzenleme
- Kendi gider raporlarını görüntüleme
- Profil bilgilerini güncelleme
- Sadece kendi verilerine erişim
Sistem ilk kurulumda aşağıdaki kullanıcıları oluşturur:
Kullanıcı Adı: admin
Şifre: 123456
Kullanıcı Adı: employee1
Şifre: employee123
POST /api/auth/login
Content-Type: application/json
{
"userName": "admin",
"password": "123456"
}
{
"serverDate": "2025-06-01T16:58:20.683908Z",
"referenceNo": "c8a5dd41-80f8-4049-aeea-1f739036f033",
"success": true,
"message": "Success",
"response": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userName": "admin",
"expiration": "2025-06-02T09:38:20.6837886Z"
}
}
GET /api/expenses
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
POST /api/auth/login # Giriş yap
POST /api/auth/refresh # Token yenile
GET /api/users # Kullanıcıları listele
POST /api/users # Yeni kullanıcı oluştur
GET /api/users/{id} # Kullanıcı detayı
PUT /api/users/{id} # Kullanıcı güncelle
DELETE /api/users/{id} # Kullanıcı sil
GET /api/expenses # Giderleri listele
POST /api/expenses # Yeni gider oluştur
GET /api/expenses/{id} # Gider detayı
PUT /api/expenses/{id} # Gider güncelle (sadece beklemede olanlar)
DELETE /api/expenses/{id} # Gider sil
GET /api/expenses/ByParameters?categoryId=2&paymentMethodId=2&minAmount=12&maxAmount=100&status=Approved&location=izmir
# Onay İşlemleri
PUT /api/expenses/approve/{expenseId} # Gideri onayla
PUT /api/expenses/reject/{expenseId} # Gideri reddet
GET /api/expensefiles # Dosyaları listele
POST /api/expensefiles # Dosya yükle
GET /api/expensefiles/{id} # Dosya detayı
PUT /api/expensefiles/{id} # Dosya güncelle
DELETE /api/expensefiles/{id} # Dosya sil
GET /api/categories # Kategorileri listele
POST /api/categories # Yeni kategori oluştur
GET /api/categories/{id} # Kategori detayı
PUT /api/categories/{id} # Kategori güncelle
DELETE /api/categories/{id} # Kategori sil
GET /api/payment-methods # Ödeme yöntemlerini listele
POST /api/payment-methods # Yeni ödeme yöntemi oluştur
GET /api/payment-methods/{id} # Ödeme yöntemi detayı
PUT /api/payment-methods/{id} # Ödeme yöntemi güncelle
DELETE /api/payment-methods/{id} # Ödeme yöntemi sil
GET /api/departments # Departmanları listele
POST /api/departments # Yeni departman oluştur
GET /api/departments/{id} # Departman detayı
PUT /api/departments/{id} # Departman güncelle
DELETE /api/departments/{id} # Departman sil
GET /api/employees # Çalışanları listele
POST /api/employees # Yeni çalışan oluştur
GET /api/employees/{id} # Çalışan detayı
PUT /api/employees/{id} # Çalışan güncelle
DELETE /api/employees/{id} # Çalışan sil
GET /api/employees/ByParameters?departmentId=2&minSalary=102&MaxSalary=500
GET /api/addresses # Adresleri listele
GET /api/addresses/{id} # Adres detayı
PUT /api/addresses/{id} # Adres güncelle
DELETE /api/addresses/{id} # Adres sil
GET /api/addresses/ByParameters?city=Ankara&zipCode=06000
POST /api/employees/{employeeId}/addresses # Çalışana adres ekle
POST /api/departments/{departmentId}/addresses # Departmana adres ekle
GET /api/phones # Telefonları listele
GET /api/phones/{id} # Telefon detayı
PUT /api/phones/{id} # Telefon güncelle
DELETE /api/phones/{id} # Telefon sil
POST /api/employees/{id}/phones # Çalışana telefon ekle
POST /api/departments/{id}/phones # Departmana telefon ekle
POST /api/managers/{id}/phones # Yöneticiye telefon ekle
GET /api/managers # Yöneticileri listele
POST /api/managers # Yeni yönetici oluştur
GET /api/managers/{id} # Yönetici detayı
PUT /api/managers/{id} # Yönetici güncelle
DELETE /api/managers/{id} # Yönetici sil
# Genel Şirket Raporu (period: Daily, Weekly, Monthly)
GET /api/Reports/company/total?period=Daily
# Statüye Göre Rapor
GET /api/Reports/company/by-status?period=Daily
# Çalışan Bazlı Rapor
GET /api/Reports/company/by-employee?period=Weekly&employeeId=2
# Kendi Masraflarım (Personel için)
GET /api/Reports/GetEmployeeExpenses
- SHA256 Hash Algoritması: Tüm şifreler güvenli şekilde hashlenir
- Rastgele Şifre Oluşturma: İlk kurulumda güvenli şifreler otomatik oluşturulur
- Şifreler Hiçbir Zaman Açık Saklanmaz: Veritabanında sadece hash değeri tutulur
- Güvenli Secret Key: En az 32 karakter uzunluğunda
- Token Süresi Yönetimi: Configurable expiration time
- Refresh Token: Otomatik token yenileme
- Rol Bazlı Yetkilendirme: Her endpoint için uygun rol kontrolü
- Input Validation: FluentValidation ile güçlü doğrulama
- CORS Policy: Güvenli cross-origin istekler
Redis ile performans optimizasyonu için şu veriler cache'lenir:
- Expense Categories (Gider Kategorileri)
- Payment Methods (Ödeme Yöntemleri)
- Departments (Departmanlar)
- Sık sorgulanan master veriler RAM'de tutulur
- Veritabanı yükü azalır
- Yanıt süreleri dramatik olarak kısalır
- Kategori listesi gibi sık erişilen veriler milisaniyede döner
- Network trafiği azalır
- Concurrent user desteği artar
- Cache invalidation stratejileri ile güncel veri garantisi
- TTL (Time To Live) ayarları ile otomatik temizlik
- Master data değiştiğinde cache otomatik güncellenir
{
"Redis": {
"Configuration": "localhost:6379",
"InstanceName": "ExpenseTracking",
"DefaultTTL": 3600
}
}
Sistemimizde tüm veri ekleme, güncelleme ve silme işlemleri otomatik olarak kaydedilir:
- Kullanıcı Bilgisi: Hangi kullanıcı işlemi gerçekleştirdi
- İşlem Türü: Create, Update, Delete
- Tablo/Entity: Hangi veri üzerinde işlem yapıldı
- Eski/Yeni Değerler: Değişiklik detayları
- Timestamp: İşlem zamanı
- IP Adresi: İsteğin geldiği adres
- Güvenlik İzleme: Şüpheli aktivitelerin tespiti
- Şeffaflık: İşlem geçmişinin takibi
- Yasal Gereklilikler: Compliance ve audit ihtiyaçları
- Hata Ayıklama: Sorunların kökenini bulma
Audit log kayıtları sistem yöneticileri tarafından incelenebilir ve gerektiğinde raporlanabilir.
GET /api/Reports/company/total?period=Daily
GET /api/Reports/company/total?period=Weekly
GET /api/Reports/company/total?period=Monthly
GET /api/Reports/company/by-status?period=Daily
- Onaylanan giderler
- Reddedilen giderler
- Bekleyen giderler
GET /api/Reports/company/by-employee?period=Weekly&employeeId=2
GET /api/Reports/GetEmployeeExpenses
Not: Çalışanlar sadece kendi giderlerini görebilir
- Zaman Bazlı Filtreleme: Günlük, haftalık, aylık
- Kategori Bazlı Analiz: Hangi kategoride ne kadar harcandı
- Trend Analizi: Gider artış/azalış trendleri
- Export Özelliği: Excel/PDF formatında indirme
# Admin rolü ile giriş yap
POST /api/auth/login
{
"userName": "admin",
"password": "123456"
}
# Personel rolü ile gider ekle
POST /api/expenses
{
"amount": 100.50,
"description": "Yakıt gideri",
"categoryId": 1,
"paymentMethodId": 1,
"location": "Istanbul"
}
# Admin ile gider onayla
PUT /api/expenses/approve/1
# Günlük rapor al
GET /api/Reports/company/total?period=Daily
# Container'ları kontrol et
docker ps -a
# Durdurulmuş container'ı başlat
docker start mssql
docker start redis-expense
# Container loglarını kontrol et
docker logs mssql
# Connection string'i kontrol et
# appsettings.json dosyasındaki bilgileri doğrula
# SQL Server container'ının çalıştığından emin ol
docker ps | grep mssql
# Mevcut migration'ları kontrol et
dotnet ef migrations list
# Database'i temizle ve yeniden oluştur
dotnet ef database drop
dotnet ef database update
# Redis container'ını kontrol et
docker ps | grep redis
# Redis'e bağlantı testi
docker exec -it redis-expense redis-cli ping
# Token süresini kontrol et
# Secret key yapılandırmasını doğrula
# appsettings.json'daki JwtConfig bölümünü kontrol et
Sistem logları Serilog ile kaydedilir. Hata ayıklama için log dosyalarını kontrol edin:
- Application Logs:
logs/
dizini - Error Logs: Kritik hatalar ayrı dosyada tutulur
- API Layer: Controller'lar ve middleware'ler
- Service Layer: İş mantığı ve servisler
- Repository Layer: Veri erişim katmanı
- Schema Layer: DTO ve response modelleri
- Generic Repository Pattern: Kod tekrarını azaltma
- Unit of Work Pattern: İşlem yönetimi
- Dependency Injection: Gevşek bağlılık
- Middleware Pattern: Cross-cutting concerns
- Clean Code: Anlamlı isimlendirme
- SOLID Principles: Genişletilebilir tasarım
- Single Responsibility: Her class tek sorumlu
- Defensive Programming: Güvenli kod yazımı
- Anlamlı değişken isimleri
- 25 satırı geçmeyen metotlar
- Hardcoded değerler yerine constants
- Kapsamlı unit testler
- API dokümantasyonu güncellemeleri
- Feature branch oluşturun
- Değişikliklerinizi test edin
- Code review sürecini takip edin
- Dokümantasyonu güncelleyin
Bu proje Patika.dev ve Papara işbirliği ile düzenlenen Kadın Yazılımcı Bootcamp bitirme projesi olarak geliştirilmiştir.
Papara ve Patika.dev'e sağladıkları eğitim fırsatı için teşekkür ederiz.
Bu README dosyası, uygulamayı sıfırdan kurmak ve kullanmak isteyenler için rehber niteliğindedir.
Herhangi bir sorunuz olursa lütfen aşağıdaki kanallardan ulaşın:
Proje Deposu: https://github.com/nalbantseymaa/papara-bootcamp-final-case.git
LinkedIn: https://www.linkedin.com/in/nalbantseyma/
Son güncelleme: Haziran 2025