Created
December 11, 2021 14:39
-
-
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)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.