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>
This commit is contained in:
wtandClaude Opus 5.5 committed 2026-10-31 23:30:01 +07:00
1 parent 29a4664401
commit 0ccb7e1861
17 files changed
+1267 -103

No files matched your search

+20 -1
View File
@@ -14,12 +14,13 @@
```text
BalanceWatch/
├── branding/ # аватар и баннер для README (PNG + SVG-исходники)
├── docs/CONTRACT_V2.md # общий контракт экосистемы v2 (копия, одинаковая во всех репозиториях)
├── BalanceWatch.xcodeproj/
└── BalanceWatch/
├── App/ # точка входа и экраны часов
├── Models/ # SwiftData-модели (копия из монорепы)
├── Shared/ # контейнер SwiftData, тема, ServerSync
├── Utilities/ # FinanceCalculations, форматирование валют
├── Utilities/ # FinanceCalculations, Money (сотые, курсы), форматирование валют
├── Views/Components/ # CategoryIconView
└── Assets.xcassets # иконка приложения
```
@@ -28,6 +29,24 @@ BalanceWatch/
любой `.swift`-файл, положенный в `BalanceWatch/`, автоматически попадает в
таргет — править `project.pbxproj` вручную не нужно.
## Контракт v2
Часы реализуют клиентскую часть `docs/CONTRACT_V2.md` в компактном виде:
- синхронизируются и хранятся счета, переводы, курсы и настройка
`baseCurrency`; общий баланс, аналитика и бюджеты считаются в базовой
валюте, при отсутствии курса показывается «нет курса C→B»;
- экран «Счета» (только чтение) с балансами счетов и «Без счёта»; при
добавлении операции можно выбрать счёт, валюта следует за счётом;
- общие бюджеты: в «Настройки → Сервер → Бюджет» выбирается личное или общее
пространство, можно присоединиться по коду; данные каждого пространства
лежат в отдельном хранилище;
- регулярные операции, цели, долги, вложения и теги хранятся и не теряются
при пересохранении, но интерфейса для них нет; регулярные операции часы не
создают;
- если `GET /v1/capabilities` отвечает 404 (сервер v1), счета и общие
бюджеты скрыты, новые сущности не отправляются.
## Сборка
1. Открыть `BalanceWatch.xcodeproj` в Xcode 16 или новее.