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:
@@ -104,6 +104,7 @@ EMAIL_HOST_USER = os.environ.get('EMAIL_HOST_USER', '')
|
||||
EMAIL_HOST_PASSWORD = os.environ.get('EMAIL_HOST_PASSWORD', '')
|
||||
EMAIL_USE_TLS = os.environ.get('EMAIL_USE_TLS', 'True') == 'True'
|
||||
DEFAULT_FROM_EMAIL = os.environ.get('DEFAULT_FROM_EMAIL', 'noreply@armarium.ch')
|
||||
FRONTEND_URL = os.environ.get('FRONTEND_URL', 'http://localhost:4200')
|
||||
|
||||
LOGGING = {
|
||||
'version': 1,
|
||||
|
||||
@@ -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