K2: card purchases on Android (Room 2, card cycle, :feature:cards S-23 to S-27)

- :core:model model/Cards.kt per SPEC §14.2.4 "Changes in v0.35"; ContractTest covers the card wire values.
- :domain matchCardPurchase (§14.5.8), passing match_card_purchase.json (17 cases) in VectorTest.
- :data Room version 2 (card_connections, card_purchases, card_sync_state, MIGRATION_1_2 with its test,
  2.json exported); DTOs for E-36 to E-44 round-tripping K1's examples; the card cycle (E-44 push of
  pending link changes, E-40 pull) after each household cycle and after refresh; CardRepositoryImpl with
  CP-9 prefill, CP-10 matches, offline-first link/unlink/ignore; a local expense delete unlinks.
- :core:fakes FakeCardRepository and fakes/cards scenarios for every state of S-23 to S-27.
- :feature:cards S-23 (sheet and "Välj en annan utgift"), S-24, S-25 (Custom Tab, E-38 every 2 s while
  resumed, return link), S-26 (disconnect dialog), S-27, CardArt with the SJ Prio picture and the drawn
  fallback; 135 goldens and state-holder tests.
- :feature:expense S-7 cardPurchaseId prefill and link on save, S-8 "Från kortköp" line;
  :feature:account S-5 "Från kortköp"; :feature:settings S-13 "Anslut kort".
- :core:design KvittDestination.Cards with credit_card and nav_cards (four destinations, D-172); the
  bar's labels shrink to fit at large font scales. :app routes, kvitt://cards/connected, bindings.
- docs/ux/strings.csv: the card keys of §13.3 plus K2's additions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQd3pEP9UeN2uifbHknQ7B
This commit is contained in:
2026-10-24 16:49:47 +02:00
parent 07df30d04d
commit a8f91ee6ea
391 changed files with 6889 additions and 54 deletions
+77
View File
@@ -37,6 +37,7 @@ common_partner,Partner,Partner,"module=core:design; role word for the member: S-
common_invite_partner,Invite partner,Bjud in partner,"module=core:design; S-3 button, S-13 row, S-21 title"
common_date_spoken,Date: %1$s,Datum: %1$s,module=core:design; TalkBack of the date chip in S-7 and S-9
nav_home,Home,Översikt,module=core:design
nav_cards,Card purchases,Kortköp,"module=core:design; bottom destination (D-172), between nav_home and nav_analytics; K2"
nav_analytics,Analytics,Statistik,module=core:design
nav_settings,Settings,Inställningar,module=core:design
nav_label,Navigation,Navigering,module=core:design; TalkBack of the navigation bar
@@ -588,3 +589,79 @@ settings_recurring_summary_none,None,Inga,module=settings; S-13 recurring row su
settings_expanded,expanded,utfälld,module=settings; TalkBack state of the archived section (design-spec §3.11 CollapsibleRow); M7f
settings_collapsed,collapsed,hopfälld,module=settings; TalkBack state of the archived section; M7f
settings_partner_missing,Partner has not joined,Partner saknas,module=settings; S-13 partner row before the partner joins; M7f
settings_cards,Connect card,Anslut kort,"module=settings; S-13 row (D-172), opens S-24; K2"
settings_cards_connected,Connected · valid until %1$s,Ansluten · giltig till %1$s,module=settings; S-13 row subtitle; %1$s the consent's end date (§9.8 list form); K2
settings_cards_none,Read your card purchases,Läs in dina kortköp,module=settings; S-13 row subtitle without a connection; K2
settings_cards_expired,Ended,Har upphört,module=settings; S-13 row subtitle of an expired connection (CP-6); K2 addition; K2
account_from_card_purchases,From card purchases,Från kortköp,"module=account; S-5 overflow item while the viewer has a connection (AC-22.9), opens S-27; K2"
expense_detail_from_card,"From card purchase: %1$s, %2$s","Från kortköp: %1$s, %2$s","module=expense; S-8, the card holder only (AC-22.10); %1$s merchant, %2$s purchase date (list form); K2"
expense_detail_unlink_card,Remove link,Ta bort koppling,module=expense; S-8 action on the card line (CP-9); K2
cards_title,Card purchases,Kortköp,module=cards; S-23 app bar; K2
cards_private_note,Only you see your card purchases,Bara du ser dina kortköp,module=cards; S-23 header (CP-11); K2
cards_updated,Updated %1$s,Uppdaterad %1$s,module=cards; S-23 header; %1$s §9.8 relative time; K2
cards_refresh,Refresh,Uppdatera,"module=cards; S-23 header button (E-42, online only); K2"
cards_refreshing,Refreshing…,Uppdaterar…,module=cards; S-23 header button while E-42 runs; K2
cards_filter_to_handle,To handle,Att hantera,module=cards; S-23 filter chip (default); K2
cards_filter_linked,Linked,Kopplade,module=cards; S-23 filter chip; K2
cards_filter_ignored,Ignored,Ignorerade,module=cards; S-23 filter chip; K2
cards_filter_all,All,Alla,module=cards; S-23 filter chip; K2
cards_pending,Pending,Preliminär,module=cards; S-23 row badge and sheet status of a pending purchase; K2
cards_booked,Booked,Bokförd,module=cards; S-23 sheet status of a booked purchase; K2
cards_credit,Deposit,Insättning,"module=cards; S-23 badge of a credit (only under Alla, CP-8); K2"
cards_foreign,Foreign currency,Utländsk valuta,module=cards; S-23 badge of a foreign-currency purchase (CP-7); K2
cards_foreign_amount,%1$s %2$s,%1$s %2$s,"module=cards; S-23 foreign amount; %1$s the bank's decimal amount, %2$s ISO 4217 currency; K2 addition; K2"
cards_match_one,Link to %1$s,Koppla till %1$s,module=cards; S-23 row chip with exactly one match (CP-10); %1$s the expense's description; K2
cards_match_many:one,%1$d possible expense,%1$d möjlig utgift,module=cards; plural one; S-23 row chip with two or three matches; K2
cards_match_many:other,%1$d possible expenses,%1$d möjliga utgifter,module=cards; plural other; K2
cards_linked_to,Linked to %1$s · %2$s,Kopplad till %1$s · %2$s,"module=cards; S-23 row under Kopplade; %1$s description, %2$s account; K2"
cards_empty_title,Connect your card,Anslut ditt kort,module=cards; S-23 empty state (no connection); K2
cards_empty_body,See your purchases here and turn them into expenses in a few taps. Only you see them.,Se dina köp här och gör om dem till utgifter med några tryck. Bara du ser dem.,module=cards; S-23 empty state; K2
cards_connect,Connect card,Anslut kort,"module=cards; S-23 empty state button, opens S-24; K2"
cards_first_fetch,Fetching your purchases…,Hämtar dina köp…,module=cards; S-23 while the first fetch runs; K2
cards_nothing_to_handle,Nothing to handle,Inget att hantera,module=cards; S-23 empty Att hantera; K2
cards_nothing_to_handle_body,New card purchases show up here.,Nya kortköp visas här.,module=cards; S-23 empty Att hantera; K2
cards_filter_empty,No purchases here,Inga köp här,"module=cards; S-23 empty Kopplade, Ignorerade, Alla; K2"
cards_expiring,Your card connection ends on %1$s,Kortanslutningen upphör %1$s,module=cards; S-23 banner from 14 days before valid_until (CP-6); %1$s list date; K2
cards_expired,Your card connection has ended,Kortanslutningen har upphört,module=cards; S-23 banner (CP-6); K2
cards_renew,Renew with BankID,Förnya med BankID,"module=cards; S-23 banners, S-25 renewal, S-26; K2"
cards_fetch_failed,Could not fetch purchases. Last updated %1$s,Kunde inte hämta köp. Senast uppdaterad %1$s,module=cards; S-23 banner (CP-14); %1$s §9.8 relative time; K2
cards_sheet_create,Create expense,Skapa utgift,"module=cards; S-23 sheet, opens S-7 prefilled (CP-9); K2"
cards_sheet_matches,Link to an existing expense,Koppla till befintlig utgift,module=cards; S-23 sheet section (CP-10); K2
cards_sheet_no_matches,No expense with the same amount around this date,Ingen utgift med samma belopp runt det här datumet,module=cards; S-23 sheet without matches; K2
cards_sheet_other,Choose another expense,Välj en annan utgift,"module=cards; S-23 sheet, opens the second sheet (CP-10); K2"
cards_sheet_ignore,Ignore,Ignorera,module=cards; S-23 sheet; K2
cards_sheet_unignore,Stop ignoring,Sluta ignorera,module=cards; S-23 sheet of an ignored purchase; K2
cards_sheet_unlink,Remove link,Ta bort koppling,module=cards; S-23 sheet of a linked purchase; K2
cards_sheet_open_expense,Open expense,Öppna utgift,"module=cards; S-23 sheet of a linked purchase, opens S-8; K2"
cards_sheet_credit_note,Deposits and refunds are not expenses. Change the original expense by hand if needed.,Insättningar och återbetalningar är inga utgifter. Ändra den ursprungliga utgiften för hand vid behov.,module=cards; S-23 sheet of a credit (CP-8); K2
cards_sheet_foreign_note,The amount is in %1$s: type the amount in kronor.,Beloppet är i %1$s: skriv beloppet i kronor.,module=cards; S-23 sheet above Skapa utgift; %1$s ISO 4217 currency; K2
cards_snackbar_linked,Linked,Kopplad,module=cards; S-23 snackbar with common_undo; K2
cards_snackbar_ignored,Ignored,Ignorerad,module=cards; S-23 snackbar with common_undo; K2
cards_connection_settings,Card connection,Kortanslutning,"module=cards; TalkBack click label of S-23's header card, which opens S-26; K2 addition; K2"
cards_connect_title,Connect card,Anslut kort,module=cards; S-24 app bar; K2
cards_connect_intro,Choose your card. Kvitt reads your purchases but can never pay or move money.,Välj ditt kort. Kvitt läser dina köp men kan aldrig betala eller flytta pengar.,module=cards; S-24 intro; K2
cards_connect_offline_body,The list of cards comes from the server. Connect the phone to the internet.,Listan över kort hämtas från servern. Anslut telefonen till internet.,module=cards; S-24 offline banner body under common_needs_connection; K2 addition; K2
cards_provider_connected,Connected · valid until %1$s,Ansluten · giltig till %1$s,module=cards; S-24 tile of a connected card; %1$s list date; K2
cards_provider_unavailable,Not set up on the server,Inte konfigurerat på servern,module=cards; S-24 tile of a provider without an application (CP-13); K2
cards_history_label,Fetch purchases from the last,Hämta köp från de senaste,module=cards; S-25 history choice (CP-3); K2
cards_history_days:one,%1$d day,%1$d dag,module=cards; plural one; S-25 and S-26 options; K2
cards_history_days:other,%1$d days,%1$d dagar,module=cards; plural other; K2
cards_history_note,You can shorten this later. A longer period needs BankID again.,Du kan korta perioden senare. En längre period kräver BankID igen.,module=cards; S-25 under the choice; K2
cards_connect_bankid,Connect with BankID,Anslut med BankID,module=cards; S-25 button (E-37); K2
cards_waiting,Waiting for BankID…,Väntar på BankID…,module=cards; S-25 while polling E-38; K2
cards_waiting_body,"Finish in the browser and in BankID, then come back here.",Slutför i webbläsaren och i BankID och kom sedan tillbaka hit.,module=cards; S-25 waiting; K2
cards_connected,Card connected,Kortet är anslutet,"module=cards; S-25 connected, then S-23; K2"
cards_connect_failed,The card could not be connected,Det gick inte att ansluta kortet,"module=cards; S-25 failed, with common_retry; K2"
cards_connect_timeout,The connection attempt took too long,Anslutningsförsöket tog för lång tid,"module=cards; S-25 attempt expired, with common_retry; K2"
cards_status_active,Connected,Ansluten,module=cards; S-26 status line; K2
cards_status_expired,Ended,Har upphört,module=cards; S-26 status line; K2
cards_valid_until,Valid until %1$s,Giltig till %1$s,module=cards; S-26; %1$s detail date; K2
cards_last_updated,Last updated %1$s,Senast uppdaterad %1$s,module=cards; S-26; %1$s §9.8 relative time; K2
cards_history_setting,History when connecting,Historik vid anslutning,"module=cards; S-26 (E-41, shorter only); K2"
cards_history_longer_note,A longer period needs BankID again,En längre period kräver BankID igen,module=cards; S-26 under the history setting; K2
cards_disconnect,Disconnect,Koppla från,module=cards; S-26 button and dialog confirm (CP-12); K2
cards_disconnect_title,Disconnect %1$s?,Koppla från %1$s?,module=cards; S-26 dialog title; %1$s card name; K2
cards_disconnect_body,Purchases you have not linked or ignored are deleted. Expenses you created stay.,Köp som du inte har kopplat eller ignorerat raderas. Utgifter du har skapat finns kvar.,module=cards; S-26 dialog body; K2
cards_disconnect_erase_all,Also delete linked and ignored purchases,Radera även kopplade och ignorerade köp,module=cards; S-26 dialog checkbox (erase_handled); K2
cards_pick_title,From card purchases,Från kortköp,"module=cards; S-27 app bar, the account's name as subtitle; K2"
cards_pick_empty,No card purchases to handle,Inga kortköp att hantera,module=cards; S-27 empty; K2
Can't render this file because it contains an unexpected character in line 157 and column 79.