criar-boletos
Version:
Gerar boletos para vários bancos
874 lines (668 loc) • 20.5 kB
JavaScript
//Este submodulo de boletos é inspirado no Stella-Boletos, da Caelum
//https://github.com/caelum/caelum-stella
const formatacoes = require('./formatacoesUtils');
const validacoes = require('../functions/validacoesUtils');
const StringUtils = require('../string-utils');
const pad = StringUtils.pad;
const Itau = require('../../boleto/bancos/itau');
const Caixa = require('../../boleto/bancos/caixa');
const Bradesco = require('../../boleto/bancos/bradesco');
const BancoBrasil = require('../../boleto/bancos/banco-do-brasil');
const Cecred = require('../../boleto/bancos/cecred');
const Sicoob = require('../../boleto/bancos/sicoob');
const Santander = require('../../boleto/bancos/santander');
const Sicredi = require('../../boleto/bancos/sicredi');
const Citi = require('../../boleto/bancos/citi');
const Gerador = require('../../boleto/gerador-de-boleto');
const GeradorDeLinhaDigitavel = require('../../boleto/gerador-de-linha-digitavel');
module.exports.especiesDeDocumento = {
//TODO: Ordenar por ordem alfabética
'DMI': 'Duplicata de Venda Mercantil por Indicação',
'DM': 'Duplicata de Venda Mercantil',
'DSI': 'Duplicata de Prestação de Serviços por Indicação de Comprovante',
'NP': 'Nota Promissória',
'ME': 'Mensalidade Escolar',
'DS': 'Duplicata de Prestação de Serviços Original',
'CT': 'Espécie de Contrato',
'LC': 'Letra de Câmbio',
'CPS': 'Conta de Prestação de Serviços de Profissional Liberal ou Declaração do Profissional',
'EC': 'Encargos Condominiais',
'DD': 'Documento de Dívida',
'CCB': 'Cédula de Crédito Bancário',
'CBI': 'Cédula de Crédito Bancário por Indicação',
'CH': 'Cheque',
'CM': 'Contrato de Mútuo',
'RA': 'Recibo de Aluguel Para Pessoa Jurídica (Contrato Aluguel e Recibo)',
'CD': 'Confissão de Dívida Apenas Para Falência de Declaração do Devedor',
'FS': 'Fatura de Serviço',
'TA': 'Termo de Acordo - Ex. Ação Trabalhista',
'CC': 'Contrato de Câmbio',
'DV': 'Diversos',
};
module.exports.bancos = {
Itau: Itau,
'341': Itau,
Caixa: Caixa,
'104': Caixa,
Bradesco: Bradesco,
'237': Bradesco,
BancoBrasil: BancoBrasil,
'001': BancoBrasil,
Cecred: Cecred,
'085': Cecred,
Sicoob: Sicoob,
'756': Sicoob,
Santander: Santander,
'033': Santander,
Sicredi: Sicredi,
'748': Sicredi,
Citi: Citi,
'745': Citi
};
module.exports.Gerador = Gerador;
//Baixar depois:
//Logotipo HSBC: http://pt.vector.me/browse/29385/hsbc
//Logotipo UNIBANCO: http://pt.vector.me/browse/27779/unibanco
var Pagador = (function () {
function Pagador() {
}
Pagador.prototype.getNome = function () {
return this._nome;
};
Pagador.prototype.comNome = function (_nome) {
this._nome = _nome;
return this;
};
Pagador.prototype.getIdentificacao = function () {
var identificacao = this.getNome(),
tipo = this.temRegistroNacional();
// TODO: Inserir novamente o registro nacional depois
// de implementar mecanismo para o texto não extravassar
// do campo.
if (tipo) {
identificacao += [
' (',
tipo.toUpperCase(),
': ',
this.getRegistroNacionalFormatado(),
')'
].join('') || '';
}
return (identificacao || '').toUpperCase();
};
Pagador.prototype.getRegistroNacional = function () {
return this._registroNacional;
};
Pagador.prototype.getRegistroNacionalFormatado = function () {
return formatacoes.registroNacional(this._registroNacional);
};
Pagador.prototype.temRegistroNacional = function () {
return validacoes.eRegistroNacional(this._registroNacional);
};
Pagador.prototype.comCNPJ = function (_cnpj) {
this.comRegistroNacional(_cnpj);
return this;
};
Pagador.prototype.comCPF = function (_cpf) {
this.comRegistroNacional(_cpf);
return this;
};
Pagador.prototype.comRegistroNacional = function (_registroNacional) {
this._registroNacional = _registroNacional;
return this;
};
Pagador.prototype.getDocumento = function () {
return this._documento;
};
Pagador.prototype.comDocumento = function (_documento) {
this._documento = _documento;
return this;
};
Pagador.prototype.getEndereco = function () {
return this._endereco;
};
Pagador.prototype.comEndereco = function (_endereco) {
this._endereco = _endereco;
return this;
};
Pagador.novoPagador = function () {
return new Pagador().comEndereco(Endereco.novoEndereco());
};
return Pagador;
})();
module.exports.Pagador = Pagador;
var Beneficiario = (function () {
function Beneficiario() {
}
Beneficiario.prototype.getIdentificacao = function () {
var identificacao = this.getNome(),
tipo = this.temRegistroNacional();
if (tipo) {
identificacao += [
' (',
tipo.toUpperCase(),
': ',
this.getRegistroNacionalFormatado(),
')'
].join('');
}
return (identificacao || '').toUpperCase();
};
Beneficiario.prototype.getRegistroNacional = function () {
return this._registroNacional;
};
Beneficiario.prototype.getRegistroNacionalFormatado = function () {
return formatacoes.registroNacional(this._registroNacional);
};
Beneficiario.prototype.temRegistroNacional = function () {
return validacoes.eRegistroNacional(this._registroNacional);
};
Beneficiario.prototype.comCNPJ = function (_cnpj) {
this.comRegistroNacional(_cnpj);
return this;
};
Beneficiario.prototype.comCPF = function (_cpf) {
this.comRegistroNacional(_cpf);
return this;
};
Beneficiario.prototype.comRegistroNacional = function (_registroNacional) {
this._registroNacional = _registroNacional;
return this;
};
Beneficiario.prototype.comAgencia = function (_agencia) {
this._agencia = _agencia;
return this;
};
Beneficiario.prototype.getAgencia = function () {
return this._agencia;
};
Beneficiario.prototype.comCodPosto = function (_posto) {
this._posto = _posto;
return this;
};
Beneficiario.prototype.getCodposto = function () {
return this._posto;
};
Beneficiario.prototype.getAgenciaFormatada = function () {
return this._agencia;
};
Beneficiario.prototype.comDigitoAgencia = function (_digitoAgencia) {
this._digitoAgencia = _digitoAgencia;
return this;
};
Beneficiario.prototype.getDigitoAgencia = function () {
return this._digitoAgencia;
};
Beneficiario.prototype.comCodigoBeneficiario = function (_codigo) {
this._codigo = _codigo;
return this;
};
Beneficiario.prototype.getCodigoBeneficiario = function () {
return this._codigo;
};
Beneficiario.prototype.getDigitoCodigoBeneficiario = function () {
return this._digitoCodigoBeneficiario;
};
Beneficiario.prototype.comDigitoCodigoBeneficiario = function (_digitoCodigoBeneficiario) {
this._digitoCodigoBeneficiario = _digitoCodigoBeneficiario;
return this;
};
Beneficiario.prototype.getCarteira = function () {
return this._carteira;
};
Beneficiario.prototype.comCarteira = function (_carteira) {
this._carteira = _carteira;
return this;
};
Beneficiario.prototype.getUsoBanco = function () {
return this._usoBanco;
};
Beneficiario.prototype.comUsoBanco = function (_usoBanco) {
this._usoBanco = _usoBanco;
return this;
};
Beneficiario.prototype.getNossoNumero = function () {
return this._nossoNumero;
};
Beneficiario.prototype.comNossoNumero = function (_nossoNumero) {
this._nossoNumero = _nossoNumero;
return this;
};
Beneficiario.prototype.getDigitoNossoNumero = function () {
return this._digitoNossoNumero;
};
Beneficiario.prototype.comDigitoNossoNumero = function (_digitoNossoNumero) {
this._digitoNossoNumero = _digitoNossoNumero;
return this;
};
Beneficiario.prototype.getNome = function () {
return this._nome;
};
Beneficiario.prototype.comNome = function (_nomeBeneficiario) {
this._nome = _nomeBeneficiario.slice(0,40);
return this;
};
Beneficiario.prototype.getEndereco = function () {
return this._endereco;
};
Beneficiario.prototype.comEndereco = function (_endereco) {
this._endereco = _endereco;
return this;
};
Beneficiario.prototype.getNumeroConvenio = function () {
return this._numeroConvenio;
};
Beneficiario.prototype.comNumeroConvenio = function (_numeroConvenio) {
this._numeroConvenio = _numeroConvenio;
return this;
};
Beneficiario.prototype.getDocumento = function () {
return this._documento;
};
Beneficiario.prototype.comDocumento = function (_documento) {
this._documento = _documento;
return this;
};
Beneficiario.prototype.getLogo = function () {
return this._logo;
};
Beneficiario.prototype.comLogo = function (_logo) {
this._logo = _logo;
return this;
};
Beneficiario.prototype.novoBeneficiario = function () {
return new Beneficiario().comEndereco(Endereco.novoEndereco());
};
Beneficiario.novoBeneficiario = function () {
return new Beneficiario();
};
return Beneficiario;
})();
module.exports.Beneficiario = Beneficiario;
var Datas = (function () {
function formatar(data) {
const datasInfo = data.split('-');
return `${datasInfo[2]}/${datasInfo[1]}/${datasInfo[0]}`;
}
function Datas() {
}
Datas.prototype.comDocumento = function (_documento) {
this._documento = _documento;
return this;
};
Datas.prototype.getDocumento = function () {
return this._documento;
};
Datas.prototype.getDocumentoFormatado = function () {
return formatar(this.getDocumento());
};
Datas.prototype.comProcessamento = function (_processamento) {
this._processamento = _processamento;
return this;
};
Datas.prototype.getProcessamento = function () {
return this._processamento;
};
Datas.prototype.getProcessamentoFormatado = function () {
return formatar(this.getProcessamento());
};
Datas.prototype.comVencimento = function (_vencimento) {
this._vencimento = _vencimento;
return this;
};
Datas.prototype.getVencimento = function(){
return this._vencimento;
};
Datas.prototype.getVencimentoFormatado = function(){
return formatar(this._vencimento);
};
Datas.novasDatas = function(){
return new Datas();
};
return Datas;
})();
module.exports.Datas = Datas;
var Endereco = (function () {
function Endereco() {
}
Endereco.prototype.getLogradouro = function () {
return this._logradouro || '';
};
Endereco.prototype.comLogradouro = function (_logradouro) {
this._logradouro = _logradouro;
return this;
};
Endereco.prototype.getBairro = function () {
return this._bairro || '';
};
Endereco.prototype.comBairro = function (_bairro) {
this._bairro = _bairro;
return this;
};
Endereco.prototype.getCep = function () {
return this._cep || '';
};
Endereco.prototype.getCepFormatado = function () {
return formatacoes.cep(this.getCep());
};
Endereco.prototype.comCep = function (_cep) {
this._cep = _cep;
return this;
};
Endereco.prototype.getCidade = function () {
return this._cidade || '';
};
Endereco.prototype.comCidade = function (_cidade) {
this._cidade = _cidade;
return this;
};
Endereco.prototype.getUf = function () {
return this._uf || '';
};
Endereco.prototype.comUf = function (_uf) {
this._uf = _uf;
return this;
};
Endereco.prototype.getPrimeiraLinha = function () {
var resultado = '';
if (this.getLogradouro()) {
resultado += this.getLogradouro();
}
if (this.getLogradouro() && this.getBairro()) {
resultado += ', ';
}
if (this.getBairro()) {
resultado += this.getBairro();
}
return resultado;
};
Endereco.prototype.getSegundaLinha = function () {
var resultado = '';
if (this.getCidade()) {
resultado += this.getCidade();
}
if (this.getCidade() && this.getUf()) {
resultado += '/';
}
if (this.getUf()) {
resultado += this.getUf();
}
if (resultado && this.getCep()) {
resultado += ' — ';
}
if (this.getCep()) {
resultado += this.getCepFormatado();
}
return resultado;
};
Endereco.prototype.getEnderecoCompleto = function () {
var enderecoCompleto = [];
this.getLogradouro() && enderecoCompleto.push(this.getLogradouro());
this.getBairro() && enderecoCompleto.push(this.getBairro());
this.getCep() && enderecoCompleto.push(this.getCepFormatado());
this.getCidade() && enderecoCompleto.push(this.getCidade());
this.getUf() && enderecoCompleto.push(this.getUf());
return enderecoCompleto.join(' ');
};
Endereco.novoEndereco = function () {
return new Endereco();
};
return Endereco;
})();
module.exports.Endereco = Endereco;
var Boleto = (function () {
var DATA_BASE = new Date(1997, 10 - 1, 7);
function Boleto() {
}
function formatarValor(valor) {
var valorArray = valor.toString().split('.'),
inteiros = valorArray[0],
decimais = valorArray.length > 1 ? valorArray[1] : '00';
decimais = pad(decimais, 2, '0', 'right').substr(0, 2);
return pad(inteiros + decimais, 10, '0');
}
function formatarBRL(valor) {
var zeroAEsquerda = true,
i = -1;
return 'R$ ' + (valor.substr(0, 8).split('').reduce(function (acc, cur) {
if (cur === '0' && zeroAEsquerda) {
return acc;
}
zeroAEsquerda = false;
return acc + cur;
}, '').split('').reduceRight(function (acc, cur) {
i++;
return cur + (i !== 0 && i % 3 === 0 ? '.' : '') + acc;
}, '') || 0) + ',' + valor.substr(8, 2);
}
Boleto.prototype.getFatorVencimento = function () {
var vencimento = this.getDatas().getVencimento(),
diferencaEmDias = (vencimento - DATA_BASE) / (1000 * 60 * 60 * 24);
if (diferencaEmDias > 9999) {
throw new Error('Data fora do formato aceito');
}
return Math.floor(diferencaEmDias).toString();
};
Boleto.prototype.comEspecieMoeda = function (_especieMoeda) {
this._especieMoeda = _especieMoeda;
return this;
};
Boleto.prototype.getEspecieMoeda = function () {
return this._especieMoeda;
};
Boleto.prototype.getCodigoEspecieMoeda = function () {
return this._codigoEspecieMoeda;
};
Boleto.prototype.comCodigoEspecieMoeda = function (_codigoEspecieMoeda) {
this._codigoEspecieMoeda = _codigoEspecieMoeda.toString();
return this;
};
Boleto.prototype.getAceite = function () {
return this._aceite;
};
Boleto.prototype.getAceiteFormatado = function () {
return this._aceite ? 'S' : 'N';
};
Boleto.prototype.comAceite = function (_aceite) {
this._aceite = _aceite;
return this;
};
Boleto.prototype.getEspecieDocumento = function () {
return this._especieDocumento;
};
Boleto.prototype.comEspecieDocumento = function (_especieDocumento) {
this._especieDocumento = _especieDocumento;
return this;
};
Boleto.prototype.getDatas = function () {
return this._datas;
};
Boleto.prototype.comDatas = function (_datas) {
this._datas = _datas;
return this;
};
Boleto.prototype.getValorFormatado = function () {
return formatarValor(this._valorBoleto);
};
Boleto.prototype.getValorFormatadoBRL = function () {
return formatarBRL(this.getValorFormatado());
};
Boleto.prototype.getValorBoleto = function () {
return this._valorBoleto;
};
Boleto.prototype.comValorBoleto = function (_valorBoleto) {
if (_valorBoleto < 0) {
throw new Error('Valor deve ser maior ou igual a zero');
}
if (_valorBoleto > 99999999.99) {
throw new Error('Valor deve ser menor do que noventa e nove milhoes');
}
this._valorBoleto = _valorBoleto;
return this;
};
Boleto.prototype.comValor = function (_valorBoleto) {
this.comValorBoleto(_valorBoleto);
};
Boleto.prototype.getNumeroDoDocumentoFormatado = function () {
return pad(this._numeroDoDocumento || '', 4, '0');
};
Boleto.prototype.getNumeroDoDocumento = function () {
return this._numeroDoDocumento || '';
};
Boleto.prototype.comNumeroDoDocumento = function (_numeroDoDocumento) {
this._numeroDoDocumento = _numeroDoDocumento;
return this;
};
Boleto.prototype.getInstrucoes = function () {
return this._instrucoes || [];
};
Boleto.prototype.comInstrucoes = function (_instrucoes) {
if (arguments.length > 1) {
_instrucoes = Array.prototype.slice.call(arguments, 0);
}
if (typeof _instrucoes === 'string') {
_instrucoes = [_instrucoes];
}
if (_instrucoes.length > 5) {
throw new Error('Máximo de cinco instruções permitidas');
}
this._instrucoes = _instrucoes;
return this;
};
Boleto.prototype.getDescricoes = function () {
return this._descricoes || [];
};
Boleto.prototype.comDescricoes = function (_descricoes) {
if (arguments.length > 1) {
_descricoes = Array.prototype.slice.call(arguments, 0);
}
if (typeof _descricoes === 'string') {
_descricoes = [_descricoes];
}
if (_descricoes.length > 5) {
throw new Error('Máximo de cinco instruções permitidas');
}
this._descricoes = _descricoes;
return this;
},
Boleto.prototype.getLocaisDePagamento = function () {
if (this._locaisDePagamento) return this._locaisDePagamento;
if (this.getBanco().getLocaisDePagamentoPadrao) return this.getBanco().getLocaisDePagamentoPadrao();
return [];
};
Boleto.prototype.comLocaisDePagamento = function (_locaisDePagamento) {
if (arguments.length > 1) {
_locaisDePagamento = Array.prototype.slice.call(arguments, 0);
}
if (typeof _locaisDePagamento === 'string') {
_locaisDePagamento = [_locaisDePagamento];
}
if (_locaisDePagamento.length > 2) {
throw new Error('Máximo de dois locais de pagamento permitidos');
}
this._locaisDePagamento = _locaisDePagamento;
return this;
};
Boleto.prototype.getQuantidadeDeMoeda = function () {
return this._quantidadeDeMoeda;
};
Boleto.prototype.comQuantidadeDeMoeda = function (_quantidadeDeMoeda) {
this._quantidadeDeMoeda = _quantidadeDeMoeda;
return this;
};
Boleto.prototype.getBanco = function () {
return this._banco;
};
Boleto.prototype.comBanco = function (_banco) {
this._banco = _banco;
return this;
};
Boleto.prototype.getPagador = function () {
return this._pagador;
};
Boleto.prototype.comPagador = function (_pagador) {
this._pagador = _pagador;
return this;
};
Boleto.prototype.comCodigoDeBarras = function (_codigoDeBarras) {
this._codigoDeBarras = _codigoDeBarras;
return this;
};
Boleto.prototype.getCodigoDeBarras = function () {
return this._codigoDeBarras;
};
Boleto.prototype.comLinhaDigitavel = function (_linhaDigitavel) {
this._linhaDigitavel = _linhaDigitavel;
return this;
};
Boleto.prototype.getLinhaDigitavel = function () {
return this._linhaDigitavel;
};
Boleto.prototype.getBeneficiario = function () {
return this._beneficiario;
};
Boleto.prototype.comBeneficiario = function (_beneficiario) {
this._beneficiario = _beneficiario;
return this;
};
Boleto.prototype.getValorDescontosFormatadoBRL = function () {
if (!this.getValorDescontos()) {
return '';
}
return formatarBRL(formatarValor(this.getValorDescontos()));
};
Boleto.prototype.getValorDescontos = function () {
return this._valorDescontos || 0;
};
Boleto.prototype.comValorDescontos = function (_valorDescontos) {
this._valorDescontos = _valorDescontos;
return this;
};
Boleto.prototype.getValorDeducoesFormatadoBRL = function () {
if (!this.getValorDeducoes()) {
return '';
}
return formatarBRL(formatarValor(this.getValorDeducoes()));
};
Boleto.prototype.getValorDeducoes = function () {
return this._valorDeducoes || 0;
};
Boleto.prototype.comValorDeducoes = function (_valorDeducoes) {
this._valorDeducoes = _valorDeducoes;
return this;
};
Boleto.prototype.getValorMultaFormatadoBRL = function () {
return formatarBRL(formatarValor(this.getValorMulta()));
};
Boleto.prototype.getValorMulta = function () {
return this._valorMulta || 0;
};
Boleto.prototype.comValorMulta = function (_valorMulta) {
this._valorMulta = _valorMulta;
return this;
};
Boleto.prototype.getValorAcrescimosFormatadoBRL = function () {
return formatarBRL(formatarValor(this.getValorAcrescimos()));
};
Boleto.prototype.getValorAcrescimos = function () {
return this._valorAcrescimos || 0;
};
Boleto.prototype.comValorAcrescimos = function (_valorAcrescimos) {
this._valorAcrescimos = _valorAcrescimos;
return this;
};
Boleto.prototype.getLinhaDigitavelFormatado = function () {
const numeroDocumento = this.getNumeroDoDocumentoFormatado();
const linha = GeradorDeLinhaDigitavel(this._banco.geraCodigoDeBarrasPara(this), this._banco);
const linhaDigitavel = {linha, numeroDocumento};
return linhaDigitavel;
};
Boleto.novoBoleto = function () {
return new Boleto()
.comEspecieMoeda('R$')
.comCodigoEspecieMoeda(9)
.comEspecieDocumento('DV');
};
return Boleto;
})();
module.exports.Boleto = Boleto;