Commit graph

5 commits

Author SHA1 Message Date
Till JS
394aa79328 feat(invoices): close Phase-2 gaps — finance cross-link + structured addresses
Three items from docs/plans/invoices-module.md §"Offene Punkte" that
actually block real-world dogfooding:

1. Bezahlte Rechnung → Finance-Einnahme

  - financeStore.upsertTransactionFromInvoice(): deterministic id
    (invoice-tx-{invoiceId}) so marking the same invoice paid twice
    updates instead of duplicating. Uses table.put for the upsert.
  - invoicesStore.markPaid() calls it after the status transition,
    decrypts to get the gross + snapshot, converts minor→major for
    the finance row, formats description as "Rechnung {number} — {client}".
  - Best-effort: the call is try/catched so the invoice write (the
    thing the user initiated) never fails because of a finance bridge
    hiccup. Logs a warning instead.
  - Multi-currency caveat: finance's bare-number model loses the
    currency — documented in the upsert helper's comment. Works for
    single-currency freelancers (the 95% case).

2. Strukturierte Adressen für QR-Bill

  - LocalInvoiceSettings gains senderStreet/Zip/City/Country (nullable,
    so existing rows don't need a migration). Encryption registry
    updated to cover the new fields — same sensitivity tier as the
    legacy senderAddress blob.
  - InvoiceClientSnapshot gains street/zip/city/country, same shape
    as Debtor.
  - qr-bill.buildQRBillData prefers structured fields; falls back to
    parseAddress(senderAddress) for users who haven't touched the new
    settings form. Same preference chain on the client/debtor side.
  - PDF header + DetailView recipient block prefer structured too —
    stays in lockstep with what the QR-Bill reads.
  - SenderProfileForm replaces the single textarea with four labeled
    inputs. Legacy free-text address moves behind a <details> as a
    "weird edge case" escape hatch (Postfach, c/o etc.).
  - ClientPicker: same split, with contacts-source mapping using
    structured fields directly (contacts already have street/postalCode/
    city so no info loss).
  - Three new qr-bill tests cover the preference order: structured
    wins, legacy falls back, malformed snapshot omits debtor.

3. MODULE_REGISTRY.md

  - Added `invoices` under "Finanzen" with the cross-link note.

Tests: 48/48 green (up from 45), 0 type errors. Open Phase-2/3 items
still parked: camt.053 bank reconciliation, number-sequence multi-
device collision, unfreezing the paid→void edge.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 18:58:18 +02:00
Till JS
38b9fdb91b docs: add Apr 16 devlog, remove duplicate devlogs, update MODULE_REGISTRY
- Add devlog for April 16 (Library, Wetter, Voice-Interview, Research-Lab)
- Remove duplicate devlog files for Apr 9 and Apr 10
- Update MODULE_REGISTRY: profile voice interview, wetter, wishes modules

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 15:27:00 +02:00
Till JS
2df9ecdcaa feat(rituals): rename ai-rituals → rituals, add ceremony step types
The module was named "ai-rituals" because every step was a tool call
(log drink, show tasks, create task from text input). That framing
excluded a whole class of rituals that *don't* capture data —
personal ceremonies that just want to hold the user's attention for a
minute: the morning coffee, the Sunday reset, the before-bed shutdown.

Changes:

  - Renamed the module: apps/web/src/lib/modules/ai-rituals → rituals
  - App id 'ai-rituals' → 'rituals' in app-registry/apps.ts
  - Moved the category from 'ai' to 'life' in app-registry/categories.ts
    (personal practice, not an AI subsystem)
  - Added RitualCategory = 'utility' | 'ceremony' | 'mixed' on both
    LocalRitual and RitualTemplate. Defaults to 'utility' on read so
    existing data from before this change stays accessible.
  - 3 new step types in the RitualStepConfig union:
      - presence : markdown body + optional countdown, no tool call.
                   Use case: "Fünf Minuten still trinken."
      - breath   : guided breathing with a circle that expands/contracts
                   on inhale/exhale. Presets: box (4-4-4-4), 4-7-8,
                   coherent (5-0-5-0), plus custom timings.
      - media    : image + caption (mantra / photo / quote) with
                   optional linger timer.
  - RitualRunner extended: timer teardown on step change, breath state
    machine with phase-driven scaling animation, stop/early-exit for
    both.
  - 3 ceremony templates seeded:
      - Morgenkaffee    : Wasser → Aufbrühen → 3 tiefe Atemzüge →
                          5 Min still trinken
      - Sonntag-Reset   : Ankommen → Streaks → Was nehme ich mit? →
                          Nächste Woche → Handy weg (mixed)
      - Vor dem Schlaf  : Bildschirme aus → 4-7-8 Atmung → Journal-
                          Eintrag → Loslassen
  - ListView: category filter chips (Alle / Utility / Zeremoniell),
    templates grouped by category in the picker, category pill on each
    ritual row (hidden for the default 'utility').
  - docs/MODULE_REGISTRY.md: moved from AI-System (now 8) to Gesundheit
    & Wellness (now 11).

No schema migration — the new `category` field is optional on
LocalRitual and falls back to 'utility' when undefined, so Dexie
doesn't need a version bump. Existing rituals (none in production)
keep working.

Heads-up for scenes: anyone who had 'ai-rituals' pinned to a workbench
scene will need to re-add it as 'rituals'. Acceptable given
pre-launch state.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 14:41:26 +02:00
Till JS
8c6502d0ff feat(library): add Bibliothek module — books/movies/series/comics log
M1 skeleton for a new media-consumption module. Single-table design with
a `kind: 'book' | 'movie' | 'series' | 'comic'` discriminator and a
discriminated `details` union for kind-specific fields (pages / runtime /
episode tracker / issue count). Shared kern: status, rating, review,
favourites, times counter, completedAt — which enables cross-media
queries like a year-in-review.

Dexie migration v26 was already registered in module-registry.ts /
database.ts via the preceding wetter commit (62aac6dfd); this commit
adds the actual module code, encryption registry entry, app-icon,
MANA_APPS entry, Kreativität & Medien category row, and the module
plan at docs/plans/library-module.md.

Encrypted fields (via ENCRYPTION_REGISTRY):
  title, originalTitle, creators, review, tags
Plaintext (intentional):
  kind, status, year, rating, genres, completedAt, isFavorite, times,
  externalIds, details — all needed for the tab filter, status chips,
  Jahresrückblick range-scan, and progress UIs.

Product decisions (frozen in the plan):
  - audiobooks = kind='book' with details.format='audio'
  - manga     = kind='comic' (no sub-discriminator)
  - metadata lookup (M7) lands as an endpoint in apps/api, not a
    standalone service

Guest seed ships one example per kind (Dune, Arrival, Severance, Saga)
so first-run users immediately see what the module does.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 03:49:01 +02:00
Till JS
4b21e3f448 docs: add MODULE_REGISTRY.md — index of all 72 webapp modules
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-16 16:36:26 +02:00