84 lines
2.4 KiB
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
|
|
}
|
|
}
|