@dueheads/citi-bank-boleto-sdk
Version:
SDK para registro de boletos na API do Citibank via mTLS.
90 lines (89 loc) • 4.36 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataInterpreter = void 0;
/**
* Classe responsável por interpretar e converter dados do formato BoletoPayload
* para o formato esperado pelo CitiBankBoletoSDK (BoletoData).
*/
class DataInterpreter {
/**
* Converte o objeto de dados da sua aplicação para o formato BoletoData do SDK.
* @param payload O objeto de dados no formato da sua aplicação.
* @returns Um objeto no formato BoletoData, pronto para ser usado pelo SDK.
*/
toSdkFormat(payload) {
const { pagador, documento, sacador } = payload.dados;
const { dadosBeneficiario } = payload;
const tipoPessoaPagador = pagador.tipo_inscricao === '1' ? 'F' : 'J';
const enderecoCompleto = [
pagador.endereco.logradouro,
pagador.endereco.numero,
pagador.endereco.complemento
].filter(Boolean).join(', ');
const boletoData = {
// --- Grupo Beneficiário ---
GrpBenf: {
CdtrNm: dadosBeneficiario.nome,
CdtrTaxId: dadosBeneficiario.inscricao,
CdtrTaxTp: dadosBeneficiario.tipo, // Beneficiário é sempre Pessoa Jurídica
CdtrId: dadosBeneficiario.convenio, // Identificação do convênio
},
// --- Grupo Pagador ---
GrpClPgd: {
DbtrNm: pagador.nome,
DbtrTaxId: pagador.inscricao,
DbtrTaxTp: tipoPessoaPagador,
GrpClPgdAdr: {
DbtrAdrTp: enderecoCompleto,
DbtrCtrySubDvsn: pagador.endereco.uf || '',
DbtrPstCd: pagador.endereco.cep || '',
DbtrTwnNm: pagador.endereco.cidade || '',
},
},
// --- Campos do Título (Todos os campos da documentação) ---
DbtrGrntNm: sacador?.nome,
DbtrMsg: documento.mensagem,
TitlAmt: parseFloat(documento.valor),
TitlBarCdInd: '0', // Fixo: '0' - Padrão Citi
TitlCcyCd: '09', // Fixo: '09' - Real
TitlCiaCdId: dadosBeneficiario.identificador,
TitlDueDt: documento.data_vencimento,
TitlIssDt: documento.data_emissao,
TitlOurNb: documento.nosso_numero,
TitlPortCd: '1', // Fixo: '1' - Cobrança Simples
TitlTpCd: documento.especie,
TitlYourNb: documento.numero,
TitlIOFAmt: parseFloat(documento.valor_iof || '0'),
TitlRbtAmt: parseFloat(documento.valor_abatimento || '0'),
// --- Instruções de Protesto e Baixa ---
// A documentação diz que são mutuamente exclusivas
TitlInstrProtInd: documento.protesto?.codigo,
TitlInstrWrtOffInd: documento.instrucao_baixa ? '1' : (documento.protesto ? '2' : '1'),
TitlInstrNmDtExec: documento.protesto?.dias || documento.instrucao_baixa?.dias,
// --- Grupos Opcionais de Encargos ---
GrpDscnt: documento.desconto ? [{
TitlDscntAmtOrPrct: parseFloat(documento.desconto.valor || documento.desconto.percentual || '0'),
TitlDscntEndDt: documento.desconto.data_limite,
TitlDscntTp: documento.desconto.codigo,
}] : undefined,
GrpItrs: (documento.juros && documento.juros.codigo !== '3') ? {
TitlItrsAmtOrPrct: parseFloat(documento.juros.valor_ao_dia || '0'),
TitlItrsTp: documento.juros.codigo,
} : undefined,
GrpFn: documento.multa ? {
TitlFnAmtOrPrct: parseFloat(documento.multa.valor || documento.multa.percentual || '0'),
TitlFnStrDt: this.calcularDataEncargo(documento.data_vencimento, documento.multa.dias_apos_vencimento),
TitlFnTp: documento.multa.codigo,
} : undefined,
};
return boletoData;
}
calcularDataEncargo(vencimento, dias) {
if (!dias)
return undefined;
const dataVencimento = new Date(`${vencimento}T12:00:00Z`);
dataVencimento.setDate(dataVencimento.getDate() + parseInt(dias, 10));
return dataVencimento.toISOString().split('T')[0];
}
}
exports.DataInterpreter = DataInterpreter;