import { Column, CreateDateColumn, Entity, Index, JoinColumn, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; import { Salon } from '../../salons/entities/salon.entity'; import { SmsTemplate } from '../../sms-templates/entities/sms-template.entity'; import { User } from '../../users/entities/user.entity'; import { CampaignRunStatus } from '../enums/campaign-run-status.enum'; import { CampaignTrigger } from '../enums/campaign-trigger.enum'; import { CampaignType } from '../enums/campaign-type.enum'; @Entity('campaign_runs') @Index(['salonId', 'createdAt']) @Index(['salonId', 'type']) export class CampaignRun { @PrimaryGeneratedColumn('uuid') id: string; @Column() salonId: string; @ManyToOne(() => Salon, { onDelete: 'CASCADE' }) @JoinColumn({ name: 'salonId' }) salon: Salon; @Column({ type: 'enum', enum: CampaignType, enumName: 'campaign_type_enum', }) type: CampaignType; @Column({ type: 'enum', enum: CampaignTrigger, enumName: 'campaign_trigger_enum', }) trigger: CampaignTrigger; @Column({ type: 'enum', enum: CampaignRunStatus, enumName: 'campaign_run_status_enum', }) status: CampaignRunStatus; @Column({ type: 'int', default: 0 }) targetCount: number; @Column({ type: 'int', default: 0 }) sentCount: number; @Column({ type: 'int', default: 0 }) failedCount: number; @Column({ type: 'decimal', precision: 14, scale: 2, default: 0, transformer: { to: (value: number) => value, from: (value: string) => parseFloat(value), }, }) estimatedRevenue: number; @Column({ type: 'uuid', nullable: true }) triggeredByUserId: string | null; @ManyToOne(() => User, { onDelete: 'SET NULL', nullable: true }) @JoinColumn({ name: 'triggeredByUserId' }) triggeredByUser: User | null; @Column({ type: 'uuid', nullable: true }) templateId: string | null; @ManyToOne(() => SmsTemplate, { onDelete: 'SET NULL', nullable: true }) @JoinColumn({ name: 'templateId' }) template: SmsTemplate | null; @Column({ type: 'int', nullable: true }) discountPercent: number | null; @Column({ type: 'decimal', precision: 14, scale: 2, nullable: true, transformer: { to: (value: number | null) => value, from: (value: string | null) => value == null ? null : parseFloat(value), }, }) discountAmount: number | null; @CreateDateColumn() createdAt: Date; @UpdateDateColumn() updatedAt: Date; }