feat: financial year planning — annual budgets, income tracking, household sharing
- Financial year page (/financial-year): year selector, 3 KPI cards (income, fixed costs, actual expenses), income and budget-items tabs with inline CRUD - Revenue accounts as income source: salary-months toggle (12/13) per account - Household support: create household, invite members by email (existing and new users via PendingHouseholdInvite), accept invitations, set roles - Combined household income view across all active members - FinancialYear, YearlyIncome, YearlyBudgetItem, Household, HouseholdMembership models with migrations; household invite email template - Management command to migrate existing accounts/budgets to financial years - FinancialYearService in Angular with full API integration - Dashboard updated: income/fixed-costs read from financial year data, year dropdown synced with available financial years - Sidebar: financial year nav item added - i18n: all keys in DE/EN/FR/IT
This commit is contained in:
@@ -14,6 +14,11 @@ from finance.views import (
|
||||
SessionListView, SessionRevokeView, SessionRevokeAllView,
|
||||
DataExportView, NotificationPrefsView,
|
||||
VerifyEmailView, PasswordResetRequestView, PasswordResetConfirmView,
|
||||
FinancialYearListCreateView, FinancialYearDetailView, FinancialYearCopyView,
|
||||
YearlyIncomeListCreateView, YearlyIncomeDetailView,
|
||||
YearlyBudgetItemListCreateView, YearlyBudgetItemDetailView,
|
||||
HouseholdListCreateView, HouseholdInviteView, HouseholdAcceptView, HouseholdLeaveView,
|
||||
HouseholdSetRoleView, HouseholdRevenueAccountsView,
|
||||
)
|
||||
|
||||
router = DefaultRouter()
|
||||
@@ -52,4 +57,17 @@ urlpatterns = [
|
||||
path('api/notifications/', NotificationsView.as_view()),
|
||||
path('api/calendar/ical-url/', ICalUrlView.as_view()),
|
||||
path('api/calendar/ical/<int:user_id>/<str:token>/', ICalFeedView.as_view()),
|
||||
path('api/financial-years/', FinancialYearListCreateView.as_view()),
|
||||
path('api/financial-years/<int:year>/', FinancialYearDetailView.as_view()),
|
||||
path('api/financial-years/<int:year>/copy-from/<int:source_year>/', FinancialYearCopyView.as_view()),
|
||||
path('api/financial-years/<int:year>/incomes/', YearlyIncomeListCreateView.as_view()),
|
||||
path('api/financial-years/<int:year>/incomes/<int:pk>/', YearlyIncomeDetailView.as_view()),
|
||||
path('api/financial-years/<int:year>/budget-items/', YearlyBudgetItemListCreateView.as_view()),
|
||||
path('api/financial-years/<int:year>/budget-items/<int:pk>/', YearlyBudgetItemDetailView.as_view()),
|
||||
path('api/households/', HouseholdListCreateView.as_view()),
|
||||
path('api/households/<int:pk>/invite/', HouseholdInviteView.as_view()),
|
||||
path('api/households/<int:pk>/accept/', HouseholdAcceptView.as_view()),
|
||||
path('api/households/<int:pk>/leave/', HouseholdLeaveView.as_view()),
|
||||
path('api/households/<int:pk>/members/<int:membership_id>/set-role/', HouseholdSetRoleView.as_view()),
|
||||
path('api/households/<int:pk>/revenue-accounts/', HouseholdRevenueAccountsView.as_view()),
|
||||
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
|
||||
|
||||
Reference in New Issue
Block a user