Private
Public Access
1
0
Files
Catherine Renelle 3e0446c9be 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>
2026-02-08 15:08:23 -05:00

160 lines
11 KiB
Plaintext

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{827E0CD3-B72D-47B6-A68D-7590B98EB39B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Core", "src\Purrse.Core\Purrse.Core.csproj", "{A417D901-AA67-4B72-93D0-93D99F246AED}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Data", "src\Purrse.Data\Purrse.Data.csproj", "{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Api", "src\Purrse.Api\Purrse.Api.csproj", "{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Plugins.Abstractions", "src\Purrse.Plugins.Abstractions\Purrse.Plugins.Abstractions.csproj", "{A9444014-87F9-4FDB-8326-0C77049A14A1}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Plugins.OFX", "src\Purrse.Plugins.OFX\Purrse.Plugins.OFX.csproj", "{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Plugins.CSV", "src\Purrse.Plugins.CSV\Purrse.Plugins.CSV.csproj", "{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Plugins.QIF", "src\Purrse.Plugins.QIF\Purrse.Plugins.QIF.csproj", "{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Tests", "src\Purrse.Tests\Purrse.Tests.csproj", "{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Purrse.Plugins.BankSync", "src\Purrse.Plugins.BankSync\Purrse.Plugins.BankSync.csproj", "{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{A417D901-AA67-4B72-93D0-93D99F246AED}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Debug|x64.ActiveCfg = Debug|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Debug|x64.Build.0 = Debug|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Debug|x86.ActiveCfg = Debug|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Debug|x86.Build.0 = Debug|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Release|Any CPU.Build.0 = Release|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Release|x64.ActiveCfg = Release|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Release|x64.Build.0 = Release|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Release|x86.ActiveCfg = Release|Any CPU
{A417D901-AA67-4B72-93D0-93D99F246AED}.Release|x86.Build.0 = Release|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Debug|x64.ActiveCfg = Debug|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Debug|x64.Build.0 = Debug|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Debug|x86.ActiveCfg = Debug|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Debug|x86.Build.0 = Debug|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Release|Any CPU.Build.0 = Release|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Release|x64.ActiveCfg = Release|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Release|x64.Build.0 = Release|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Release|x86.ActiveCfg = Release|Any CPU
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7}.Release|x86.Build.0 = Release|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Debug|x64.ActiveCfg = Debug|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Debug|x64.Build.0 = Debug|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Debug|x86.ActiveCfg = Debug|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Debug|x86.Build.0 = Debug|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Release|Any CPU.Build.0 = Release|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Release|x64.ActiveCfg = Release|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Release|x64.Build.0 = Release|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Release|x86.ActiveCfg = Release|Any CPU
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84}.Release|x86.Build.0 = Release|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Debug|x64.ActiveCfg = Debug|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Debug|x64.Build.0 = Debug|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Debug|x86.ActiveCfg = Debug|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Debug|x86.Build.0 = Debug|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Release|Any CPU.Build.0 = Release|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Release|x64.ActiveCfg = Release|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Release|x64.Build.0 = Release|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Release|x86.ActiveCfg = Release|Any CPU
{A9444014-87F9-4FDB-8326-0C77049A14A1}.Release|x86.Build.0 = Release|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Debug|x64.ActiveCfg = Debug|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Debug|x64.Build.0 = Debug|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Debug|x86.ActiveCfg = Debug|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Debug|x86.Build.0 = Debug|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Release|Any CPU.Build.0 = Release|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Release|x64.ActiveCfg = Release|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Release|x64.Build.0 = Release|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Release|x86.ActiveCfg = Release|Any CPU
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE}.Release|x86.Build.0 = Release|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Debug|x64.ActiveCfg = Debug|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Debug|x64.Build.0 = Debug|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Debug|x86.ActiveCfg = Debug|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Debug|x86.Build.0 = Debug|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Release|Any CPU.Build.0 = Release|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Release|x64.ActiveCfg = Release|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Release|x64.Build.0 = Release|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Release|x86.ActiveCfg = Release|Any CPU
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3}.Release|x86.Build.0 = Release|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Debug|x64.ActiveCfg = Debug|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Debug|x64.Build.0 = Debug|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Debug|x86.ActiveCfg = Debug|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Debug|x86.Build.0 = Debug|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Release|Any CPU.Build.0 = Release|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Release|x64.ActiveCfg = Release|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Release|x64.Build.0 = Release|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Release|x86.ActiveCfg = Release|Any CPU
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B}.Release|x86.Build.0 = Release|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Debug|Any CPU.Build.0 = Debug|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Debug|x64.ActiveCfg = Debug|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Debug|x64.Build.0 = Debug|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Debug|x86.ActiveCfg = Debug|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Debug|x86.Build.0 = Debug|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Release|Any CPU.Build.0 = Release|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Release|x64.ActiveCfg = Release|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Release|x64.Build.0 = Release|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Release|x86.ActiveCfg = Release|Any CPU
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49}.Release|x86.Build.0 = Release|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Debug|x64.ActiveCfg = Debug|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Debug|x64.Build.0 = Debug|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Debug|x86.ActiveCfg = Debug|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Debug|x86.Build.0 = Debug|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Release|Any CPU.Build.0 = Release|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Release|x64.ActiveCfg = Release|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Release|x64.Build.0 = Release|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Release|x86.ActiveCfg = Release|Any CPU
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{A417D901-AA67-4B72-93D0-93D99F246AED} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{B9FD024E-D5E9-4B61-A007-6478DBF82DD7} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{1C11BED2-5D3E-45F2-A6E7-D48131AE8A84} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{A9444014-87F9-4FDB-8326-0C77049A14A1} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{A252FD29-DCB8-43F9-B25B-ABD57CFE1BBE} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{C93480E6-AEF4-4665-9F8C-032F36DC6AD3} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{3CA0D3FF-F269-42D8-A8D4-AB77A34CBF0B} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{8A090385-C08B-4BCB-A1C9-61C2D23E9C49} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
{19EC4D6B-54CF-414C-B7C8-569C0A488F8A} = {827E0CD3-B72D-47B6-A68D-7590B98EB39B}
EndGlobalSection
EndGlobal