InvestmentTrackerApp/InvestmentTracker/Models/CoreData/Snapshot+CoreDataClass.swift

84 lines
2.4 KiB
Swift

import Foundation
import CoreData
@objc(Snapshot)
public class Snapshot: NSManagedObject, Identifiable {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Snapshot> {
return NSFetchRequest<Snapshot>(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
}
}