import Foundation import CoreData @objc(Snapshot) public class Snapshot: NSManagedObject, Identifiable { @nonobjc public class func fetchRequest() -> NSFetchRequest { return NSFetchRequest(entityName: "Snapshot") } @NSManaged public var id: UUID @NSManaged public var date: Date @NSManaged public var value: NSDecimalNumber? @NSManaged public var contribution: NSDecimalNumber? @NSManaged public var notes: String? @NSManaged public var createdAt: Date @NSManaged public var source: InvestmentSource? public override func awakeFromInsert() { super.awakeFromInsert() id = UUID() date = Date() createdAt = Date() } } // MARK: - Computed Properties extension Snapshot { var decimalValue: Decimal { value?.decimalValue ?? Decimal.zero } var decimalContribution: Decimal { contribution?.decimalValue ?? Decimal.zero } var formattedValue: String { let formatter = NumberFormatter() formatter.numberStyle = .currency formatter.currencyCode = "EUR" formatter.maximumFractionDigits = 2 return formatter.string(from: value ?? 0) ?? "€0.00" } var formattedDate: String { let formatter = DateFormatter() formatter.dateStyle = .medium formatter.timeStyle = .none return formatter.string(from: date) } var monthYearString: String { let formatter = DateFormatter() formatter.dateFormat = "MMM yyyy" return formatter.string(from: date) } } // MARK: - Comparison with Previous extension Snapshot { func change(from previousSnapshot: Snapshot?) -> Decimal { guard let previous = previousSnapshot, let previousValue = previous.value?.decimalValue, previousValue != Decimal.zero else { return Decimal.zero } let currentValue = value?.decimalValue ?? Decimal.zero return currentValue - previousValue } func percentageChange(from previousSnapshot: Snapshot?) -> Decimal { guard let previous = previousSnapshot, let previousValue = previous.value?.decimalValue, previousValue != Decimal.zero else { return Decimal.zero } let currentValue = value?.decimalValue ?? Decimal.zero return ((currentValue - previousValue) / previousValue) * 100 } }