Skip to content
2 changes: 2 additions & 0 deletions FinTrack/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,8 @@ private void ConfigureServices(IServiceCollection services)
services.AddTransient<FeedbackViewModel>();
services.AddTransient<NotificationViewModel>();

services.AddTransient<AccountView>();

services.AddSingleton<IAuthService, AuthService>();
services.AddSingleton<ISecureTokenStorage, SecureTokenStorage>();
services.AddSingleton<IApiService, ApiService>();
Expand Down
19 changes: 19 additions & 0 deletions FinTrack/Helpers/BooleanToVisibilityConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System.Globalization;
using System.Windows;
using System.Windows.Data;

namespace FinTrack.Helpers
{
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (value is bool b && b) ? Visibility.Collapsed : Visibility.Visible;
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
27 changes: 27 additions & 0 deletions FinTrack/Helpers/EnumToBooleanConverter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System.Globalization;
using System.Windows.Data;

namespace FinTrack.Helpers
{
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || parameter == null)
return false;

string enumValue = value.ToString();
string targetValue = parameter.ToString();

return enumValue.Equals(targetValue, StringComparison.OrdinalIgnoreCase);
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is false)
return Binding.DoNothing;

return Enum.Parse(targetType, parameter.ToString());
}
}
}
8 changes: 8 additions & 0 deletions FinTrack/Models/Account/AccountBalanceHistoryPoint.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace FinTrack.Models.Account
{
public class AccountBalanceHistoryPoint
{
public DateTime Date { get; set; }
public decimal Amount { get; set; }
}
}
74 changes: 74 additions & 0 deletions FinTrack/Models/Account/AccountModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
using CommunityToolkit.Mvvm.ComponentModel;
using FinTrack.Enums;
using System.Windows.Media;

namespace FinTrack.Models.Account
{
public partial class AccountModel : ObservableObject
{
[ObservableProperty]
private Guid id = Guid.NewGuid();

[ObservableProperty]
private string name;

[ObservableProperty]
private AccountType type;

[ObservableProperty]
private decimal currentBalance;

[ObservableProperty]
private decimal? targetBalance;

[ObservableProperty]
private string currency = "USD";

[ObservableProperty]
private List<AccountBalanceHistoryPoint> history = new();

public string IconPath => Type switch
{
AccountType.Checking => "/Assets/Images/Icons/bank.png",
AccountType.CreditCard => "/Assets/Images/Icons/credit_card.png",
AccountType.Loan => "/Assets/Images/Icons/investment.png",
_ => string.Empty
};

public Brush IconBackground => Type switch
{
AccountType.Checking => new SolidColorBrush(Colors.Green),
AccountType.CreditCard => new SolidColorBrush(Colors.Red),
AccountType.Loan => new SolidColorBrush(Colors.DodgerBlue),
_ => new SolidColorBrush(Colors.Gray)
};

public string BalanceText
{
get
{
if (Type == AccountType.CreditCard && TargetBalance.HasValue)
{
return $"Kullanılan Limit: {CurrentBalance:C} / {TargetBalance.Value:C}";
}
if (TargetBalance.HasValue && TargetBalance > 0)
{
return $"{CurrentBalance:C} / {TargetBalance.Value:C}";
}
return $"Değer: {CurrentBalance:C}";
}
}
public double ProgressValue
{
get
{
if (TargetBalance.HasValue && TargetBalance.Value > 0)
{
return (double)Math.Max(0, Math.Min(100, (CurrentBalance / TargetBalance.Value) * 100));
}

return Type == AccountType.Loan ? 100 : 0;
}
}
}
}
49 changes: 49 additions & 0 deletions FinTrack/Models/Budget/BudgetModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using CommunityToolkit.Mvvm.ComponentModel;
using System.Globalization;

namespace FinTrack.Models.Budget
{
public partial class BudgetModel : ObservableObject
{
[ObservableProperty]
private Guid id = Guid.NewGuid();

[ObservableProperty]
private string name = string.Empty;

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ProgressValue))]
[NotifyPropertyChangedFor(nameof(ProgressText))]
private decimal amount;

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(ProgressValue))]
[NotifyPropertyChangedFor(nameof(ProgressText))]
private decimal targetAmount;

[ObservableProperty]
private DateTime startDate;

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(RemainingTimeText))]
private DateTime endDate;

[ObservableProperty]
private string currency = "USD";

public double ProgressValue => TargetAmount <= 0 ? 0 : Math.Max(0, Math.Min(100, (double)(Amount / TargetAmount) * 100));

public string ProgressText => $"{Amount.ToString("C", new CultureInfo("tr-TR"))} / {TargetAmount.ToString("C", new CultureInfo("tr-TR"))}";

public string RemainingTimeText
{
get
{
var remaining = EndDate - DateTime.Today;
if (remaining.TotalDays < 0)
return "Süre Doldu";
return $"Kalan Süre: {remaining.Days} gün";
}
}
}
}
53 changes: 53 additions & 0 deletions FinTrack/Models/Transaction/TransactionModel.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using CommunityToolkit.Mvvm.ComponentModel;
using FinTrack.Enums;
using System.Windows.Media;

namespace FinTrack.Models.Transaction
{
public partial class TransactionModel : ObservableObject
{
[ObservableProperty]
private Guid id = Guid.NewGuid();

[ObservableProperty]
private string nameOrDescription = string.Empty;

[ObservableProperty]
private decimal amount;

[ObservableProperty]
private DateTime date = DateTime.Now;

[ObservableProperty]
private string accountName = string.Empty;

[ObservableProperty]
private string category = string.Empty;

[ObservableProperty]
private string currency = "USD";

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(IconBackground))]
[NotifyPropertyChangedFor(nameof(AmountForegroundColor))]
private TransactionType type;

private static readonly Brush IncomeBrush = new SolidColorBrush(Colors.Green);
private static readonly Brush ExpenseBrush = new SolidColorBrush(Colors.Red);
private static readonly Brush DefaultBrush = new SolidColorBrush(Colors.Gray);

public Brush IconBackground => Type switch
{
TransactionType.Income => IncomeBrush,
TransactionType.Expense => ExpenseBrush,
_ => DefaultBrush
};

public Brush AmountForegroundColor => Type switch
{
TransactionType.Income => IncomeBrush,
TransactionType.Expense => ExpenseBrush,
_ => DefaultBrush
};
}
}
45 changes: 45 additions & 0 deletions FinTrack/Styles/ModernStyles.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -824,4 +824,49 @@
</Style.Triggers>
</Style>

<Style x:Key="ModernDatePickerStyle" TargetType="DatePicker">
<Setter Property="Background" Value="#2D3A4F" /> <!-- ModernTextBox'unuzun arkaplan rengiyle aynı yapın -->
<Setter Property="Foreground" Value="White" /> <!-- Yazı rengi -->
<Setter Property="BorderThickness" Value="0,0,0,1" />
<Setter Property="BorderBrush" Value="#4A5A74" /> <!-- ModernTextBox'unuzun kenarlık rengiyle aynı yapın -->
<Setter Property="Padding" Value="10,8" />
<Setter Property="VerticalContentAlignment" Value="Center" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DatePicker">
<Border BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}"
Background="{TemplateBinding Background}"
CornerRadius="5">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>

<!-- Tarihin gösterildiği metin kutusu -->
<DatePickerTextBox x:Name="PART_TextBox"
Grid.Column="0"
Padding="{TemplateBinding Padding}"
BorderThickness="0"
Background="Transparent"
VerticalContentAlignment="Center"
Foreground="{TemplateBinding Foreground}"/>

<!-- Takvim ikonunu gösteren buton -->
<Button x:Name="PART_Button"
Grid.Column="1"
Foreground="{TemplateBinding Foreground}"
Focusable="False"
Style="{StaticResource IconOnlyButtonStyle}"
Width="30">
<Image Source="/Assets/Images/Icons/calendar.png" Width="16" Height="16"/>
</Button>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

</ResourceDictionary>
Loading
Loading