- Sync and store accounts, transfers, rates and the baseCurrency setting; keep recurring, goal, debt and attachment records as raw payloads. - Skip unknown entities on pull; preserve unknown payload fields of transactions, categories and budgets and send them back on re-save. - Compute balances in integer cents: total balance, analytics and budgets in the base currency, per-account balances in the account currency, "нет курса C→B" warning when a rate is missing. - Read-only accounts screen and an optional account picker when adding a transaction (currency follows the account). - Shared ledgers: choose personal or shared in settings, join by code, separate SwiftData store, cursor and deletion journal per ledger, X-Balance-Ledger header on sync. - Hide v2 features and do not push new entities when GET /v1/capabilities returns 404. - Keep the wire id of records (lowercase UUID for new ones) so edits of records created by other clients do not create duplicates. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
37 lines
952 B
Swift
37 lines
952 B
Swift
import Foundation
|
|
import SwiftData
|
|
|
|
@Model
|
|
final class MonthlyBudget {
|
|
var id: UUID = UUID()
|
|
var categoryName: String = ""
|
|
var categoryIcon: String = "circle.fill"
|
|
var categoryEmoji: String = ""
|
|
var limit: Double = 0
|
|
var monthStart: Date = Date.now
|
|
var syncUpdatedAt: Date = Date.now
|
|
var syncID: String?
|
|
var extraPayload: Data?
|
|
|
|
init(
|
|
id: UUID = UUID(),
|
|
categoryName: String,
|
|
categoryIcon: String,
|
|
categoryEmoji: String = "",
|
|
limit: Double,
|
|
monthStart: Date,
|
|
syncUpdatedAt: Date = .now
|
|
) {
|
|
self.id = id
|
|
self.categoryName = categoryName
|
|
self.categoryIcon = categoryIcon
|
|
self.categoryEmoji = categoryEmoji
|
|
self.limit = limit
|
|
self.monthStart = monthStart
|
|
self.syncID = id.uuidString.lowercased()
|
|
self.syncUpdatedAt = syncUpdatedAt
|
|
}
|
|
|
|
var wireID: String { syncID ?? id.uuidString }
|
|
}
|