using System; using System.ComponentModel; namespace FahrzeugVerwaltung { public class Fahrzeug : INotifyPropertyChanged { private int _id; private string _marke; private string _modell; private int _baujahr; private int _leistung; private int _kilometerstand; private decimal _kaufpreis; private string _farbe; public int Id { get => _id; set { _id = value; OnPropertyChanged(nameof(Id)); } } public string Marke { get => _marke; set { _marke = value; OnPropertyChanged(nameof(Marke)); } } public string Modell { get => _modell; set { _modell = value; OnPropertyChanged(nameof(Modell)); } } public int Baujahr { get => _baujahr; set { _baujahr = value; OnPropertyChanged(nameof(Baujahr)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } public int Leistung { get => _leistung; set { _leistung = value; OnPropertyChanged(nameof(Leistung)); } } public int Kilometerstand { get => _kilometerstand; set { _kilometerstand = value; OnPropertyChanged(nameof(Kilometerstand)); OnPropertyChanged(nameof(KilometerstandFormatiert)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } public decimal Kaufpreis { get => _kaufpreis; set { _kaufpreis = value; OnPropertyChanged(nameof(Kaufpreis)); OnPropertyChanged(nameof(KaufpreisFormatiert)); OnPropertyChanged(nameof(AktuellerWert)); OnPropertyChanged(nameof(AktuellerWertFormatiert)); } } public string Farbe { get => _farbe; set { _farbe = value; OnPropertyChanged(nameof(Farbe)); } } // Formatierte Eigenschaften für die Anzeige public string KilometerstandFormatiert => $"{Kilometerstand:N0} km"; public string KaufpreisFormatiert => $"{Kaufpreis:C}"; public string AktuellerWertFormatiert => $"{AktuellerWert:C}"; // Berechnet den aktuellen Wert basierend auf Alter und Kilometerstand public decimal AktuellerWert { get { return BerechneAktuellenWert(); } } /// /// Berechnet den aktuellen Wert des Fahrzeugs /// Formel: Wertverlust basierend auf Alter und Kilometerstand /// /// Aktueller Wert des Fahrzeugs public decimal BerechneAktuellenWert() { if (Kaufpreis <= 0 || Baujahr <= 0) return 0; int aktuellesJahr = DateTime.Now.Year; int alter = aktuellesJahr - Baujahr; // Wertverlust pro Jahr: 15% in den ersten 3 Jahren, dann 10% pro Jahr decimal wertverlustProzent = 0; for (int i = 0; i < alter; i++) { if (i < 3) wertverlustProzent += 0.15m; // 15% pro Jahr in den ersten 3 Jahren else wertverlustProzent += 0.10m; // 10% pro Jahr danach } // Zusätzlicher Wertverlust basierend auf Kilometerstand // Pro 10.000 km: 2% Wertverlust decimal kmWertverlust = (Kilometerstand / 10000m) * 0.02m; wertverlustProzent += kmWertverlust; // Maximal 90% Wertverlust if (wertverlustProzent > 0.90m) wertverlustProzent = 0.90m; decimal aktuellerWert = Kaufpreis * (1 - wertverlustProzent); // Mindestwert: 5% des Kaufpreises decimal mindestwert = Kaufpreis * 0.05m; if (aktuellerWert < mindestwert) aktuellerWert = mindestwert; return Math.Round(aktuellerWert, 2); } /// /// Gibt eine detaillierte Beschreibung des Fahrzeugs zurück /// /// Formatierte Fahrzeugbeschreibung public string GetDetailedDescription() { return $"{Marke} {Modell} ({Baujahr}) - {Leistung} PS - {KilometerstandFormatiert} - {Farbe}"; } /// /// Berechnet das Alter des Fahrzeugs in Jahren /// /// Alter in Jahren public int GetAlter() { return DateTime.Now.Year - Baujahr; } /// /// Prüft, ob das Fahrzeug als Oldtimer gilt (älter als 30 Jahre) /// /// True wenn Oldtimer, sonst False public bool IsOldtimer() { return GetAlter() >= 30; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public override string ToString() { return $"{Marke} {Modell} ({Baujahr})"; } } }