Skip to content

Commit

Permalink
chore: use repository
Browse files Browse the repository at this point in the history
  • Loading branch information
yxuo committed Feb 7, 2024
1 parent 74b455c commit e136f7c
Show file tree
Hide file tree
Showing 5 changed files with 147 additions and 119 deletions.
125 changes: 125 additions & 0 deletions src/bank-statements/bank-statements-repository.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
import { Injectable } from '@nestjs/common';
import { nextFriday } from 'date-fns';
import { TicketRevenuesService } from 'src/ticket-revenues/ticket-revenues.service';
import { User } from 'src/users/entities/user.entity';
import { getDateYMDString, isPaymentWeekComplete } from 'src/utils/date-utils';
import { TimeIntervalEnum } from 'src/utils/enums/time-interval.enum';
import { getPagination } from 'src/utils/get-pagination';
import { PaginationOptions } from 'src/utils/types/pagination-options';
import { Pagination } from 'src/utils/types/pagination.type';
import { IBankStatement } from './interfaces/bank-statement.interface';
import { IBSCounts } from './interfaces/bs-counts.interface';
import { IBSGetMePreviousDaysValidArgs } from './interfaces/bs-get-me-previous-days-args.interface';
import { IBSGetMePreviousDaysResponse } from './interfaces/bs-get-me-previous-days-response.interface';

/**
* Get weekly statements
*/
@Injectable()
export class BankStatementsRepositoryService {
constructor(private readonly ticketRevenuesService: TicketRevenuesService) {}

public async getPreviousDays(
validArgs: IBSGetMePreviousDaysValidArgs,
paginationOptions: PaginationOptions,
): Promise<Pagination<IBSGetMePreviousDaysResponse>> {
const previousDays = await this.buildPreviousDays({
user: validArgs.user,
endDate: validArgs.endDate,
timeInterval: validArgs.timeInterval,
paginationArgs: paginationOptions,
});
const statusCounts = this.generateStatusCounts(previousDays.data);

return getPagination<IBSGetMePreviousDaysResponse>(
{
data: previousDays.data,
statusCounts: statusCounts,
},
{
dataLenght: previousDays.data.length,
maxCount: previousDays.count,
},
paginationOptions,
);
}

private async buildPreviousDays(validArgs: {
user: User;
endDate: string;
timeInterval?: TimeIntervalEnum;
paginationArgs?: PaginationOptions;
}): Promise<Pagination<{ data: IBankStatement[] }>> {
const pagination = validArgs.paginationArgs
? validArgs.paginationArgs
: { limit: 9999, page: 1 };
const revenues = await this.ticketRevenuesService.fetchTicketRevenues({
startDate: new Date(validArgs.endDate),
endDate: new Date(validArgs.endDate),
cpfCnpj: validArgs.user.getCpfCnpj(),
limit: pagination.limit,
offset: (pagination.page - 1) * pagination.limit,
previousDays: true,
});
const statements = revenues.data.map((item, index) => {
const isPaid = isPaymentWeekComplete(
new Date(String(item.processingDateTime)),
);
return {
id: index,
date: getDateYMDString(new Date(String(item.processingDateTime))),
processingDate: getDateYMDString(
new Date(String(item.processingDateTime)),
),
transactionDate: getDateYMDString(
new Date(String(item.transactionDateTime)),
),
paymentOrderDate: getDateYMDString(
nextFriday(new Date(String(item.processingDateTime))),
),
effectivePaymentDate: isPaid
? getDateYMDString(
nextFriday(new Date(String(item.processingDateTime))),
)
: null,
cpfCnpj: validArgs.user.getCpfCnpj(),
permitCode: validArgs.user.getPermitCode(),
amount: item.transactionValue,
status: isPaid ? 'Pago' : 'A pagar',
statusCode: isPaid ? 'paid' : 'toPay',
bankStatus: isPaid ? '00' : null,
bankStatusCode: isPaid ? 'Crédito ou Débito Efetivado' : null,
error: null,
errorCode: null,
} as IBankStatement;
});
return getPagination<{ data: IBankStatement[] }>(
{
data: statements,
},
{
dataLenght: statements.length,
maxCount: revenues.countAll,
},
pagination,
);
}

private generateStatusCounts(
data: IBankStatement[],
): Record<string, IBSCounts> {
const statusCounts: Record<string, IBSCounts> = {};
for (const item of data) {
if (!statusCounts?.[item.statusCode]) {
statusCounts[item.statusCode] = {
count: 1,
amountSum: item.amount,
};
} else {
statusCounts[item.statusCode].count += 1;
statusCounts[item.statusCode].amountSum += item.amount;
}
}
return statusCounts;
}
}
3 changes: 2 additions & 1 deletion src/bank-statements/bank-statements.module.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { Module } from '@nestjs/common';
import { TicketRevenuesModule } from 'src/ticket-revenues/ticket-revenues.module';
import { UsersModule } from 'src/users/users.module';
import { BankStatementsRepositoryService } from './bank-statements-repository.service';
import { BankStatementsController } from './bank-statements.controller';
import { BankStatementsService } from './bank-statements.service';

@Module({
providers: [BankStatementsService],
providers: [BankStatementsService, BankStatementsRepositoryService],
controllers: [BankStatementsController],
imports: [UsersModule, TicketRevenuesModule],
})
Expand Down
2 changes: 2 additions & 0 deletions src/bank-statements/bank-statements.service.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { User } from 'src/users/entities/user.entity';
import { UsersService } from 'src/users/users.service';
import { getDateYMDString } from 'src/utils/date-utils';
import { TimeIntervalEnum } from 'src/utils/enums/time-interval.enum';
import { BankStatementsRepositoryService } from './bank-statements-repository.service';
import { BankStatementsService } from './bank-statements.service';
import { IBankStatement } from './interfaces/bank-statement.interface';

Expand Down Expand Up @@ -47,6 +48,7 @@ describe('BankStatementsService', () => {
const module: TestingModule = await Test.createTestingModule({
providers: [
BankStatementsService,
BankStatementsRepositoryService,
usersServiceMock,
ticketRevenuesServiceMock,
],
Expand Down
128 changes: 10 additions & 118 deletions src/bank-statements/bank-statements.service.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import { differenceInDays, nextFriday, subDays } from 'date-fns';
import { differenceInDays, subDays } from 'date-fns';
import { TicketRevenuesService } from 'src/ticket-revenues/ticket-revenues.service';
import { User } from 'src/users/entities/user.entity';
import { UsersService } from 'src/users/users.service';
import { getDateYMDString, isPaymentWeekComplete } from 'src/utils/date-utils';
import { TimeIntervalEnum } from 'src/utils/enums/time-interval.enum';
import { getPagination } from 'src/utils/get-pagination';
import { CommonHttpException } from 'src/utils/http-exception/common-http-exception';
import { getPaymentDates, getPaymentWeek } from 'src/utils/payment-date-utils';
import { PaginationOptions } from 'src/utils/types/pagination-options';
import { Pagination } from 'src/utils/types/pagination.type';
import { BankStatementsRepositoryService } from './bank-statements-repository.service';
import { IBankStatement } from './interfaces/bank-statement.interface';
import { IBSCounts } from './interfaces/bs-counts.interface';
import { IBSGetMeArgs } from './interfaces/bs-get-me-args.interface';
import { IBSGetMeDayArgs } from './interfaces/bs-get-me-day-args.interface';
import { IBSGetMeDayResponse } from './interfaces/bs-get-me-day-response.interface';
import { IBSGetMePreviousDaysArgs } from './interfaces/bs-get-me-previous-days-args.interface';
import {
IBSGetMePreviousDaysArgs,
IBSGetMePreviousDaysValidArgs,
} from './interfaces/bs-get-me-previous-days-args.interface';
import { IBSGetMePreviousDaysResponse } from './interfaces/bs-get-me-previous-days-response.interface';
import { IBSGetMeResponse } from './interfaces/bs-get-me-response.interface';
import { IGetBSResponse } from './interfaces/get-bs-response.interface';
Expand All @@ -27,6 +29,7 @@ import { IGetBSResponse } from './interfaces/get-bs-response.interface';
export class BankStatementsService {
constructor(
private readonly usersService: UsersService,
private readonly bankStatementsRepositoryService: BankStatementsRepositoryService,
private readonly ticketRevenuesService: TicketRevenuesService,
) {}

Expand Down Expand Up @@ -220,23 +223,8 @@ export class BankStatementsService {
paginationOptions: PaginationOptions,
): Promise<Pagination<IBSGetMePreviousDaysResponse>> {
const validArgs = await this.validateGetMePreviousDays(args);
const previousDays = await this.buildPreviousDays({
user: validArgs.user,
endDate: validArgs.endDate,
timeInterval: validArgs.timeInterval,
paginationArgs: paginationOptions,
});
const statusCounts = this.generateStatusCounts(previousDays.data);

return getPagination<IBSGetMePreviousDaysResponse>(
{
data: previousDays.data,
statusCounts: statusCounts,
},
{
dataLenght: previousDays.data.length,
maxCount: previousDays.count,
},
return await this.bankStatementsRepositoryService.getPreviousDays(
validArgs,
paginationOptions,
);
}
Expand All @@ -248,11 +236,7 @@ export class BankStatementsService {
*/
private async validateGetMePreviousDays(
args: IBSGetMePreviousDaysArgs,
): Promise<{
user: User;
endDate: string;
timeInterval?: TimeIntervalEnum;
}> {
): Promise<IBSGetMePreviousDaysValidArgs> {
if (isNaN(args?.userId as number)) {
throw CommonHttpException.argNotType('userId', 'number', args?.userId);
}
Expand All @@ -265,96 +249,4 @@ export class BankStatementsService {
timeInterval: args.timeInterval as unknown as TimeIntervalEnum,
};
}

/**
* TODO: refactor
*
* Filter: previous-days
*/
private async buildPreviousDays(validArgs: {
user: User;
endDate: string;
timeInterval?: TimeIntervalEnum;
paginationArgs?: PaginationOptions;
}): Promise<Pagination<{ data: IBankStatement[] }>> {
const pagination = validArgs.paginationArgs
? validArgs.paginationArgs
: { limit: 9999, page: 1 };
const revenues = await this.ticketRevenuesService.fetchTicketRevenues({
startDate: new Date(validArgs.endDate),
endDate: new Date(validArgs.endDate),
cpfCnpj: validArgs.user.getCpfCnpj(),
limit: pagination.limit,
offset: (pagination.page - 1) * pagination.limit,
previousDays: true,
});
const statements = revenues.data.map((item, index) => {
const isPaid = isPaymentWeekComplete(
new Date(String(item.processingDateTime)),
);
return {
id: index,
date: getDateYMDString(new Date(String(item.processingDateTime))),
processingDate: getDateYMDString(
new Date(String(item.processingDateTime)),
),
transactionDate: getDateYMDString(
new Date(String(item.transactionDateTime)),
),
paymentOrderDate: getDateYMDString(
nextFriday(new Date(String(item.processingDateTime))),
),
effectivePaymentDate: isPaid
? getDateYMDString(
nextFriday(new Date(String(item.processingDateTime))),
)
: null,
cpfCnpj: validArgs.user.getCpfCnpj(),
permitCode: validArgs.user.getPermitCode(),
amount: item.transactionValue,
status: isPaid ? 'Pago' : 'A pagar',
statusCode: isPaid ? 'paid' : 'toPay',
bankStatus: isPaid ? '00' : null,
bankStatusCode: isPaid ? 'Crédito ou Débito Efetivado' : null,
error: null,
errorCode: null,
} as IBankStatement;
});
// statements = statements
// .filter(i => i.processingDate
// && new Date(String(i.transactionDate)) < new Date(i.processingDate));
return getPagination<{ data: IBankStatement[] }>(
{
data: statements,
},
{
dataLenght: statements.length,
maxCount: revenues.countAll,
},
pagination,
);
}

/**
* TODO: refactor
*
* Filter: previous-days
*/
private generateStatusCounts(
data: IBankStatement[],
): Record<string, IBSCounts> {
const statusCounts: Record<string, IBSCounts> = {};
for (const item of data) {
if (!statusCounts?.[item.statusCode]) {
statusCounts[item.statusCode] = {
count: 1,
amountSum: item.amount,
};
} else {
statusCounts[item.statusCode].count += 1;
statusCounts[item.statusCode].amountSum += item.amount;
}
}
return statusCounts;
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,15 @@
import { User } from 'src/users/entities/user.entity';
import { TimeIntervalEnum } from 'src/utils/enums/time-interval.enum';
import { BSMePrevDaysTimeIntervalEnum } from '../enums/bs-me-prev-days-time-interval.enum';

export class IBSGetMePreviousDaysArgs {
endDate?: string;
timeInterval?: BSMePrevDaysTimeIntervalEnum;
userId?: number;
}

export class IBSGetMePreviousDaysValidArgs {
user: User;
endDate: string;
timeInterval?: TimeIntervalEnum;
}

0 comments on commit e136f7c

Please sign in to comment.