{entry.actorDisplayName ?? copy().ledgerActorFallback}
@@ -935,7 +937,7 @@ function App() {{entry.actorDisplayName ?? copy().ledgerActorFallback}
@@ -1564,7 +1566,7 @@ function App() {{entry.actorDisplayName ?? copy().ledgerActorFallback}
diff --git a/apps/miniapp/src/index.css b/apps/miniapp/src/index.css index e29ed1e..48eefad 100644 --- a/apps/miniapp/src/index.css +++ b/apps/miniapp/src/index.css @@ -252,9 +252,9 @@ button { .balance-item header, .ledger-item header { - display: flex; - align-items: baseline; - justify-content: space-between; + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: start; gap: 12px; margin-bottom: 10px; } @@ -262,6 +262,7 @@ button { .balance-item strong, .ledger-item strong { font-size: 1rem; + overflow-wrap: anywhere; } .balance-item p, @@ -298,7 +299,7 @@ button { .settings-grid { display: grid; - grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-columns: minmax(0, 1fr); gap: 12px; margin-top: 12px; } @@ -362,10 +363,16 @@ button { } .settings-grid { - grid-template-columns: repeat(3, minmax(0, 1fr)); + grid-template-columns: repeat(2, minmax(0, 1fr)); } .panel--wide { grid-column: 1 / -1; } } + +@media (min-width: 980px) { + .settings-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} diff --git a/apps/miniapp/src/miniapp-api.ts b/apps/miniapp/src/miniapp-api.ts index 59d3737..18755bb 100644 --- a/apps/miniapp/src/miniapp-api.ts +++ b/apps/miniapp/src/miniapp-api.ts @@ -81,6 +81,7 @@ export interface MiniAppDashboard { kind: 'purchase' | 'utility' title: string amountMajor: string + currency: 'USD' | 'GEL' actorDisplayName: string | null occurredAt: string | null }[] diff --git a/packages/adapters-db/src/finance-repository.ts b/packages/adapters-db/src/finance-repository.ts index d1822d8..f4ed1ad 100644 --- a/packages/adapters-db/src/finance-repository.ts +++ b/packages/adapters-db/src/finance-repository.ts @@ -283,6 +283,7 @@ export function createDbFinanceRepository( id: schema.purchaseMessages.id, payerMemberId: schema.purchaseMessages.senderMemberId, amountMinor: schema.purchaseMessages.parsedAmountMinor, + currency: schema.purchaseMessages.parsedCurrency, description: schema.purchaseMessages.parsedItemDescription, occurredAt: schema.purchaseMessages.messageSentAt }) @@ -292,6 +293,7 @@ export function createDbFinanceRepository( eq(schema.purchaseMessages.householdId, householdId), isNotNull(schema.purchaseMessages.senderMemberId), isNotNull(schema.purchaseMessages.parsedAmountMinor), + isNotNull(schema.purchaseMessages.parsedCurrency), gte(schema.purchaseMessages.messageSentAt, instantToDate(start)), lt(schema.purchaseMessages.messageSentAt, instantToDate(end)) ) @@ -301,6 +303,7 @@ export function createDbFinanceRepository( id: row.id, payerMemberId: row.payerMemberId!, amountMinor: row.amountMinor!, + currency: toCurrencyCode(row.currency!), description: row.description, occurredAt: instantFromDatabaseValue(row.occurredAt) })) diff --git a/packages/application/src/finance-command-service.test.ts b/packages/application/src/finance-command-service.test.ts index 79a6b5a..39980bd 100644 --- a/packages/application/src/finance-command-service.test.ts +++ b/packages/application/src/finance-command-service.test.ts @@ -247,6 +247,7 @@ describe('createFinanceCommandService', () => { id: 'purchase-1', payerMemberId: 'alice', amountMinor: 3000n, + currency: 'GEL', description: 'Soap', occurredAt: instantFromIso('2026-03-12T11:00:00.000Z') } @@ -259,6 +260,7 @@ describe('createFinanceCommandService', () => { expect(dashboard).not.toBeNull() expect(dashboard?.members.map((line) => line.netDue.amountMinor)).toEqual([39500n, 42500n]) expect(dashboard?.ledger.map((entry) => entry.title)).toEqual(['Soap', 'Electricity']) + expect(dashboard?.ledger.map((entry) => entry.currency)).toEqual(['GEL', 'USD']) expect(statement).toBe( [ 'Statement for 2026-03', diff --git a/packages/application/src/finance-command-service.ts b/packages/application/src/finance-command-service.ts index 542520f..4418abc 100644 --- a/packages/application/src/finance-command-service.ts +++ b/packages/application/src/finance-command-service.ts @@ -72,6 +72,7 @@ export interface FinanceDashboardLedgerEntry { kind: 'purchase' | 'utility' title: string amount: Money + currency: CurrencyCode actorDisplayName: string | null occurredAt: string | null } @@ -182,6 +183,7 @@ async function buildFinanceDashboard( kind: 'utility' as const, title: bill.billName, amount: Money.fromMinor(bill.amountMinor, bill.currency), + currency: bill.currency, actorDisplayName: bill.createdByMemberId ? (memberNameById.get(bill.createdByMemberId) ?? null) : null, @@ -191,7 +193,8 @@ async function buildFinanceDashboard( id: purchase.id, kind: 'purchase' as const, title: purchase.description ?? 'Shared purchase', - amount: Money.fromMinor(purchase.amountMinor, rentRule.currency), + amount: Money.fromMinor(purchase.amountMinor, purchase.currency), + currency: purchase.currency, actorDisplayName: memberNameById.get(purchase.payerMemberId) ?? null, occurredAt: purchase.occurredAt?.toString() ?? null })) diff --git a/packages/ports/src/finance.ts b/packages/ports/src/finance.ts index 4f4e9a9..594fb84 100644 --- a/packages/ports/src/finance.ts +++ b/packages/ports/src/finance.ts @@ -23,6 +23,7 @@ export interface FinanceParsedPurchaseRecord { id: string payerMemberId: string amountMinor: bigint + currency: CurrencyCode description: string | null occurredAt: Instant | null }