penisularhr / src / modules / ot / ot-settings.service.ts
ot-settings.service.ts
Raw
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { type FindOptionsWhere, Repository } from 'typeorm';

import { OperateType } from '../../constants';
import { AuditLogService } from '../audit-log/audit-log.service';
import { type UserEntity } from '../user/user.entity';
import { type UpdateOtSettingDto } from './dtos/update-ot-settings.dto';
import { OtSettingEntity } from './ot-settings.entity';

@Injectable()
export class OtSettingService {
  constructor(
    @InjectRepository(OtSettingEntity)
    private otSettingRepository: Repository<OtSettingEntity>,
    private auditLogService: AuditLogService,
  ) {}

  async findOne(
    findData?: FindOptionsWhere<OtSettingEntity>,
  ): Promise<OtSettingEntity | null> {
    const queryBuilder =
      this.otSettingRepository.createQueryBuilder('otSetting');

    if (findData) {
      queryBuilder.where(findData);
    }

    return queryBuilder.getOne();
  }

  async updateOtSetting(
    otSettingEntity: OtSettingEntity,
    dto: UpdateOtSettingDto,
    user: UserEntity,
  ): Promise<OtSettingEntity> {
    const { sundayRatePer, normalRatePer, publicHolidayRatePer } = dto;

    const oldValue = JSON.stringify({ ...otSettingEntity });
    let summaryChanges = 'UPDATE ';

    if (sundayRatePer !== undefined) {
      summaryChanges +=
        otSettingEntity.sundayRatePer === sundayRatePer
          ? ''
          : `Sunday Rate %:${otSettingEntity.sundayRatePer} -> ${sundayRatePer}, `;

      otSettingEntity.sundayRatePer = sundayRatePer;
    }

    if (normalRatePer !== undefined) {
      summaryChanges +=
        otSettingEntity.normalRatePer === normalRatePer
          ? ''
          : `Normal Rate %:${otSettingEntity.normalRatePer} -> ${normalRatePer}, `;

      otSettingEntity.normalRatePer = normalRatePer;
    }

    if (publicHolidayRatePer !== undefined) {
      summaryChanges +=
        otSettingEntity.publicHolidayRatePer === publicHolidayRatePer
          ? ''
          : `Public Holiday Rate %:${otSettingEntity.publicHolidayRatePer} -> ${publicHolidayRatePer}, `;

      otSettingEntity.publicHolidayRatePer = publicHolidayRatePer;
    }

    const updatedEntity = await this.otSettingRepository.save(otSettingEntity);

    await this.auditLogService.create({
      itemId: updatedEntity.id,
      newValue: JSON.stringify(updatedEntity),
      oldValue,
      operateType: OperateType.UPDATE,
      summaryChanges,
      tableName: 'otRecordSetting',
      user,
    });

    return otSettingEntity;
  }
}