Rename to HOA LedgerIQ and implement remaining report pages

- Rename app from "HOA Financial Platform" to "HOA LedgerIQ" across all
  frontend pages, backend API docs, package.json files, and seed data
- Add Cash Flow Statement report (GET /reports/cash-flow) with operating
  and reserve fund activity breakdown, beginning/ending cash balances
- Add Aging Report (GET /reports/aging) with per-unit aging buckets
  (current, 1-30, 31-60, 61-90, 90+ days), expandable invoice details
- Add Year-End Package (GET /reports/year-end) with income statement
  summary, collection stats, 1099-NEC vendor report, reserve fund status
- Add Settings page showing org info, user profile, and system details
- Replace all PlaceholderPage references with real implementations
- Bump auth store version to 3 for localStorage migration

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-18 09:09:50 -05:00
parent 243770cea5
commit e0272f9d8a
17 changed files with 1200 additions and 18 deletions

View File

@@ -0,0 +1,131 @@
import {
Title, Text, Card, Stack, Group, SimpleGrid, Badge, ThemeIcon, Divider,
} from '@mantine/core';
import {
IconBuilding, IconUser, IconUsers, IconSettings, IconShieldLock,
IconCalendar,
} from '@tabler/icons-react';
import { useAuthStore } from '../../stores/authStore';
export function SettingsPage() {
const { user, currentOrg } = useAuthStore();
return (
<Stack>
<div>
<Title order={2}>Settings</Title>
<Text c="dimmed" size="sm">Organization and account settings</Text>
</div>
<SimpleGrid cols={{ base: 1, md: 2 }}>
{/* Organization Info */}
<Card withBorder padding="lg">
<Group mb="md">
<ThemeIcon color="blue" variant="light" size={40} radius="md">
<IconBuilding size={24} />
</ThemeIcon>
<div>
<Text fw={600} size="lg">Organization</Text>
<Text c="dimmed" size="sm">Current organization details</Text>
</div>
</Group>
<Stack gap="xs">
<Group justify="space-between">
<Text size="sm" c="dimmed">Name</Text>
<Text size="sm" fw={500}>{currentOrg?.name || 'N/A'}</Text>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">Your Role</Text>
<Badge variant="light">{currentOrg?.role || 'N/A'}</Badge>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">Schema</Text>
<Text size="sm" ff="monospace" c="dimmed">{currentOrg?.schemaName || 'N/A'}</Text>
</Group>
</Stack>
</Card>
{/* User Profile */}
<Card withBorder padding="lg">
<Group mb="md">
<ThemeIcon color="green" variant="light" size={40} radius="md">
<IconUser size={24} />
</ThemeIcon>
<div>
<Text fw={600} size="lg">Your Profile</Text>
<Text c="dimmed" size="sm">Account information</Text>
</div>
</Group>
<Stack gap="xs">
<Group justify="space-between">
<Text size="sm" c="dimmed">Name</Text>
<Text size="sm" fw={500}>{user?.firstName} {user?.lastName}</Text>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">Email</Text>
<Text size="sm" fw={500}>{user?.email}</Text>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">User ID</Text>
<Text size="sm" ff="monospace" c="dimmed">{user?.id?.slice(0, 8)}...</Text>
</Group>
</Stack>
</Card>
{/* Security */}
<Card withBorder padding="lg">
<Group mb="md">
<ThemeIcon color="red" variant="light" size={40} radius="md">
<IconShieldLock size={24} />
</ThemeIcon>
<div>
<Text fw={600} size="lg">Security</Text>
<Text c="dimmed" size="sm">Authentication and access</Text>
</div>
</Group>
<Stack gap="xs">
<Group justify="space-between">
<Text size="sm" c="dimmed">Authentication</Text>
<Badge color="green" variant="light">Active Session</Badge>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">Two-Factor Auth</Text>
<Badge color="gray" variant="light">Not Configured</Badge>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">OAuth Providers</Text>
<Badge color="gray" variant="light">None Linked</Badge>
</Group>
</Stack>
</Card>
{/* System Info */}
<Card withBorder padding="lg">
<Group mb="md">
<ThemeIcon color="violet" variant="light" size={40} radius="md">
<IconSettings size={24} />
</ThemeIcon>
<div>
<Text fw={600} size="lg">System</Text>
<Text c="dimmed" size="sm">Platform information</Text>
</div>
</Group>
<Stack gap="xs">
<Group justify="space-between">
<Text size="sm" c="dimmed">Platform</Text>
<Text size="sm" fw={500}>HOA LedgerIQ</Text>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">Version</Text>
<Badge variant="light">0.1.0 MVP</Badge>
</Group>
<Group justify="space-between">
<Text size="sm" c="dimmed">API</Text>
<Text size="sm" ff="monospace" c="dimmed">/api/docs</Text>
</Group>
</Stack>
</Card>
</SimpleGrid>
</Stack>
);
}