From 23d73736c9b6c20b966550af68430018875ba602 Mon Sep 17 00:00:00 2001 From: Catherine Renelle <32781029+catrenelle@users.noreply.github.com> Date: Sun, 8 Feb 2026 12:14:43 -0500 Subject: [PATCH] Implement Phase 3: financial features frontend (budgets, scheduled transactions, loans) Add API service files and replace stub views with full implementations: - Budgets: month navigator, budget items table with progress bars, create/edit/delete - Scheduled Transactions: data table with skip/post-now actions, add/edit dialog - Loans: loan list, detail view with amortization schedule, payoff scenario calculator Co-Authored-By: Claude Opus 4.6 --- frontend/src/services/budgets.ts | 19 + frontend/src/services/loans.ts | 16 + frontend/src/services/scheduled.ts | 25 ++ frontend/src/views/budgets/BudgetsView.vue | 319 +++++++++++++- frontend/src/views/loans/LoansView.vue | 401 +++++++++++++++++- .../src/views/scheduled/ScheduledView.vue | 298 ++++++++++++- 6 files changed, 1062 insertions(+), 16 deletions(-) create mode 100644 frontend/src/services/budgets.ts create mode 100644 frontend/src/services/loans.ts create mode 100644 frontend/src/services/scheduled.ts diff --git a/frontend/src/services/budgets.ts b/frontend/src/services/budgets.ts new file mode 100644 index 0000000..3a9adb6 --- /dev/null +++ b/frontend/src/services/budgets.ts @@ -0,0 +1,19 @@ +import api from './api' +import type { Budget, BudgetItem } from '@/types' + +export const budgetsApi = { + getByMonth: (year: number, month: number) => + api.get(`/budgets/${year}/${month}`), + + create: (data: { year: number; month: number; notes?: string; items: { categoryId: string; budgetedAmount: number }[] }) => + api.post('/budgets', data), + + update: (id: string, data: { notes?: string; items: { categoryId: string; budgetedAmount: number }[] }) => + api.put(`/budgets/${id}`, data), + + delete: (id: string) => + api.delete(`/budgets/${id}`), + + getActuals: (id: string) => + api.get(`/budgets/${id}/actual`), +} diff --git a/frontend/src/services/loans.ts b/frontend/src/services/loans.ts new file mode 100644 index 0000000..6058adc --- /dev/null +++ b/frontend/src/services/loans.ts @@ -0,0 +1,16 @@ +import api from './api' +import type { LoanDetail, PayoffScenario } from '@/types' + +export const loansApi = { + getLoanDetail: (accountId: string) => + api.get(`/loans/${accountId}/amortization`), + + createLoanDetail: (accountId: string, data: any) => + api.post(`/loans/${accountId}`, data), + + updateLoanDetail: (accountId: string, data: any) => + api.put(`/loans/${accountId}`, data), + + calculatePayoff: (accountId: string, data: { extraMonthlyPayment?: number; lumpSumPayment?: number; lumpSumDate?: string }) => + api.post(`/loans/${accountId}/payoff-scenario`, data), +} diff --git a/frontend/src/services/scheduled.ts b/frontend/src/services/scheduled.ts new file mode 100644 index 0000000..d784cc6 --- /dev/null +++ b/frontend/src/services/scheduled.ts @@ -0,0 +1,25 @@ +import api from './api' +import type { ScheduledTransaction } from '@/types' + +export const scheduledApi = { + getAll: () => + api.get('/scheduled-transactions'), + + getById: (id: string) => + api.get(`/scheduled-transactions/${id}`), + + create: (data: any) => + api.post('/scheduled-transactions', data), + + update: (id: string, data: any) => + api.put(`/scheduled-transactions/${id}`, data), + + delete: (id: string) => + api.delete(`/scheduled-transactions/${id}`), + + skip: (id: string) => + api.post(`/scheduled-transactions/${id}/skip`), + + postNow: (id: string) => + api.post(`/scheduled-transactions/${id}/post-now`), +} diff --git a/frontend/src/views/budgets/BudgetsView.vue b/frontend/src/views/budgets/BudgetsView.vue index de4ca5b..0270917 100644 --- a/frontend/src/views/budgets/BudgetsView.vue +++ b/frontend/src/views/budgets/BudgetsView.vue @@ -1,28 +1,325 @@ diff --git a/frontend/src/views/loans/LoansView.vue b/frontend/src/views/loans/LoansView.vue index 98a8237..f9f1fec 100644 --- a/frontend/src/views/loans/LoansView.vue +++ b/frontend/src/views/loans/LoansView.vue @@ -1,10 +1,405 @@ diff --git a/frontend/src/views/scheduled/ScheduledView.vue b/frontend/src/views/scheduled/ScheduledView.vue index 6e230b8..fd1b1fb 100644 --- a/frontend/src/views/scheduled/ScheduledView.vue +++ b/frontend/src/views/scheduled/ScheduledView.vue @@ -1,6 +1,300 @@ + +