penisularhr / src / modules / employee / employee.entity.ts
employee.entity.ts
Raw
import { Column, Entity, OneToMany } from 'typeorm';

import { AbstractEntity } from '../../common/abstract.entity';
import { UseDto } from '../../decorators';
import { NumberTransformer } from '../../transformer/number-transformer';
import { ActivityRecordEntity } from '../activity-record/activity-record.entity';
import { IncentiveRecordEntity } from '../incentive/incentive-record.entity';
import { MonthlyRecordEntity } from '../monthly-record/monthly-record.entity';
import { OtRecordEntity } from '../ot/ot-record.entity';
import { EmployeeDto } from './dtos/employee.dto';

@Entity({ name: 'employees' })
@UseDto(EmployeeDto)
export class EmployeeEntity extends AbstractEntity<EmployeeDto> {
  @Column({ unique: true })
  name!: string;

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

  @Column({ type: 'timestamp' })
  dateJoin!: Date;

  @Column({ nullable: true, type: 'timestamp' })
  dateResign?: Date;

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

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

  @Column({ type: 'timestamp', nullable: true })
  referralFeePaidAt?: Date;

  @Column({ type: 'boolean', default: true })
  isActive!: boolean;

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

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

  @Column({
    type: 'decimal',
    precision: 8,
    scale: 3,
    default: 0,
    transformer: new NumberTransformer(),
  })
  annualLeave!: number;

  @Column({
    type: 'decimal',
    precision: 8,
    scale: 3,
    default: 0,
    transformer: new NumberTransformer(),
  })
  sickLeave!: number;

  @Column({ type: 'integer', default: 0 })
  epfRatePer!: number;

  @Column({
    type: 'boolean',
    default: false,
  })
  shouldDeductSocso!: boolean;

  @OneToMany(() => OtRecordEntity, (otRecordEntity) => otRecordEntity.employee)
  otRecord!: OtRecordEntity[];

  @OneToMany(
    () => ActivityRecordEntity,
    (activityRecordEntity) => activityRecordEntity.employee,
  )
  activityRecord!: ActivityRecordEntity[];

  @OneToMany(
    () => IncentiveRecordEntity,
    (incentiveRecordEntity) => incentiveRecordEntity.employee,
  )
  incentiveRecord!: IncentiveRecordEntity[];

  @OneToMany(
    () => MonthlyRecordEntity,
    (monthlyRecordEntity) => monthlyRecordEntity.employee,
  )
  monthlyRecord!: MonthlyRecordEntity[];
}