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>
104 lines
2.7 KiB
TypeScript
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;
|
|
}
|