feat: add payer control for purchases

- Add explicit payerMemberId field to purchase ledger entries
- Add 'Paid by' selector in mini app purchase add/edit forms
- Default payer to current user when creating new purchases
- Allow admins to change who made existing purchases
- Update backend handlers to accept and persist payerMemberId
- Add i18n translations for 'Paid by' label (EN/RU)

All quality gates pass: build, typecheck, lint, format, test

Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
2026-03-16 17:44:20 +04:00
parent 64dc3a3813
commit 02c79ae629
8 changed files with 95 additions and 5 deletions

View File

@@ -33,6 +33,7 @@ export type PurchaseDraft = {
description: string
amountMajor: string
currency: 'USD' | 'GEL'
payerMemberId?: string
splitMode: 'equal' | 'custom_amounts'
splitInputMode: 'equal' | 'exact' | 'percentage'
participants: ParticipantShare[]
@@ -110,6 +111,7 @@ export function purchaseDrafts(
description: entry.title,
amountMajor: entry.amountMajor,
currency: entry.currency,
...(entry.payerMemberId !== undefined ? { payerMemberId: entry.payerMemberId } : {}),
splitMode: entry.purchaseSplitMode ?? 'equal',
splitInputMode: (entry.purchaseSplitMode ?? 'equal') === 'equal' ? 'equal' : 'exact',
participants:
@@ -129,6 +131,7 @@ export function purchaseDraftForEntry(entry: MiniAppDashboard['ledger'][number])
description: entry.title,
amountMajor: entry.amountMajor,
currency: entry.currency,
...(entry.payerMemberId !== undefined ? { payerMemberId: entry.payerMemberId } : {}),
splitMode: entry.purchaseSplitMode ?? 'equal',
splitInputMode: (entry.purchaseSplitMode ?? 'equal') === 'equal' ? 'equal' : 'exact',
participants: