- 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>
BalanceWatch
Самостоятельное (watch-only) приложение Balance для watchOS 10+, выделенное
из монорепозитория Balance (Balance/BalanceWatch + общий код).
Стек: SwiftUI + SwiftData, синхронизация через self-hosted BalanceServer.
Структура
BalanceWatch/
├── branding/ # аватар и баннер для README (PNG + SVG-исходники)
├── docs/CONTRACT_V2.md # общий контракт экосистемы v2 (копия, одинаковая во всех репозиториях)
├── BalanceWatch.xcodeproj/
└── BalanceWatch/
├── App/ # точка входа и экраны часов
├── Models/ # SwiftData-модели (копия из монорепы)
├── Shared/ # контейнер SwiftData, тема, ServerSync
├── Utilities/ # FinanceCalculations, Money (сотые, курсы), форматирование валют
├── Views/Components/ # CategoryIconView
└── Assets.xcassets # иконка приложения
Проект использует папки, синхронизируемые с файловой системой (Xcode 16+):
любой .swift-файл, положенный в BalanceWatch/, автоматически попадает в
таргет — править project.pbxproj вручную не нужно.
Контракт v2
Часы реализуют клиентскую часть docs/CONTRACT_V2.md в компактном виде:
- синхронизируются и хранятся счета, переводы, курсы и настройка
baseCurrency; общий баланс, аналитика и бюджеты считаются в базовой валюте, при отсутствии курса показывается «нет курса C→B»; - экран «Счета» (только чтение) с балансами счетов и «Без счёта»; при добавлении операции можно выбрать счёт, валюта следует за счётом;
- общие бюджеты: в «Настройки → Сервер → Бюджет» выбирается личное или общее пространство, можно присоединиться по коду; данные каждого пространства лежат в отдельном хранилище;
- регулярные операции, цели, долги, вложения и теги хранятся и не теряются при пересохранении, но интерфейса для них нет; регулярные операции часы не создают;
- если
GET /v1/capabilitiesотвечает 404 (сервер v1), счета и общие бюджеты скрыты, новые сущности не отправляются.
Сборка
- Открыть
BalanceWatch.xcodeprojв Xcode 16 или новее. - Выбрать схему
BalanceWatchи симулятор Apple Watch. - В Signing & Capabilities при необходимости поменять Team и
bundle id (
com.tolamironcenko.Balance.watchkitapp).
Из командной строки:
xcodebuild -project BalanceWatch.xcodeproj -scheme BalanceWatch \
-destination 'generic/platform=watchOS Simulator' build
CI
GitHub Actions (.github/workflows/build.yml) собирает проект на
macos-15 с последним стабильным Xcode для двух назначений — watchOS
Simulator и watchOS device (без подписи). Запускается на push в
main/develop, на pull request и вручную (Run workflow). При падении
лог xcodebuild прикладывается к запуску как артефакт.
Важно
Модели, FinanceCalculations.swift и ServerSync.swift — копии общего
кода из монорепозитория. Протокол синхронизации и правила расчётов должны
совпадать с остальными клиентами Balance: при изменении контракта на
сервере переносите правки и сюда.
