Есть метод для двух сущностей, который суммирует поле результата.
Сущности похожи. Метод получается один и тот же. Мне не нравится как он выглядит.
Как правильно его описать?
Может сделать для каждой сущности по методу, но тогда все просто дублируется.
Может как то более правильно описать через дженерики?
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
}