Private
Public Access
1
0

Implement Phase 6: automated bank sync (Plaid + SimpleFIN) & settings

Add automated transaction syncing via Plaid and SimpleFIN providers,
a Settings page for managing connections and account mappings,
background scheduled syncing, and sync history logging.

New backend: BankSync plugin project with PlaidSyncProvider and
SimpleFinSyncProvider, SyncConnection/LinkedAccount/SyncLog models,
AES-256 encryption service, BankSyncService orchestration,
BankSyncBackgroundService (15-min tick), and BankSyncController
(13 endpoints). EF migration creates sync_connections,
linked_accounts, and sync_logs tables.

New frontend: Settings view with 3 tabs (Profile, Bank Connections,
Sync History), bankSync API service, BankSyncComplete SignalR
notifications, and Settings nav item in sidebar + avatar dropdown.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Catherine Renelle
2026-02-08 15:08:23 -05:00
parent eb49147080
commit 3e0446c9be
34 changed files with 3956 additions and 8 deletions
+19 -5
View File
@@ -75,10 +75,18 @@
:class="{ 'bg-blue-lighten-5': !n.read }"
@click="handleNotificationClick(n)"
>
<v-list-item-title>{{ n.data.fileName }}</v-list-item-title>
<v-list-item-subtitle>
{{ n.data.newTransactions }} new, {{ n.data.possibleDuplicates }} duplicates
</v-list-item-subtitle>
<template v-if="n.type === 'FileImportReady'">
<v-list-item-title>{{ (n.data as any).fileName }}</v-list-item-title>
<v-list-item-subtitle>
{{ (n.data as any).newTransactions }} new, {{ (n.data as any).possibleDuplicates }} duplicates
</v-list-item-subtitle>
</template>
<template v-else-if="n.type === 'BankSyncComplete'">
<v-list-item-title>{{ (n.data as any).institutionName }}</v-list-item-title>
<v-list-item-subtitle>
{{ (n.data as any).transactionsImported }} imported, {{ (n.data as any).transactionsSkipped }} skipped
</v-list-item-subtitle>
</template>
</v-list-item>
</template>
</v-list>
@@ -94,6 +102,7 @@
<v-list density="compact">
<v-list-item prepend-icon="mdi-account" :title="authStore.username || 'User'" />
<v-divider />
<v-list-item prepend-icon="mdi-cog" title="Settings" @click="router.push('/settings')" />
<v-list-item prepend-icon="mdi-logout" title="Logout" @click="handleLogout" />
</v-list>
</v-menu>
@@ -140,6 +149,7 @@ const navItems = [
{ title: 'Reports', icon: 'mdi-chart-bar', route: '/reports' },
{ title: 'Investments', icon: 'mdi-finance', route: '/investments' },
{ title: 'Plugins', icon: 'mdi-puzzle', route: '/plugins' },
{ title: 'Settings', icon: 'mdi-cog', route: '/settings' },
]
const currentPageTitle = computed(() => {
@@ -157,7 +167,11 @@ function toggleTheme() {
function handleNotificationClick(n: AppNotification) {
markAsRead(n.id)
router.push('/imports')
if (n.type === 'BankSyncComplete') {
router.push('/settings')
} else {
router.push('/imports')
}
}
function handleLogout() {