eust-conciliation
Version:
71 lines (53 loc) • 2.88 kB
text/typescript
/* eslint-disable no-await-in-loop */
/* eslint-disable no-restricted-syntax */
import { Inject, Injectable } from '@severo-tech/injection-decorator';
import { ILogger, IDebitNoticeClient, IAgentClient } from '../../contracts';
import { AgentType } from '../../../domain/agent';
import {
ConciliationOneToOne,
ConciliationOneToMany,
ConciliationManyToMany,
} from './handlers';
()
export class ConciliateAutomationUseCase {
('ZenviaLogger')
private readonly logger!: ILogger;
('ONSDebitNoticeClient')
private readonly debitNoticeClient!: IDebitNoticeClient;
('Agent01EUSTClient')
private readonly agentClient!: IAgentClient;
('ConciliationOneToOne')
private readonly conciliationOneToOne!: ConciliationOneToOne;
('ConciliationOneToMany')
private readonly conciliationOneToMany!: ConciliationOneToMany;
('ConciliationManyToMany')
private readonly conciliationManyToMany!: ConciliationManyToMany;
public async execute(year: number, month: number, page = 1): Promise<void> {
this.logger.info(`"ConciliateInvoicesAutomationUseCase.execute" - Starting to process conciliation for month "${year}/${month}" - Page[${page}]`);
const startDate = new Date(year, month, -10, 0, 0, 0, 0); // Last month days
const endDate = new Date(year, month + 1, 0, 23, 59, 59, 999); // Next Month last day
this.logger.debug(`"ConciliateInvoicesAutomationUseCase.execute" - Searching invoices between "${startDate.toISOString()}" and "${endDate.toISOString()}"`);
try {
const debitNotices = await this.debitNoticeClient.getDebitNotice(year, month, page, 20);
this.logger.debug(`"ConciliateInvoicesAutomationUseCase.execute" - Found ${debitNotices.length} to process - Page[${page}]`);
for (const debitNotice of debitNotices) {
const [agent] = await this.agentClient.find({ code: debitNotice.user.code, type: AgentType.User });
if (agent) {
await this.conciliationOneToOne.execute(debitNotice.debits, year, month, agent, startDate, endDate);
await this.conciliationOneToMany.execute(year, month, agent, startDate, endDate);
}
}
this.logger.info(`"ConciliateInvoicesAutomationUseCase.execute" - Finished conciliation for month "${year}/${month}" - Page[${page}]`);
if (debitNotices.length) { // Go to next page
await this.execute(year, month, page + 1);
}
// Execute ManyToMany Reconciliation only once, after all previous reconciliations have been executed
if (page === 1) {
await this.conciliationManyToMany.execute(year, month, startDate, endDate);
}
} catch (error) {
this.logger.error(`"ConciliateInvoicesAutomationUseCase.execute" - Cannot process Conciliation for month "${year}/${month}" - Page[${page}]`, error);
throw error;
}
}
}