template-saas-backend-v2/src/modules/commissions/entities/commission-entry.entity.ts
Adrian Flores Cortes eb6a83daba feat(sales,commissions): Add Sales and Commissions backend modules
Sales Module (SAAS-018):
- Entities: PipelineStage, Lead, Opportunity, Activity
- Services: LeadsService, OpportunitiesService, ActivitiesService, PipelineService, SalesDashboardService
- Controllers: 25 endpoints for leads, opportunities, activities, pipeline, dashboard
- DTOs: Complete CRUD and query DTOs
- Integration with DDL functions: convert_lead_to_opportunity, update_opportunity_stage, calculate_lead_score

Commissions Module (SAAS-020):
- Entities: CommissionScheme, CommissionAssignment, CommissionPeriod, CommissionEntry
- Services: SchemesService, AssignmentsService, EntriesService, PeriodsService, CommissionsDashboardService
- Controllers: 25 endpoints for schemes, assignments, entries, periods, dashboard
- DTOs: Complete CRUD and query DTOs
- Integration with DDL functions: calculate_commission, close_period, get_user_earnings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-24 22:23:02 -06:00

104 lines
2.7 KiB
TypeScript

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<string, any>;
@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;
}