penisularhr / src / modules / activity-record / activity-record.entity.ts
activity-record.entity.ts
Raw
import { Column, Entity, JoinColumn, ManyToOne, VirtualColumn } from 'typeorm';

import { AbstractEntity } from '../../common/abstract.entity';
import { UseDto } from '../../decorators';
import { NumberTransformer } from '../../transformer/number-transformer';
import { BlockEntity } from '../block/block.entity';
import { EmployeeEntity } from '../employee/employee.entity';
import { ActivityRecordSettingEntity } from './activity-record-setting.entity';
import { ActivityRecordDto } from './dtos/activity-record.dto';

@Entity({ name: 'activity_records' })
@UseDto(ActivityRecordDto)
export class ActivityRecordEntity extends AbstractEntity<ActivityRecordDto> {
  @Column({ type: 'timestamp' })
  date!: Date;

  @Column({
    type: 'decimal',
    precision: 20,
    scale: 6,
    transformer: new NumberTransformer(),
  })
  hour!: number;

  @Column({
    type: 'decimal',
    precision: 20,
    scale: 6,
    transformer: new NumberTransformer(),
  })
  rate!: number;

  @Column({
    type: 'decimal',
    precision: 20,
    scale: 6,
    transformer: new NumberTransformer(),
  })
  quantity!: number;

  @VirtualColumn({
    type: 'decimal',
    transformer: new NumberTransformer(),
    query: (alias) => `SELECT ${alias}.rate * ${alias}.quantity`,
  })
  amount!: number;

  @Column({ nullable: true })
  remark?: string;

  @ManyToOne(
    () => EmployeeEntity,
    (employeeEntity) => employeeEntity.activityRecord,
    {
      onUpdate: 'CASCADE',
    },
  )
  @JoinColumn({
    name: 'employee_id',
    foreignKeyConstraintName: 'activity_record_employee',
  })
  employee!: EmployeeEntity;

  @ManyToOne(
    () => ActivityRecordSettingEntity,
    (activityRecordSettingEntity) => activityRecordSettingEntity.activityRecord,
    {
      onUpdate: 'CASCADE',
    },
  )
  @JoinColumn({
    name: 'activity_record_setting_id',
    foreignKeyConstraintName: 'activity_record_activity_record_setting',
  })
  activityRecordSetting!: ActivityRecordSettingEntity;

  @ManyToOne(() => BlockEntity, (blockEntity) => blockEntity.activityRecord, {
    onUpdate: 'CASCADE',
  })
  @JoinColumn({
    name: 'block_id',
    foreignKeyConstraintName: 'activity_record_block',
  })
  block!: BlockEntity;
}