- Add hierarchical roles: SuperUser Admin (is_superadmin flag), Tenant Admin, Tenant User with separate /admin route and admin panel - Add Assessment Groups module for property type-based assessment rates (SFHs, Condos, Estate Lots with different regular/special rates) - Enhance Chart of Accounts: initial balance on create (with journal entry), archive/restore accounts, edit all fields including account number & fund type - Add Budget CSV import with downloadable template and account mapping - Add Capital Projects Kanban board with drag-and-drop between year columns, table/kanban view toggle, and PDF export via browser print - Update seed data with assessment groups, second test user, superadmin flag - Create repeatable reseed.sh script for clean database population - Fix AgingReportPage Mantine v7 Table prop compatibility Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
61 lines
1.5 KiB
TypeScript
61 lines
1.5 KiB
TypeScript
import {
|
|
Entity,
|
|
PrimaryGeneratedColumn,
|
|
Column,
|
|
CreateDateColumn,
|
|
UpdateDateColumn,
|
|
OneToMany,
|
|
} from 'typeorm';
|
|
import { UserOrganization } from '../../organizations/entities/user-organization.entity';
|
|
|
|
@Entity({ schema: 'shared', name: 'users' })
|
|
export class User {
|
|
@PrimaryGeneratedColumn('uuid')
|
|
id: string;
|
|
|
|
@Column({ unique: true })
|
|
email: string;
|
|
|
|
@Column({ name: 'password_hash', nullable: true })
|
|
passwordHash: string;
|
|
|
|
@Column({ name: 'first_name', nullable: true })
|
|
firstName: string;
|
|
|
|
@Column({ name: 'last_name', nullable: true })
|
|
lastName: string;
|
|
|
|
@Column({ nullable: true })
|
|
phone: string;
|
|
|
|
@Column({ name: 'is_email_verified', default: false })
|
|
isEmailVerified: boolean;
|
|
|
|
@Column({ name: 'mfa_enabled', default: false })
|
|
mfaEnabled: boolean;
|
|
|
|
@Column({ name: 'mfa_secret', nullable: true })
|
|
mfaSecret: string;
|
|
|
|
@Column({ name: 'oauth_provider', nullable: true })
|
|
oauthProvider: string;
|
|
|
|
@Column({ name: 'oauth_provider_id', nullable: true })
|
|
oauthProviderId: string;
|
|
|
|
@Column({ name: 'is_superadmin', default: false })
|
|
isSuperadmin: boolean;
|
|
|
|
@Column({ name: 'last_login_at', type: 'timestamptz', nullable: true })
|
|
lastLoginAt: Date;
|
|
|
|
@CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
|
|
createdAt: Date;
|
|
|
|
@UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
|
|
updatedAt: Date;
|
|
|
|
@OneToMany(() => UserOrganization, (uo) => uo.user)
|
|
userOrganizations: UserOrganization[];
|
|
}
|