Skip to content

Instantly share code, notes, and snippets.

@tporto
Created December 11, 2021 14:39
Show Gist options
  • Save tporto/c952bc392d24acdda717d45ff242e550 to your computer and use it in GitHub Desktop.
Save tporto/c952bc392d24acdda717d45ff242e550 to your computer and use it in GitHub Desktop.
Faz somente a comunicação com a API da Fitbank e trata os eventos (modules/fitabnk/services/fitbank-boleto.service.ts)
import { HttpService, Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { AxiosRequestConfig, AxiosResponse } from 'axios';
import { dateWithoutTime } from '@/common/util';
import { IBoletoResult, IBoletoCreatedInfo } from '../../boleto/types/boleto.interface';
@Injectable()
export class FitbankBoletoService {
private readonly logger = new Logger(FitbankBoletoService.name);
private endpoint = null;
private token = null;
constructor(private readonly config: ConfigService, private readonly httpService: HttpService) {
// Configuração da API
this.endpoint = this.config.get<string>('fitbank.endpoint');
this.token = this.config.get<string>('fitbank.token');
}
/**
* @function fetchBoleto
* @description Busca um boleto na FTIBANK
* @param {number} documentNumber: Número do documento (Boleto)
* @returns {IBoletoResult}
*/
async fetchBoleto(documentNumber: number): Promise<IBoletoResult> {
this.logger.log(`Buscando boleto... ${documentNumber}`);
const body = {
Method: 'GetBoletoById',
PartnerId: 599,
BusinessUnitId: 624,
DocumentNumber: documentNumber.toString(),
};
try {
const response: AxiosResponse = await this.sendBoletoRequest(body);
const success = response.data.Success === 'true';
const boletoInfo = success ? this.assembleBoletoInfo(response.data, body) : null;
return {
success,
documentNumber: documentNumber,
info: boletoInfo,
};
} catch (error) {
this.logger.error(`Erro ao buscar boleto: ${error}`);
return {
success: false,
message: `Erro ao buscar boleto: ${error}`.substring(0, 254),
};
}
}
/**
* @private
* @function assembleBoletoInfo
* @description Monta a estrutura do boleto com base no retorno da FITBANK
* @param {any} boletoData: Retorno do corpo do boleto
* @param {string} boletoRaw: Corpo do boleto no formato JSON
* @returns {IBoletoCreatedInfo}
*/
private assembleBoletoInfo(boletoData: any, boletoRaw: any): IBoletoCreatedInfo {
const boleto = JSON.parse(boletoData.Boleto);
return {
identificadorExterno: boleto.IdBoleto,
codigoBarra: boleto.Barcode,
linhaDigitavel: boleto.DigitableLine,
dataDocumento: null,
dataProcessamento: null,
dataVencimento: boleto.DueDate,
nossoNumero: boleto.OurNumber,
nossoNumeroDigito: null,
status: boleto.Status,
valorBoleto: boleto.PrincipalValue,
valorCobrado: boleto.TotalValue,
valorDesconto: null,
dataDesconto: null,
urlPDF: boleto.Url,
jsonCreation: boletoRaw,
jsonCreationResponse: boletoData,
};
}
/**
* @function changeDueDateBoleto
* @description Altera data de vencimento na FTIBANK
* @param {number} documentNumber: Identificador do documento
* @param {string} dueDate: Nova data de vencimento
* @returns {IBoletoResult}
*/
async changeDueDateBoleto(documentNumber: number, dueDate: string): Promise<IBoletoResult> {
this.logger.log('Alterando vencimento do boleto...');
// Valida o vencimento
if (dateWithoutTime(dueDate) < dateWithoutTime()) {
return {
success: false,
message: 'Data de vencimento menor que a data atual',
};
}
const body = {
Method: 'ChangeDueDateBoleto',
PartnerId: 599,
BusinessUnitId: 624,
DocumentNumber: documentNumber.toString(),
NewDueDate: dueDate,
};
try {
const response: AxiosResponse = await this.sendBoletoRequest(body);
return {
success: response.data.Success === 'true',
message: response.data.Message ?? null,
};
} catch (error) {
this.logger.error(`Erro ao alterar vencimento boleto: ${error}`);
return {
success: false,
message: `Erro ao alterar vencimento boleto: ${error}`,
};
}
}
/**
* @function cancelBoleto
* @description Cancela boleto na FTIBANK
* @param {number} documentNumber: Identificador do documento
* @returns {IBoletoResult}
*/
async cancelBoleto(documentNumber: number): Promise<IBoletoResult> {
this.logger.log('Cancelando boleto...');
const body = {
Method: 'CancelBoleto',
PartnerId: 599,
BusinessUnitId: 624,
DocumentNumber: documentNumber.toString(),
};
try {
const response: AxiosResponse = await this.sendBoletoRequest(body);
return {
success: response.data.Success === 'true',
message: response.data.Message ?? null,
};
} catch (error) {
this.logger.error(`Erro ao cancelar boleto: ${error}`);
return {
success: false,
message: `Erro ao cancelar boleto: ${error}`,
};
}
}
/**
* @private
* @function sendBoletoRequest
* @description Envia a requisição para API da FITBANK
* @param {any} body: Corpo da API
* @returns {AxiosResponse<any>}
*/
private async sendBoletoRequest(body: any): Promise<AxiosResponse<any>> {
const options: AxiosRequestConfig = {
headers: {
Authorization: `Basic ${this.token}`,
'Content-Type': 'application/json',
},
};
const bodyJSON = JSON.stringify(body);
return this.httpService.post(`${this.endpoint}/main/execute`, bodyJSON, options).toPromise();
}
}
@tporto
Copy link
Author

tporto commented Dec 11, 2021

O módulo da fitabank, somente trata a api, não faz nenhuma comunicação com o DB. Através do modulo boleto, é que faço o tratamento correto para criar o boleto no DB, mas todos os passos se iniciam no módulo de negociação.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment