diff --git a/FinTrack/Enums/FeedbackTypes.cs b/FinTrack/Enums/FeedbackTypes.cs new file mode 100644 index 0000000..ef2c4a2 --- /dev/null +++ b/FinTrack/Enums/FeedbackTypes.cs @@ -0,0 +1,19 @@ +using System.ComponentModel; + +namespace FinTrack.Enums +{ + public enum FeedbackTypes + { + [Description("Bug Report")] + BugReport, + + [Description("Feature Request")] + FeatureRequest, + + [Description("General Feedback")] + GeneralFeedback, + + [Description("Other")] + Other + } +} diff --git a/FinTrack/Enums/NotificationType.cs b/FinTrack/Enums/NotificationType.cs new file mode 100644 index 0000000..6ad2037 --- /dev/null +++ b/FinTrack/Enums/NotificationType.cs @@ -0,0 +1,10 @@ +namespace FinTrack.Enums +{ + public enum NotificationType + { + Suggestion, + GoalAchieved, + Warning, + General + } +} diff --git a/FinTrack/Helpers/EnumToDescriptionConverter.cs b/FinTrack/Helpers/EnumToDescriptionConverter.cs new file mode 100644 index 0000000..22f0afa --- /dev/null +++ b/FinTrack/Helpers/EnumToDescriptionConverter.cs @@ -0,0 +1,44 @@ +using System.ComponentModel; +using System.Globalization; +using System.Windows; +using System.Windows.Data; + +namespace FinTrack.Helpers +{ + public class EnumToDescriptionConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is not Enum enumValue) + return value; + + return GetEnumDescription(enumValue); + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value is string description) + { + foreach (Enum enumValue in Enum.GetValues(targetType)) + { + if (GetEnumDescription(enumValue) == description) + { + return enumValue; + } + } + } + + return DependencyProperty.UnsetValue; + } + + private string GetEnumDescription(Enum enumObj) + { + var fieldInfo = enumObj.GetType().GetField(enumObj.ToString()); + if (fieldInfo == null) return enumObj.ToString(); + + var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(typeof(DescriptionAttribute), false); + + return attributes.Length > 0 ? attributes[0].Description : enumObj.ToString(); + } + } +} diff --git a/FinTrack/Models/Notification/NotificationModel.cs b/FinTrack/Models/Notification/NotificationModel.cs new file mode 100644 index 0000000..541f5ff --- /dev/null +++ b/FinTrack/Models/Notification/NotificationModel.cs @@ -0,0 +1,35 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using FinTrack.Enums; + +namespace FinTrack.Models.Notification +{ + public partial class NotificationModel : ObservableObject + { + [ObservableProperty] + private string title = string.Empty; + + [ObservableProperty] + private string message = string.Empty; + + [ObservableProperty] + private string timestamp = string.Empty; + + [ObservableProperty] + private NotificationType type; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(isUnread))] + private bool isRead = false; + + public bool isUnread => !IsRead; + + public NotificationModel(string title, string message, string? timestamp, NotificationType type, bool _isRead = false) + { + Title = title; + Message = message; + Type = type; + Timestamp = timestamp ?? DateTime.Now.ToString(); + isRead = _isRead; + } + } +} diff --git a/FinTrack/Models/NotificationModel.cs b/FinTrack/Models/NotificationModel.cs index 2929a15..c6e8d90 100644 --- a/FinTrack/Models/NotificationModel.cs +++ b/FinTrack/Models/NotificationModel.cs @@ -40,12 +40,4 @@ public class NotificationModel [Column("IsRead")] public bool IsRead { get; set; } = false; } - - public enum NotificationType - { - Info, - Warning, - Error, - Success, - } } diff --git a/FinTrack/ViewModels/FeedbackViewModel.cs b/FinTrack/ViewModels/FeedbackViewModel.cs index 71aee5e..2effc29 100644 --- a/FinTrack/ViewModels/FeedbackViewModel.cs +++ b/FinTrack/ViewModels/FeedbackViewModel.cs @@ -1,8 +1,108 @@ using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using FinTrack.Enums; +using Microsoft.Extensions.Logging; +using Microsoft.Win32; +using System.Diagnostics; +using System.Windows; namespace FinTrack.ViewModels { public partial class FeedbackViewModel : ObservableObject { + [ObservableProperty] + private string? inputSubject; + + [ObservableProperty] + private FeedbackTypes selectedFeedbackType; + + [ObservableProperty] + private string? inputDescription; + + [ObservableProperty] + private string? selectedFilePath; + + public IEnumerable FeedbackTypes { get; } + + private readonly ILogger _logger; + + public FeedbackViewModel(ILogger logger) + { + _logger = logger; + + FeedbackTypes = Enum.GetValues(typeof(FeedbackTypes)).Cast(); + SelectedFeedbackType = FeedbackTypes.FirstOrDefault(); + } + + [RelayCommand(CanExecute = nameof(CanSendFeedback))] + private void SendFeedback() + { + string subject = InputSubject ?? "The title has been left blank."; + string description = InputDescription ?? "The description has been left blank."; + string filePath = SelectedFilePath ?? "No file selected."; + string feedbackType = SelectedFeedbackType.ToString(); + + string feedbackMessage = $"Subject: {subject}\n" + + $"Type: {feedbackType}\n" + + $"Description: {description}\n" + + $"File Path: {filePath}"; + + // TODO: feedbackMessage should be sent to a server or an email... + + MessageBox.Show(feedbackMessage, "Feedback Submitted", MessageBoxButton.OK, MessageBoxImage.Information); + _logger.LogInformation("Feedback submitted: Subject: {Subject}, Type: {Type}, Description: {Description}, File Path: {FilePath}", + subject, feedbackType, description, filePath); + + ClearForm(); + } + + [RelayCommand] + private void BrowseFile() + { + var openFileDialog = new OpenFileDialog + { + Title = "Select a file to attach", + Filter = "Image Files (*.png;*.jpg;*.jpeg)|*.png;*.jpg;*.jpeg|All Files (*.*)|*.*" + }; + + if (openFileDialog.ShowDialog() == true) + { + SelectedFilePath = openFileDialog.FileName; + _logger.LogInformation("Seçilen dosya: {FilePath}", SelectedFilePath); + } + } + + [RelayCommand] + private void OpenLink(string? url) + { + if (string.IsNullOrEmpty(url) || url == "#") return; + + try + { + Process.Start(new ProcessStartInfo(url) { UseShellExecute = true }); + } + catch (Exception ex) + { + MessageBox.Show($"Link açılamadı: {ex.Message}", "Hata", MessageBoxButton.OK, MessageBoxImage.Error); + _logger.LogError(ex, "Link açma hatası: {Url}", url); + } + } + + private bool CanSendFeedback() + { + return !string.IsNullOrWhiteSpace(InputSubject) && + !string.IsNullOrWhiteSpace(InputDescription); + } + + partial void OnInputSubjectChanged(string? value) => SendFeedbackCommand.NotifyCanExecuteChanged(); + partial void OnInputDescriptionChanged(string? value) => SendFeedbackCommand.NotifyCanExecuteChanged(); + + private void ClearForm() + { + InputSubject = string.Empty; + InputDescription = string.Empty; + SelectedFilePath = null; + SelectedFeedbackType = FeedbackTypes.FirstOrDefault(); + } } } diff --git a/FinTrack/ViewModels/NotificationViewModel.cs b/FinTrack/ViewModels/NotificationViewModel.cs index dda216c..41cead4 100644 --- a/FinTrack/ViewModels/NotificationViewModel.cs +++ b/FinTrack/ViewModels/NotificationViewModel.cs @@ -1,8 +1,96 @@ using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using FinTrack.Enums; +using FinTrack.Models.Notification; +using Microsoft.Extensions.Logging; +using System.Collections.ObjectModel; namespace FinTrack.ViewModels { public partial class NotificationViewModel : ObservableObject { + [ObservableProperty] + private ObservableCollection notifications; + + private readonly ILogger _logger; + + public NotificationViewModel(ILogger logger) + { + _logger = logger; + LoadSampleNotifications(); + } + + // TODO: [TEST] + private void LoadSampleNotifications() + { + Notifications = new ObservableCollection + { + new NotificationModel + ( + "Yeni Bütçe Önerisi", + "Aylık 'Eğlence' harcamalarınız için yeni bir bütçe limiti önerimiz var. Göz atmak için tıklayın.", + "2 saat önce", + NotificationType.Suggestion, + false + ), + new NotificationModel + ( + "Hedefe Ulaşıldı!", + "'Yeni Bilgisayar' birikim hedefinize ulaştınız. Tebrikler!", + "1 gün önce", + NotificationType.GoalAchieved, + true + ), + new NotificationModel + ( + "Fatura Hatırlatması", + "İnternet faturanızın son ödeme tarihi yarın. Gecikme faizinden kaçınmak için ödeme yapın.", + "3 gün önce", + NotificationType.Warning, + false + ) + }; + } + + [RelayCommand] + private void MarkAllAsRead() + { + foreach (var notification in Notifications) + { + if (notification.isUnread) + { + notification.IsRead = true; + _logger.LogInformation($"Notification '{notification.Title}' marked as read."); + } + } + _logger.LogInformation("All notifications marked as read."); + } + + [RelayCommand] + private void ClearAll() + { + Notifications.Clear(); + _logger.LogInformation("All notifications cleared."); + } + + [RelayCommand] + private void MarkAsRead(NotificationModel? notification) + { + if (notification.isUnread) + { + notification.IsRead = true; + _logger.LogInformation($"Notification '{notification.Title}' marked as read."); + } + } + + [RelayCommand] + private void DeleteNotification(NotificationModel? notification) + { + if (notification != null) + { + Notifications.Remove(notification); + _logger.LogInformation($"Notification '{notification.Title}' deleted."); + } + } } } diff --git a/FinTrack/Views/FeedbackView.xaml b/FinTrack/Views/FeedbackView.xaml index 82f43d2..3e45253 100644 --- a/FinTrack/Views/FeedbackView.xaml +++ b/FinTrack/Views/FeedbackView.xaml @@ -3,82 +3,94 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" + xmlns:vm="clr-namespace:FinTrack.ViewModels" + xmlns:helpers="clr-namespace:FinTrack.Helpers" + xmlns:enums="clr-namespace:FinTrack.Enums" mc:Ignorable="d" d:DesignHeight="800" d:DesignWidth="1200" + d:DataContext="{d:DesignInstance Type=local:FeedbackViewModel, IsDesignTimeCreatable=True}" Background="{StaticResource MainBackgroundBrush}"> + + + + - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + - - + + + + + + + + - - - - - - - - - - - - + - - - - - - - - + + + - - - - + + + + + + + + - - - - - - + + + + + + + + + + + - - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + diff --git a/README.md b/README.md index 21cb251..0d11c9d 100644 --- a/README.md +++ b/README.md @@ -1,411 +1,136 @@ -# 💰 FinTrack - Kişisel Finansal Takip Uygulaması +# 💰 FinTrack - WPF Personal Finance Tracker -> Modern ve kullanıcı dostu kişisel finans yönetimi uygulaması. Gelir, gider ve yatırımlarınızı takip ederek finansal hedeflerinize ulaşmanıza yardımcı olur. +FinTrack is a modern, user-friendly desktop application for personal finance management, built with WPF and .NET 8. It helps you track income, expenses, and investments to achieve your financial goals. ![License](https://img.shields.io/badge/license-MIT-blue.svg) -![.NET](https://img.shields.io/badge/.NET-6.0+-purple.svg) +![.NET](https://img.shields.io/badge/.NET-8.0-purple.svg) ![Platform](https://img.shields.io/badge/platform-Windows-lightgrey.svg) -![Status](https://img.shields.io/badge/status-Active-brightgreen.svg) +![Status](https://img.shields.io/badge/status-In%20Development-yellow.svg) -## 📋 İçindekiler +## 📋 Table of Contents -- [Genel Bakış](#genel-bakış) -- [Özellikler](#özellikler) -- [Kurulum](#kurulum) -- [Kullanım](#kullanım) -- [Teknoloji Yığını](#teknoloji-yığını) -- [Ekran Görüntüleri](#ekran-görüntüleri) -- [API Dokümantasyonu](#api-dokümantasyonu) -- [Katkıda Bulunma](#katkıda-bulunma) -- [Lisans](#lisans) -- [İletişim](#iletişim) +- [Overview](#overview) +- [Features](#features) +- [Technology-Stack](#technology-stack) +- [Project-Structure](#project-structure) +- [Getting-Started](#getting-started) +- [Contributing](#contributing) +- [License](#license) -## 🎯 Genel Bakış +## 🎯 Overview -FinTrack, günlük finansal işlemlerinizi kolayca takip edebileceğiniz, bütçe planlaması yapabileceğiniz ve finansal raporlar oluşturabileceğiniz kapsamlı bir masaüstü uygulamasıdır. C# ve .NET Framework kullanılarak geliştirilmiş olup, SQLite veritabanı ile yerel veri depolama sağlar. +FinTrack provides a comprehensive solution for tracking daily financial transactions, creating budgets, and generating insightful reports. It is developed using C# with a modern .NET 8 stack, utilizing a local SQLite database for secure data storage. The application follows the MVVM design pattern for a clean and maintainable codebase. -### 🎨 Tasarım Felsefesi +### 🎨 Design Philosophy -- **Basitlik**: Karmaşık olmayan, sezgisel kullanıcı arayüzü -- **Güvenilirlik**: Verilerinizin güvenliği ve bütünlüğü -- **Performans**: Hızlı ve responsive kullanıcı deneyimi -- **Esneklik**: Farklı kullanım senaryolarına uyum sağlama +- **Simplicity**: An intuitive and straightforward user interface. +- **Reliability**: Ensuring the security and integrity of your financial data. +- **Performance**: A fast and responsive user experience. +- **Modularity**: A clean architecture that is easy to extend. -## ⚡ Özellikler +## ⚡ Features -### 🏆 Ana Özellikler +### 🏆 Core Features -- 💸 **Gelir/Gider Takibi**: Tüm finansal işlemlerinizi kategorilere ayırarak detaylı takip -- 📊 **Akıllı Raporlama**: Aylık, yıllık ve özel dönem raporları ile trend analizi -- 🎯 **Bütçe Yönetimi**: Kategoriler için bütçe limitleri belirleme ve otomatik uyarılar -- 📈 **Görsel Analiz**: Interactive grafikler ve dashboard ile harcama görselleştirme -- 🔒 **Güvenli Veri Saklama**: AES-256 şifreleme ile yerel SQLite veritabanı -- 🌙 **Tema Desteği**: Light/Dark mode ve özelleştirilebilir renkler -- 📱 **Responsive Tasarım**: Farklı ekran boyutlarına uyumlu arayüz +- 💸 **Transaction Tracking**: Categorize and monitor all your financial activities. +- 📊 **Smart Reporting**: Generate reports to analyze financial trends. +- 🎯 **Budget Management**: Set budget limits for categories with alerts. +- 📈 **Visual Analysis**: Interactive charts and a dashboard to visualize spending. +- 🔒 **Secure Local Storage**: Data is stored locally in an SQLite database. +- 🎨 **Modern UI**: A clean and responsive user interface built with WPF. -### 🛠️ Teknik Özellikler +### 🛠️ Technical Features -- **.NET 6+** ile geliştirilmiş modern mimari -- **Entity Framework Core** ile güçlü ORM desteği -- **MVVM Pattern** ile temiz kod yapısı -- **WPF** ile zengin kullanıcı arayüzü -- **SQLite** ile hafif ve hızlı veritabanı -- **AutoMapper** ile nesne eşleme -- **FluentValidation** ile veri doğrulama -- **Serilog** ile kapsamlı loglama +- **Modern Architecture**: Developed on **.NET 8**. +- **MVVM Pattern**: Clean and separated code structure using **CommunityToolkit.Mvvm**. +- **Database**: **Entity Framework Core** with a local **SQLite** database. +- **Rich UI**: Built with **WPF** for a flexible user experience. +- **Charting**: Interactive data visualizations with **LiveCharts2**. +- **Logging**: Comprehensive logging with **Serilog**. +- **Authentication**: JWT-based authentication for security. -### 👥 Hedef Kitle +## 🏗️ Technology Stack -- Kişisel finanslarını takip etmek isteyen bireyler -- Aile bütçesi yönetimi yapan kullanıcılar -- Freelancer ve küçük işletme sahipleri -- Finansal okuryazarlık geliştirmek isteyen öğrenciler - -## 🚀 Kurulum - -### Sistem Gereksinimleri - -- **İşletim Sistemi**: Windows 10 veya üzeri (64-bit) -- **Framework**: .NET 6.0 Runtime veya üzeri -- **RAM**: Minimum 2GB (4GB önerilen) -- **Disk Alanı**: 100MB boş alan -- **Ekran Çözünürlüğü**: Minimum 1024x768 - -### Kurulum Adımları - -#### 📦 Hazır Kurulum Dosyası - -1. [Releases](https://github.com/username/FinTrack/releases) sayfasından en son sürümü indirin -2. `FinTrack-Setup.msi` dosyasını çalıştırın -3. Kurulum sihirbazını takip edin -4. İlk açılışta kullanıcı hesabı oluşturun - -#### 🔧 Kaynak Koddan Derleme - -```bash -# Projeyi klonlayın -git clone https://github.com/username/FinTrack.git -cd FinTrack - -# Bağımlılıkları yükleyin -dotnet restore - -# Projeyi derleyin -dotnet build --configuration Release - -# Uygulamayı çalıştırın -dotnet run --project FinTrack.WPF -``` - -### 🔑 İlk Kurulum - -1. **Master Password** oluşturun (en az 8 karakter, güçlü şifre) -2. **Varsayılan kategorileri** import edin veya kendiniz oluşturun -3. **Para birimi** ve **dil** ayarlarını yapın -4. **Otomatik yedekleme** ayarlarını aktifleştirin - -## 📱 Kullanım - -### Hızlı Başlangıç - -#### 1️⃣ İlk İşlem Ekleme - -``` -Ana Ekran → Yeni İşlem → Gelir/Gider Seç → Tutar Girin → Kategori Seç → Kaydet -``` - -#### 2️⃣ Kategori Yönetimi - -``` -Ayarlar → Kategoriler → Yeni Kategori → İsim & Renk Seç → Kaydet -``` - -#### 3️⃣ Bütçe Belirleme - -``` -Bütçe → Yeni Bütçe → Kategori Seç → Limit Belirle → Dönem Seç → Kaydet -``` - -### Gelişmiş Özellikler - -#### 📊 Rapor Oluşturma - -- **Özet Raporu**: Genel finansal durum -- **Kategori Analizi**: Harcama dağılımı -- **Trend Raporu**: Zaman içindeki değişim -- **Karşılaştırma**: Dönemler arası analiz - -#### 📈 Dashboard Özellikleri - -- **Finansal Özet Kartları**: Toplam gelir, gider ve bakiye -- **Hızlı İşlem Butonları**: One-click işlem ekleme -- **Son İşlemler**: Chronological işlem listesi -- **Bütçe İndikątörleri**: Progress bar ile görsel takip -- **Grafik Alanı**: Interactive charts ve trendler - -## 🏗️ Teknoloji Yığını - -### Backend - -- **Framework**: .NET 6.0 -- **ORM**: Entity Framework Core 6 -- **Veritabanı**: SQLite 3 -- **Validation**: FluentValidation -- **Logging**: Serilog -- **Mapping**: AutoMapper -- **Testing**: xUnit, Moq +### Backend & Core +- **Framework**: .NET 8.0 +- **ORM**: Entity Framework Core +- **Database**: SQLite +- **MVVM Framework**: CommunityToolkit.Mvvm +- **Logging**: Serilog +- **JSON Serialization**: Newtonsoft.Json +- **Authentication**: System.IdentityModel.Tokens.Jwt ### Frontend +- **UI Framework**: WPF (Windows Presentation Foundation) +- **Charting**: LiveChartsCore.SkiaSharpView.WPF +- **Styling**: Custom modern styles (see `Styles/ModernStyles.xaml`) -- **UI Framework**: WPF (Windows Presentation Foundation) -- **MVVM**: CommunityToolkit.Mvvm -- **Charts**: LiveCharts2 -- **Icons**: Material Design Icons -- **Styling**: Material Design in XAML - -### DevOps & Tools - -- **CI/CD**: GitHub Actions -- **Code Quality**: SonarQube -- **Package Manager**: NuGet -- **Documentation**: DocFX - -## 📸 Ekran Görüntüleri - -### Ana Dashboard -![Dashboard](docs/images/dashboard.png) -*Finansal özet ve hızlı erişim butonları* - -### İşlem Yönetimi -![Transactions](docs/images/transactions.png) -*Detaylı işlem listesi ve filtreleme* - -### Raporlama -![Reports](docs/images/reports.png) -*Interactive grafikler ve analiz* - -### Bütçe Planlama -![Budget](docs/images/budget.png) -*Kategori bazlı bütçe takibi* - -## 📚 API Dokümantasyonu - -### Veritabanı Şeması - -```sql --- Kullanıcılar -CREATE TABLE Users ( - Id INTEGER PRIMARY KEY AUTOINCREMENT, - Username TEXT NOT NULL UNIQUE, - Email TEXT NOT NULL UNIQUE, - PasswordHash TEXT NOT NULL, - CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP -); - --- Kategoriler -CREATE TABLE Categories ( - Id INTEGER PRIMARY KEY AUTOINCREMENT, - Name TEXT NOT NULL, - Type TEXT NOT NULL CHECK(Type IN ('Income', 'Expense')), - Color TEXT DEFAULT '#0078D4', - Icon TEXT DEFAULT 'Money', - UserId INTEGER, - FOREIGN KEY (UserId) REFERENCES Users(Id) -); - --- İşlemler -CREATE TABLE Transactions ( - Id INTEGER PRIMARY KEY AUTOINCREMENT, - Amount DECIMAL(18,2) NOT NULL, - Description TEXT, - Date DATETIME NOT NULL, - CategoryId INTEGER NOT NULL, - UserId INTEGER NOT NULL, - CreatedAt DATETIME DEFAULT CURRENT_TIMESTAMP, - FOREIGN KEY (CategoryId) REFERENCES Categories(Id), - FOREIGN KEY (UserId) REFERENCES Users(Id) -); -``` +### Development Tools +- **IDE**: Visual Studio 2022 +- **Package Manager**: NuGet +- **Version Control**: Git & GitHub +- **CI/CD**: GitHub Actions -### Service Layer - -```csharp -public interface ITransactionService -{ - Task> GetAllAsync(int userId); - Task GetByIdAsync(int id); - Task CreateAsync(CreateTransactionDto dto); - Task UpdateAsync(UpdateTransactionDto dto); - Task DeleteAsync(int id); - Task GetSummaryAsync(int userId, DateTime? from, DateTime? to); -} -``` - -## 🛡️ Güvenlik - -### Veri Koruması - -- **Şifreleme**: AES-256 ile sensitive data encryption -- **Hashing**: BCrypt ile password hashing -- **Validation**: Input validation ve SQL injection koruması -- **Access Control**: Role-based yetkilendirme - -### Gizlilik - -- **Local Storage**: Tüm veriler yerel olarak saklanır -- **No Telemetry**: Kullanıcı verisi toplanmaz -- **GDPR Compliance**: Avrupa veri koruma uyumluluğu -- **Data Export**: Tam veri export/import imkanı - -## 🧪 Test ve Kalite - -### Test Coverage - -- **Unit Tests**: %85+ kod coverage -- **Integration Tests**: Database ve service layer -- **UI Tests**: Automated UI testing -- **Performance Tests**: Load ve stress testing - -### Code Quality - -- **Static Analysis**: SonarQube ile otomatik analiz -- **Code Reviews**: Pull request review process -- **Coding Standards**: .NET coding conventions -- **Documentation**: XML comments ve wiki - -## 📈 Performans - -### Benchmarks - -- **Startup Time**: < 3 saniye (SSD) -- **Transaction Insert**: < 100ms -- **Report Generation**: < 2 saniye (10K kayıt) -- **Memory Usage**: < 150MB -- **Database Size**: 1MB per 10K transactions - -### Optimizasyon - -- **Lazy Loading**: On-demand data loading -- **Caching**: Frequently used data caching -- **Pagination**: Large dataset handling -- **Background Tasks**: Non-blocking operations - -## 🤝 Katkıda Bulunma - -### Geliştirme Süreci +## 📂 Project Structure -1. **Fork** edin repository'yi -2. **Feature branch** oluşturun (`git checkout -b feature/AmazingFeature`) -3. **Commit** edin değişikliklerinizi (`git commit -m 'Add some AmazingFeature'`) -4. **Push** edin branch'inizi (`git push origin feature/AmazingFeature`) -5. **Pull Request** açın - -### Katkı Kuralları - -- **Code Style**: .NET coding conventions -- **Testing**: Yeni kodlar için unit test yazın -- **Documentation**: Public API'ler için XML documentation -- **Commit Messages**: Conventional commits format - -### Proje Yapısı +The project is organized into a single solution with a clear folder structure following the MVVM pattern. ``` FinTrack/ -├── src/ -│ ├── FinTrack.Core/ # Domain models -│ ├── FinTrack.Infrastructure/ # Data access -│ ├── FinTrack.Application/ # Business logic -│ └── FinTrack.WPF/ # UI layer -├── tests/ -│ ├── FinTrack.Core.Tests/ -│ ├── FinTrack.Application.Tests/ -│ └── FinTrack.Integration.Tests/ -├── docs/ # Documentation -└── scripts/ # Build scripts +├── Core/ # Core logic, services, and base classes (e.g., RelayCommand, SessionManager). +├── Data/ # Entity Framework DbContext. +├── Dtos/ # Data Transfer Objects for API/UI communication. +├── Enums/ # Application-specific enumerations. +├── Helpers/ # Converters and UI assistants (e.g., PasswordBoxAssistant). +├── Models/ # Domain models and entities. +├── Services/ # Business logic services (e.g., AuthService, ApiService). +├── ViewModels/ # ViewModels for each View, containing presentation logic. +├── Views/ # WPF Windows and UserControls (the UI). +├── Styles/ # XAML styles and resources. +├── App.xaml.cs # Application entry point and setup. +└── FinTrack.csproj # Project file with dependencies. ``` -## 🆘 Destek ve SSS - -### Sıkça Sorulan Sorular - -**S: Verilerim nerede saklanıyor?** -A: Tüm veriler yerel SQLite veritabanında (`%APPDATA%\FinTrack\`) güvenle saklanır. - -**S: Şifremi unuttum, ne yapmalıyım?** -A: Güvenlik nedeniyle şifre kurtarma yoktur. Yedekleme dosyanızdan geri yükleme yapabilirsiniz. - -**S: Mobil uygulama var mı?** -A: Şu anda sadece Windows masaüstü versiyonu mevcut. Mobil versiyon roadmap'te. - -### Sorun Bildirimi - -Hata bulduğunuzda veya öneriniz olduğunda: +## 🚀 Getting Started -1. [GitHub Issues](https://github.com/username/FinTrack/issues) sayfasını ziyaret edin -2. Mevcut issue'ları kontrol edin -3. Yeni issue oluştururken template'i kullanın -4. Detaylı açıklama ve ekran görüntüsü ekleyin +### Prerequisites -## 🗺️ Roadmap +- .NET 8.0 SDK +- Visual Studio 2022 (with WPF workload) +- Git -### v2.1 (Q3 2025) -- [ ] Export/Import functionality (CSV, Excel) -- [ ] Multi-currency support -- [ ] Recurring transactions -- [ ] Advanced filtering +### Installation & Running -### v2.2 (Q4 2025) -- [ ] Cloud sync (OneDrive, Google Drive) -- [ ] Mobile companion app -- [ ] API for third-party integrations -- [ ] Machine learning insights - -### v3.0 (2026) -- [ ] Web version -- [ ] Real-time collaboration -- [ ] Banking integration -- [ ] Investment tracking - -## 📄 Lisans - -Bu proje [MIT License](LICENSE) altında lisanslanmıştır. Detaylar için LICENSE dosyasını inceleyiniz. - -``` -MIT License - -Copyright (c) 2025 FinTrack Development Team - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. -``` +1. **Clone the repository:** + ```bash + git clone https://github.com/your-username/FinTrack.git + cd FinTrack + ``` -## 👥 Geliştirici Ekibi +2. **Open in Visual Studio:** + Open the `FinTrack/FinTrack.sln` file in Visual Studio. -- **Project Lead**: [İsim](https://github.com/username) -- **Backend Developer**: [İsim](https://github.com/username) -- **UI/UX Designer**: [İsim](https://github.com/username) -- **QA Engineer**: [İsim](https://github.com/username) +3. **Restore Dependencies:** + Visual Studio should automatically restore the NuGet packages. If not, open the Package Manager Console and run: + ```powershell + Update-Package -reinstall + ``` -## 📞 İletişim +4. **Run the Application:** + Press `F5` or click the "Start" button in Visual Studio to build and run the project. The application will create and use an SQLite database in its local data directory. -- **GitHub**: [FinTrack Repository](https://github.com/username/FinTrack) -- **Email**: fintrack.support@example.com -- **Website**: [fintrack.app](https://fintrack.app) -- **Discord**: [FinTrack Community](https://discord.gg/fintrack) +## 🤝 Contributing ---- +Contributions are welcome! If you'd like to contribute, please follow these steps: -
+1. **Fork** the repository. +2. Create a new **feature branch** (`git checkout -b feature/YourAmazingFeature`). +3. **Commit** your changes (`git commit -m 'Add some AmazingFeature'`). +4. **Push** to the branch (`git push origin feature/YourAmazingFeature`). +5. Open a **Pull Request**. -**⭐ Bu projeyi beğendiyseniz yıldız vermeyi unutmayın! ⭐** +Please ensure your code adheres to the existing style and that you provide clear descriptions for your changes. -Made with ❤️ by FinTrack Team +## 📄 License -
+This project is licensed under the **MIT License**. See the [LICENSE](LICENSE) file for details. \ No newline at end of file