@lookingfor2

Как красиво и правильно написать метод/методы чтобы не дублировать код, когда они полностью идентичны?

Есть метод для двух сущностей, который суммирует поле результата.
Сущности похожи. Метод получается один и тот же. Мне не нравится как он выглядит.
Как правильно его описать?
Может сделать для каждой сущности по методу, но тогда все просто дублируется.
Может как то более правильно описать через дженерики?
async summarizeResults(
    entityName: 'accrueds' | 'deductions',
    userId: number,
    startDate: Date, // for example 2022-06-30T21:00:00.000Z
    endDate: Date, // for example 2022-07-31T20:59:59.999Z
  ): Promise<number> {
    const sheets = await this.sheetRepository
      .createQueryBuilder('sheets')
      .where('user_id = :id', {
        id: userId,
      })
      .leftJoinAndSelect(`sheets.${entityName}`, entityName)
      .andWhere(`${entityName}.period > :startDate`, {
        startDate: startDate,
      })
      .andWhere(`${entityName}.period < :endDate`, {
        endDate: endDate,
      })
      .andWhere(`${entityName}.status != :status`, {
        status: TransactionStatus.REJECTED,
      })
      .getMany();

    const items: (AccruedEntity | DeductionEntity)[] = sheets?.reduce(
      (prev, curr) => {
        return [...prev, ...curr[entityName]];
      },
      [],
    );
    const initialValue = 0;
    const sum = items?.reduce((accumulator, currentValue) => {
      return evaluate(`(${accumulator} + ${currentValue.result})`);
    }, initialValue);

    return round(sum, 2);
  }

console.log({
      sheets: sheets,
      items: items,
      sum: sum,
    });
{
  sheets: [
    PaymentSheet2Entity {
      id: 9,
      user_id: 1,
      organization: '7842460869/781301001',
      individual_guid: '0bd4be28-88ef-44be-a630-04b5541786b0',
      period: 2022-07-19T13:02:33.942Z,
      created_at: 2022-07-19T13:02:33.943Z,
      average_salary: null,
      accrueds: [Array]
    }
  ],
  items: [
    AccruedEntity {
      id: 11,
      guid: null,
      payment_sheets_2_id: 9,
      name: 'Выплата по инициативе сотрудника',
      period: 2022-07-19T13:02:33.942Z,
      result: '8000.20',
      status: 'checked',
      created_at: 2022-07-19T13:02:33.943Z,
      updated_at: 2022-07-19T13:02:33.943Z
    }
  ],
  sum: 8000.2
}
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы