Files
BalanceWatch/BalanceWatch/Models/MonthlyBudget.swift
T
wtandClaude Opus 5.5 0ccb7e1861 Implement contract v2 on the watch: accounts, rates, base currency, ledgers
- 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>
2026-10-31 23:30:01 +07:00

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 }
}