penisularhr / seed.ts
seed.ts
Raw
/* eslint-disable no-console */
import 'reflect-metadata';

import moment from 'moment';
import { MoreThanOrEqual } from 'typeorm';

import { dataSource } from './ormconfig';
import { ActivityRecordEntity } from './src/modules/activity-record/activity-record.entity';
import { ActivityRecordSettingEntity } from './src/modules/activity-record/activity-record-setting.entity';
import { BlockEntity } from './src/modules/block/block.entity';
import { EmployeeEntity } from './src/modules/employee/employee.entity';
import { PublicHolidayEntity } from './src/modules/public-holiday/public-holiday.entity';

const blockData = [
  { name: 'none' },
  { name: '13' },
  { name: '14' },
  { name: '15' },
  { name: '16' },
  { name: '17' },
  { name: '18' },
  { name: '20' },
  { name: '21' },
  { name: '22' },
  { name: '23' },
  { name: '24' },
  { name: '25' },
  { name: '26' },
  { name: '27' },
  { name: '28' },
  { name: '29' },
  { name: '30' },
  { name: '31' },
  { name: '34' },
  { name: '35' },
  { name: '36' },
  { name: '37' },
  { name: 'A1' },
  { name: 'A10' },
  { name: 'A11' },
  { name: 'A2' },
  { name: 'A3' },
  { name: 'A4' },
  { name: 'A5' },
  { name: 'A6' },
  { name: 'A7' },
  { name: 'A8' },
  { name: 'A9' },
  { name: 'C10' },
  { name: 'C11' },
  { name: 'C12' },
  { name: 'C12A' },
  { name: 'C13' },
  { name: 'C13A' },
  { name: 'D0' },
  { name: 'D01' },
  { name: 'D0A' },
  { name: 'D0B' },
  { name: 'D1' },
  { name: 'D10A' },
  { name: 'D10B' },
  { name: 'D11A' },
  { name: 'D11B' },
  { name: 'D12A' },
  { name: 'D12B' },
  { name: 'D13A' },
  { name: 'D13B' },
  { name: 'D14A' },
  { name: 'D14B' },
  { name: 'D15A' },
  { name: 'D15B' },
  { name: 'D16' },
  { name: 'D16A' },
  { name: 'D16B' },
  { name: 'D17' },
  { name: 'D1A' },
  { name: 'D1B' },
  { name: 'D2' },
  { name: 'D2A' },
  { name: 'D2B' },
  { name: 'D3' },
  { name: 'D3A' },
  { name: 'D3B' },
  { name: 'D4' },
  { name: 'D4A' },
  { name: 'D4B' },
  { name: 'D5' },
  { name: 'D5A' },
  { name: 'D5B' },
  { name: 'D6' },
  { name: 'D6A' },
  { name: 'D6B' },
  { name: 'D7' },
  { name: 'D7A' },
  { name: 'D7B' },
  { name: 'D8' },
  { name: 'D8A' },
  { name: 'D8B' },
  { name: 'D9A' },
  { name: 'D9B' },
  { name: 'N01' },
  { name: 'N02' },
];

const employeeData = [
  {
    name: 'Supario',
    origin: 'Foreign',
    dateJoin: '2022-07-29T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Naing',
    origin: 'Foreign',
    dateJoin: '2022-11-04T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Tin',
    origin: 'Foreign',
    dateJoin: '2022-11-04T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Rio',
    origin: 'Foreign',
    dateJoin: '2022-02-14T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Arie',
    origin: 'Foreign',
    dateJoin: '2022-07-14T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Anto',
    origin: 'Foreign',
    dateJoin: '2022-07-14T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Lapyu',
    origin: 'Foreign',
    dateJoin: '2022-11-04T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Kyaw Thin Hlaing (Soso)',
    origin: 'Foreign',
    dateJoin: '2023-03-13T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Juhri',
    origin: 'Foreign',
    dateJoin: '2023-03-16T00:00:00Z',
    dateResign: '2023-09-15T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Bagas',
    origin: 'Foreign',
    dateJoin: '2023-08-22T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Putra',
    origin: 'Foreign',
    dateJoin: '2023-08-22T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Vutto',
    origin: 'Foreign',
    dateJoin: '2023-08-25T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Fadli',
    origin: 'Foreign',
    dateJoin: '2023-09-05T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Ijan',
    origin: 'Foreign',
    dateJoin: '2023-09-05T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Pino',
    origin: 'Foreign',
    dateJoin: '2023-09-13T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Kasmirah',
    origin: 'Foreign',
    dateJoin: '2023-09-13T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Norinah',
    origin: 'Foreign',
    dateJoin: '2023-09-13T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Wati',
    origin: 'Foreign',
    dateJoin: '2023-09-15T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
  {
    name: 'Supri',
    origin: 'Foreign',
    dateJoin: '2023-09-15T00:00:00Z',
    basicSalary: 1500,
    shouldDeductSocso: false,
    dailyRateAmount: 50,
    monthlyAllowanceAmount: 0,
    epfRatePer: 0,
    isActive: true,
    annualLeave: 0,
    sickLeave: 0,
  },
];

async function seedBlock() {
  await dataSource.initialize();
  const blockRepository = dataSource.getRepository(BlockEntity);

  // Check if blocks already exist
  const blocks = await blockRepository.find();

  if (blocks.length === 0) {
    await blockRepository.save(
      blockData.map((block) => blockRepository.create(block)),
      { chunk: blockData.length },
    );
    console.log('Seeding complete!');
  } else {
    console.warn('blocks already exist, seeding skipped.');
  }

  await dataSource.destroy();
}

async function seedEmployee() {
  await dataSource.initialize();
  const employeeRepository = dataSource.getRepository(EmployeeEntity);

  // Check if blocks already exist
  const blocks = await employeeRepository.find();

  if (blocks.length === 0) {
    await employeeRepository.save(
      employeeData.map((employee) => employeeRepository.create(employee)),
      { chunk: employeeData.length },
    );
    console.log('Seeding complete!');
  } else {
    console.warn('employee already exist, seeding skipped.');
  }

  await dataSource.destroy();
}

async function seedPublicHolidayActivity() {
  await dataSource.initialize();
  const employeeRepository = dataSource.getRepository(EmployeeEntity);
  const publicHolidayRepository = dataSource.getRepository(PublicHolidayEntity);
  const blockRepository = dataSource.getRepository(BlockEntity);
  const activityRepository = dataSource.getRepository(ActivityRecordEntity);
  const acitvitySettingRepository = dataSource.getRepository(
    ActivityRecordSettingEntity,
  );

  const startDate = moment
    .utc()
    .date(1) // Set day to 10
    .month(3) // Set month to March (0-indexed)
    .year(2024);

  const publicHolidayArr = await publicHolidayRepository.findBy({
    date: MoreThanOrEqual(startDate.toDate()),
  });
  const employeeArr = await employeeRepository.findBy({ isActive: true });
  const blockEntity = await blockRepository.findOneBy({ name: 'none' });
  const activitySettingEntity = await acitvitySettingRepository.findOneBy({
    name: 'Public Holiday',
  });

  if (!blockEntity || !activitySettingEntity) {
    console.warn('block or activity setting not found, seeding skipped.');

    return;
  }

  for (const publicHoliday of publicHolidayArr) {
    for (const employee of employeeArr) {
      if (employee.dateResign && employee.dateResign <= publicHoliday.date) {
        continue;
      }

      // eslint-disable-next-line no-await-in-loop
      const foundActivity = await activityRepository.findOne({
        where: {
          employee: { id: employee.id },
          date: publicHoliday.date,
          activityRecordSetting: { id: activitySettingEntity.id },
          block: { id: blockEntity.id },
        },
        relations: ['employee', 'activityRecordSetting', 'block'],
      });

      if (foundActivity) {
        continue;
      }

      const createActivity = activityRepository.create({
        activityRecordSetting: activitySettingEntity,
        block: blockEntity,
        date: publicHoliday.date,
        employee,
        hour: 8,
        quantity: 8,
        rate: activitySettingEntity.rate,
      });

      // eslint-disable-next-line no-await-in-loop
      await activityRepository.save(createActivity);
    }
  }

  console.log('Seeding public holiday activity complete!');

  await dataSource.destroy();
}

async function seed() {
  await seedBlock();
  await seedEmployee();
  await seedPublicHolidayActivity();
}

// eslint-disable-next-line unicorn/prefer-top-level-await
seed().catch((error) => {
  console.error('Error during seeding', error);

  // eslint-disable-next-line unicorn/no-process-exit, n/no-process-exit
  process.exit(1);
});