Skip to content

Commit

Permalink
Merge pull request #98 from RJ-SMTR/develop
Browse files Browse the repository at this point in the history
Develop to PRD
  • Loading branch information
rivailruiz committed Nov 16, 2023
2 parents 27f616d + 9c2aff9 commit 96008fc
Show file tree
Hide file tree
Showing 9 changed files with 164 additions and 81 deletions.
2 changes: 1 addition & 1 deletion src/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -271,7 +271,7 @@ export class AuthService {
mailData,
);
if (mailResponse.mailSentInfo.success === true) {
userMailHistory.setInviteStatus(InviteStatusEnum.queued);
userMailHistory.setInviteStatus(InviteStatusEnum.sent);
userMailHistory.sentAt = new Date(Date.now());
await this.mailHistoryService.update(
userMailHistory.id,
Expand Down
17 changes: 8 additions & 9 deletions src/bank-statements/bank-statements.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { getDateYMDString } from 'src/utils/date-utils';
import { getPaymentDates, getPaymentWeek } from 'src/utils/payment-date-utils';
import { IBankStatementsGet } from './interfaces/bank-statements-get.interface';
import { IBankStatementsResponse } from './interfaces/bank-statements-response.interface';
import { TimeIntervalEnum } from 'src/utils/enums/time-interval.enum';

@Injectable()
export class BankStatementsService {
Expand Down Expand Up @@ -85,20 +86,18 @@ export class BankStatementsService {
todaySum: number;
allSum: number;
}> {
const statementFirstDate = statements[statements.length - 1].date;
const revenueStartDate = getDateYMDString(
getPaymentWeek(new Date(statementFirstDate)).startDate,
);
const statementLastDate = statements[0].date;
const revenueEndDate = getDateYMDString(
getPaymentWeek(new Date(statementLastDate)).endDate,
const statementsDates = getPaymentDates(
'ticket-revenues',
undefined,
undefined,
TimeIntervalEnum.LAST_MONTH,
);

// Get daily data form tickets/me
const revenuesResponse = await this.ticketRevenuesService.getMeFromUser(
{
startDate: revenueStartDate,
endDate: revenueEndDate,
startDate: getDateYMDString(statementsDates.startDate),
endDate: getDateYMDString(statementsDates.endDate),
userId: args?.userId,
groupBy: 'day',
},
Expand Down
16 changes: 8 additions & 8 deletions src/mail/mail-templates/reset-password.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,27 @@

<body style="margin:0;font-family:arial">
<table style="border:0;width:100%">
<tr style="background:#eeeeee">
<td style="padding:20px;color:#808080;text-align:center;font-size:40px;font-weight:600">
{{app_name}}
<tr style="background:rgba(150,150,150,0.2)">
<td style="padding:20px;color:#004a80;text-align:left;font-size:30px;font-weight:600;">
<img src="{{logoSrc}}" alt="{{logoAlt}}" style="max-width: 300px; max-height: 86px;">
</td>
</tr>
<tr>
<td style="padding:20px;color:#808080;font-size:16px;font-weight:100">
{{text1}}<br>
{{text2}}<br>
{{text3}}
<p>
{{bodyText}}
</p>
</td>
</tr>
<tr>
<td style="text-align:center">
<a href="{{url}}"
style="display:inline-block;padding:20px;background:#00838f;text-decoration:none;color:#ffffff">{{actionTitle}}</a>
style="display:inline-block;padding:20px;background:#00838f;text-decoration:none;color:#ffffff">{{buttonText}}</a>
</td>
</tr>
<tr>
<td style="padding:20px;color:#808080;font-size:16px;font-weight:100">
{{text4}}
{{footerText}}
</td>
</tr>
</table>
Expand Down
61 changes: 13 additions & 48 deletions src/mail/mail.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@ import { ISendMailOptions, MailerService } from '@nestjs-modules/mailer';
import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { I18nContext } from 'nestjs-i18n';
import { MailData } from './interfaces/mail-data.interface';
import { AllConfigType } from 'src/config/config.type';
import { SmtpStatus } from 'src/utils/enums/smtp-status.enum';
import { MaybeType } from '../utils/types/maybe.type';
import { EhloStatus } from './enums/ehlo-status.enum';
import { MailData } from './interfaces/mail-data.interface';
import { MailRegistrationInterface } from './interfaces/mail-registration.interface';
import { MailSentInfo as MailSentInfo } from './interfaces/mail-sent-info.interface';
import { MailSentInfo } from './interfaces/mail-sent-info.interface';
import { MySentMessageInfo } from './interfaces/nodemailer/sent-message-info';
import { EhloStatus } from './enums/ehlo-status.enum';
import { MailCountService } from 'src/mail-count/mail-count.service';
import { SmtpStatus } from 'src/utils/enums/smtp-status.enum';

@Injectable()
export class MailService {
Expand All @@ -19,7 +18,6 @@ export class MailService {
constructor(
private readonly mailerService: MailerService,
private readonly configService: ConfigService<AllConfigType>,
private mailCountService: MailCountService,
) {}

private getMailSentInfo(sentMessageInfo: MySentMessageInfo): MailSentInfo {
Expand Down Expand Up @@ -106,8 +104,6 @@ export class MailService {
},
});

// await this.mailCountService.addCount(senders[0]);

return {
mailSentInfo: mailSentInfo,
mailConfirmationLink: emailConfirmLink,
Expand All @@ -123,39 +119,12 @@ export class MailService {
async forgotPassword(
mailData: MailData<{ hash: string }>,
): Promise<MailSentInfo> {
// const senders = await this.mailCountService.getUpdatedMailCounts(true);
// if (senders.length === 0) {
// throw new HttpException(
// {
// error: HttpStatus.SERVICE_UNAVAILABLE,
// message:
// 'Mailing service is unavailable. Wait 24 hours and try again.',
// details: {
// error: 'quotaLimitReached',
// },
// },
// HttpStatus.INTERNAL_SERVER_ERROR,
// );
// }

const i18n = I18nContext.current();
let resetPasswordTitle: MaybeType<string>;
let text1: MaybeType<string>;
let text2: MaybeType<string>;
let text3: MaybeType<string>;
let text4: MaybeType<string>;

if (i18n) {
[resetPasswordTitle, text1, text2, text3, text4] = await Promise.all([
i18n.t('common.resetPassword'),
i18n.t('reset-password.text1'),
i18n.t('reset-password.text2'),
i18n.t('reset-password.text3'),
i18n.t('reset-password.text4'),
]);
}
const resetPasswordTitle = 'Refedinir senha';

try {
const frontendDomain = this.configService.get('app.frontendDomain', {
infer: true,
});
const response = await this.safeSendMail({
to: mailData.to,
subject: resetPasswordTitle,
Expand All @@ -169,18 +138,14 @@ export class MailService {
infer: true,
})}reset-password/${mailData.data.hash}`,
actionTitle: resetPasswordTitle,
app_name: this.configService.get('app.name', {
infer: true,
}),
text1,
text2,
text3,
text4,
logoSrc: `${frontendDomain}/assets/icons/logoPrefeitura.png`,
logoAlt: 'Prefeitura do Rio',
bodyText: 'Redefina sua senha clicando no botão abaixo!',
buttonText: 'Redefinir senha.',
footerText: 'Caso você não tenha solicitado este email, ignore.',
},
});

// await this.mailCountService.addCount(senders[0]);

return response;
} catch (httpException) {
throw httpException;
Expand Down
2 changes: 1 addition & 1 deletion src/ticket-revenues/objs/TicketRevenuesGroup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export class TicketRevenuesGroup implements ITicketRevenuesGroup {
public transportIntegrationTypeCounts: Record<string, ITRCounts> = {};
public transportTypeCounts: Record<string, ITRCounts> = {};

public getInterface(): ITicketRevenuesGroup {
public toInterface(): ITicketRevenuesGroup {
return {
aux_epochWeek: this.aux_epochWeek,
aux_groupDateTime: this.aux_groupDateTime,
Expand Down
2 changes: 1 addition & 1 deletion src/ticket-revenues/ticket-revenues.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ export class TicketRevenuesService {
ticketRevenuesResponse = this.mapTicketRevenues(ticketRevenuesResponse);

if (ticketRevenuesResponse.length === 0) {
return new TicketRevenuesGroup().getInterface();
return new TicketRevenuesGroup().toInterface();
}
const ticketRevenuesGroupSum = this.getGroupSum(ticketRevenuesResponse);

Expand Down
40 changes: 30 additions & 10 deletions src/utils/payment-date-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
nextDay,
nextFriday,
previousDay,
previousFriday,
startOfMonth,
} from 'date-fns';
import { TimeIntervalEnum } from './enums/time-interval.enum';
Expand Down Expand Up @@ -124,18 +125,37 @@ export function getPayment2Weeks(fridayDate: Date): {
return { startDate, endDate };
}

export function getPaymentMonth(fridayDate: Date): {
export function getPaymentMonth(
fridayDate: Date,
endpoint: string,
): {
startDate: Date;
endDate: Date;
} {
// let endDate = new Date(fridayDate);
// if (!isFriday(endDate)) {
// endDate = nextFriday(endDate);
// }
return {
startDate: startOfMonth(fridayDate),
endDate: endOfMonth(fridayDate),
};
if (endpoint === 'bank-statements') {
return {
startDate: startOfMonth(fridayDate),
endDate: endOfMonth(fridayDate),
};
} else {
// get first and last friday of month
let startDate = startOfMonth(new Date(fridayDate));
if (!isFriday(startDate)) {
startDate = nextFriday(startDate);
}
let endDate = endOfMonth(new Date(fridayDate));
if (!isFriday(endDate) && isSameMonth(endDate, nextFriday(endDate))) {
endDate = nextFriday(endDate);
} else if (!isFriday(endDate)) {
endDate = previousFriday(endDate);
}

// get start end dates from each week
startDate.setDate(startDate.getDate() - 8);
endDate.setDate(endDate.getDate() - 2);

return { startDate, endDate };
}
}

export function getPaymentDates(
Expand Down Expand Up @@ -173,7 +193,7 @@ export function getPaymentDates(
} else if (timeInterval === TimeIntervalEnum.LAST_2_WEEKS) {
return getPayment2Weeks(endDate);
} else if (timeInterval === TimeIntervalEnum.LAST_MONTH) {
return getPaymentMonth(endDate);
return getPaymentMonth(endDate, endpoint);
}
}

Expand Down
43 changes: 40 additions & 3 deletions test/bank-statements/bank-statements.e2e-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ describe('Bank statements (e2e)', () => {
apiToken = body.token;
});
});
it('Should /bank-statements todaySum match in /ticket-revenues/me', async () => {
it('Should match todaySum in /bank-statements with /ticket-revenues/me', async () => {
// Arrange
let friday = new Date();
if (!isFriday(friday)) {
Expand Down Expand Up @@ -69,7 +69,7 @@ describe('Bank statements (e2e)', () => {
expect(bankStatements.todaySum).toEqual(ticketRevenuesMe.todaySum);
}, 60000);

it('Should /bank-statements amountSum match /ticket-revenues/me in the same month', async () => {
it('Should match amountSum in /bank-statements with /ticket-revenues/me in the same month', async () => {
// Arrange
let friday = new Date();
if (!isFriday(friday)) {
Expand Down Expand Up @@ -116,7 +116,7 @@ describe('Bank statements (e2e)', () => {
expect(bankStatements.amountSum).toEqual(ticketRevenuesMe.amountSum);
}, 60000);

it('Should match amountSum in /bank-statements and /ticket-revenues/me of same week', async () => {
it('Should match amountSum in /bank-statements with /ticket-revenues/me in the same week', async () => {
// Arrange
let friday = new Date();
if (!isFriday(friday)) {
Expand Down Expand Up @@ -161,4 +161,41 @@ describe('Bank statements (e2e)', () => {
)?.[0];
expect(bsFriday.amount).toEqual(ticketRevenuesMe.amountSum);
}, 60000);

it('Should match amountSum in /bank-statements with transactionValueSum in ticket-revenues/grouped/me', async () => {
// Arrange
const requestArgs = {
timeInterval: 'lastMonth',
};

// Act
let bankStatements;
await request(app)
.get('/api/v1/bank-statements/me')
.auth(apiToken, {
type: 'bearer',
})
.query(requestArgs)
.expect(200)
.then(({ body }) => {
bankStatements = body;
});

let revenuesMeGrouped;
await request(app)
.get('/api/v1/ticket-revenues/me/grouped')
.auth(apiToken, {
type: 'bearer',
})
.query(requestArgs)
.expect(200)
.then(({ body }) => {
revenuesMeGrouped = body;
});

// Assert
expect(bankStatements.amountSum).toEqual(
revenuesMeGrouped.transactionValueSum,
);
}, 60000);
});
62 changes: 62 additions & 0 deletions test/ticket-revenues/ticket-revenues.e2e-spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import * as request from 'supertest';
import { configE2E } from '../../test/utils/config';
import {
APP_URL,
LICENSEE_PASSWORD,
LICENSEE_PERMIT_CODE,
} from '../../test/utils/constants';

configE2E();

/**
* @see {@link https://github.com/RJ-SMTR/api-cct/issues/80#issuecomment-1806153475 Requirements - GitHub}
*/
describe('Bank statements (e2e)', () => {
const app = APP_URL;
let apiToken;

beforeAll(async () => {
await request(app)
.post('/api/v1/auth/licensee/login')
.send({ permitCode: LICENSEE_PERMIT_CODE, password: LICENSEE_PASSWORD })
.expect(200)
.then(({ body }) => {
apiToken = body.token;
});
});

it('Should match amountSum in /ticket-revenues/me and transactionValueSum in ticket-revenues/grouped/me', async () => {
// Arrange
const requestArgs = {
timeInterval: 'lastMonth',
};

// Act
let revenuesMe;
await request(app)
.get('/api/v1/ticket-revenues/me')
.auth(apiToken, {
type: 'bearer',
})
.query(requestArgs)
.expect(200)
.then(({ body }) => {
revenuesMe = body;
});

let revenuesMeGrouped;
await request(app)
.get('/api/v1/ticket-revenues/me/grouped')
.auth(apiToken, {
type: 'bearer',
})
.query(requestArgs)
.expect(200)
.then(({ body }) => {
revenuesMeGrouped = body;
});

// Assert
expect(revenuesMe.amountSum).toEqual(revenuesMeGrouped.transactionValueSum);
}, 60000);
});

0 comments on commit 96008fc

Please sign in to comment.