import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, ManyToOne, JoinColumn, } from 'typeorm'; import { CommissionSchemeEntity } from './commission-scheme.entity'; import { CommissionAssignmentEntity } from './commission-assignment.entity'; import { CommissionPeriodEntity } from './commission-period.entity'; export enum EntryStatus { PENDING = 'pending', APPROVED = 'approved', REJECTED = 'rejected', PAID = 'paid', CANCELLED = 'cancelled', } @Entity({ schema: 'commissions', name: 'entries' }) export class CommissionEntryEntity { @PrimaryGeneratedColumn('uuid') id: string; @Column({ name: 'tenant_id', type: 'uuid' }) tenantId: string; @Column({ name: 'user_id', type: 'uuid' }) userId: string; @Column({ name: 'scheme_id', type: 'uuid' }) schemeId: string; @Column({ name: 'assignment_id', type: 'uuid', nullable: true }) assignmentId: string; @Column({ name: 'reference_type', length: 50 }) referenceType: string; @Column({ name: 'reference_id', type: 'uuid' }) referenceId: string; @Column({ name: 'base_amount', type: 'decimal', precision: 15, scale: 2 }) baseAmount: number; @Column({ name: 'rate_applied', type: 'decimal', precision: 5, scale: 2 }) rateApplied: number; @Column({ name: 'commission_amount', type: 'decimal', precision: 15, scale: 2 }) commissionAmount: number; @Column({ length: 3, default: 'USD' }) currency: string; @Column({ type: 'enum', enum: EntryStatus, enumName: 'entry_status', default: EntryStatus.PENDING, }) status: EntryStatus; @Column({ name: 'period_id', type: 'uuid', nullable: true }) periodId: string; @Column({ name: 'paid_at', type: 'timestamptz', nullable: true }) paidAt: Date; @Column({ name: 'payment_reference', length: 255, nullable: true }) paymentReference: string; @Column({ type: 'text', nullable: true }) notes: string; @Column({ type: 'jsonb', default: {} }) metadata: Record; @CreateDateColumn({ name: 'created_at', type: 'timestamptz' }) createdAt: Date; @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' }) updatedAt: Date; @Column({ name: 'approved_by', type: 'uuid', nullable: true }) approvedBy: string; @Column({ name: 'approved_at', type: 'timestamptz', nullable: true }) approvedAt: Date; @ManyToOne(() => CommissionSchemeEntity, (scheme) => scheme.entries) @JoinColumn({ name: 'scheme_id' }) scheme: CommissionSchemeEntity; @ManyToOne(() => CommissionAssignmentEntity) @JoinColumn({ name: 'assignment_id' }) assignment: CommissionAssignmentEntity; @ManyToOne(() => CommissionPeriodEntity, (period) => period.entries) @JoinColumn({ name: 'period_id' }) period: CommissionPeriodEntity; }