Files
grow-api/src/campaigns/entities/campaign-run.entity.ts
T
2026-07-11 22:08:41 +03:30

110 lines
2.5 KiB
TypeScript

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;
}