penisularhr / src / modules / ot / ot-record.entity.ts
ot-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 { ActivityRecordSettingEntity } from '../activity-record/activity-record-setting.entity';
import { EmployeeEntity } from '../employee/employee.entity';
import { OtRecordDto } from './dtos/ot-record.dto';

@Entity({ name: 'ot_records' })
@UseDto(OtRecordDto)
export class OtRecordEntity extends AbstractEntity<OtRecordDto> {
  @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(),
  })
  ratePer!: number;

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

  @VirtualColumn({
    type: 'decimal',
    transformer: new NumberTransformer(),
    query: (alias) =>
      `SELECT ${alias}.hour * ${alias}.rate_per * ${alias}.daily_rate / 8`,
  })
  amount!: number;

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

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

  @ManyToOne(
    () => ActivityRecordSettingEntity,
    (activityRecordSettingEntity) => activityRecordSettingEntity.otRecord,
    {
      onUpdate: 'CASCADE',
    },
  )
  @JoinColumn({
    name: 'activity_setting_id',
    foreignKeyConstraintName: 'ot_record_activity_setting',
  })
  activitySetting!: ActivityRecordSettingEntity;
}