Módulo para validação, formatação e análise de boletos bancários brasileiros.
Este módulo fornece funções para:
Formato Bruto:
Formato Linha Digitável:
O boleto utiliza o algoritmo Módulo 11 para o dígito verificador:
(boleto/is-valid? boleto-string)
Valida um boleto bancário ou de arrecadação.
Argumentos:
boleto-string (string): Boleto a validar, com ou sem formataçãoRetorna:
true se válido, false caso contrárioExemplos:
(boleto/is-valid? "00190500954014481606906809350314337370000000100") ; => true
(boleto/is-valid? "0019 0.00009 01149.718601 68524.522114 6 75860000102656") ; => true
(boleto/is-valid? "00190.00009 01149.718601 68524.522114 6 75860000102656") ; => true
(boleto/is-valid? "inválido") ; => false
Notas:
(boleto/format-linha-digitavel boleto-string)
Formata um boleto para o padrão de linha digitável.
Argumentos:
boleto-string (string): Boleto a formatar (com ou sem formatação)Retorna:
Exemplos:
(boleto/format-linha-digitavel "00190000090114971860168524522114675860000102656")
; => "00190.00009 01149.718601 68524.522114 6 75860000102656"
(boleto/format-linha-digitavel "00190.00009 01149.718601 68524.522114 6 75860000102656")
; => "00190.00009 01149.718601 68524.522114 6 75860000102656"
(boleto/parse-boleto boleto-string)
Extraia e analise detalhes de um boleto válido.
Argumentos:
boleto-string (string): Boleto a analisar (com ou sem formatação)Retorna:
{:bank-code "341"
:bank-name "Banco Itaú"
:currency "9"
:due-date-factor 1031
:due-date "2000-08-03"
:value 8000002603
:barcode "34195103180000026035175123456787123412345600"}
Exemplos:
(boleto/parse-boleto "34195.17515 23456.787128 34123.456005 5 10318000002603")
; => {:bank-code "341"
; :bank-name "Banco Itaú"
; :due-date "2000-08-03"
; :value 8000002603}
(boleto/parse-boleto "00190500954014481606906809350314337370000000100")
; => {:bank-code "001"
; :bank-name "Banco do Brasil"
; :due-date "1998-02-21"
; :value 314337370}
barcode->linha-digitavelConverta um código de barras para o formato de linha digitável.
Parâmetros:
barcode - String contendo o código de barrasRetorna: String de linha digitável formatada
(barcode->linha-digitavel "34195103180000026035175123456787123412345600")
; => "34195175152345678712834123456005510318000002603"
(boleto/remove-symbols boleto-string)
Remove caracteres de formatação de um boleto.
Argumentos:
boleto-string (string): Boleto com formataçãoRetorna:
Exemplos:
(boleto/remove-symbols "00190.00009 01149.718601 68524.522114 6 75860000102656")
; => "001900000901149718601685245221146758600001026560"
(boleto/is-valid? "123")
; => false (muito curto)
(boleto/is-valid? "00190000090114971860168524522114675860000102655")
; => false (dígito verificador inválido)
(boleto/parse-boleto "inválido")
; => nil
(require '[brazilian-utils.boleto :as boleto])
(defn processar-pagamento [boleto-str]
(if (boleto/is-valid? boleto-str)
(let [detalhes (boleto/parse-boleto boleto-str)]
{:status :válido
:banco (:bank-name detalhes)
:valor (/ (:value detalhes) 100)
:vencimento (:due-date detalhes)
:linha-digitavel (boleto/format-linha-digitavel boleto-str)})
{:status :inválido
:mensagem "Boleto inválido"}))
(processar-pagamento "34195.17515 23456.787128 34123.456005 5 10318000002603")
; => {:status :válido
; :banco "Banco Itaú"
; :valor 80000.26
; :vencimento "2000-08-03"
; :linha-digitavel "34195.17515 23456.787128 34123.456005 5 10318000002603"}
(defn exibir-detalhes [boleto-str]
(when-let [detalhes (boleto/parse-boleto boleto-str)]
(println (format "Banco: %s" (:bank-name detalhes)))
(println (format "Vencimento: %s" (:due-date detalhes)))
(println (format "Valor: R$ %.2f" (/ (:value detalhes) 100)))
(println (format "Linha Digitável: %s" (boleto/format-linha-digitavel boleto-str)))))
(exibir-detalhes "00190500954014481606906809350314337370000000100")
; Saída:
; Banco: Banco do Brasil
; Vencimento: 1998-02-21
; Valor: R$ 3143373.70
; Linha Digitável: 00190.00009 01149.718601 68524.522114 6 75860000102656
(defn validar-boletos-lote [boleto-list]
(reduce (fn [acc boleto]
(assoc acc boleto
{:válido? (boleto/is-valid? boleto)
:detalhes (when (boleto/is-valid? boleto)
(boleto/parse-boleto boleto))}))
{}
boleto-list))
(validar-boletos-lote
["00190500954014481606906809350314337370000000100"
"34195.17515 23456.787128 34123.456005 5 10318000002603"
"INVÁLIDO"])
(defn identificar-tipo [boleto-str]
(if (boleto/is-valid? boleto-str)
(let [terceiro-digito (get boleto-str 2)]
(case (parse-int (str terceiro-digito))
0 :boleto-bancario
1 :arrecadacao-prefeitura
2 :arrecadacao-servicos
3 :arrecadacao-emprestimo
5 :arrecadacao-governo
6 :arrecadacao-impostos
7 :arrecadacao-taxas
8 :arrecadacao-saude
9 :arrecadacao-educacao
:desconhecido))
:inválido))
(identificar-tipo "00190500954014481606906809350314337370000000100")
; => :boleto-bancario
(identificar-tipo "23793.12027 12345.678123 01234.567890 8 12345678901234")
; => :arrecadacao-servicos
A biblioteca suporta validação de mais de 250 bancos brasileiros, incluindo:
O fator de vencimento é calculado como número de dias desde 07/10/1997:
fator 0001 = 08/10/1997
fator 1000 = 10/03/2000
fator 1031 = 03/08/2000
O valor é armazenado em centavos (últimos 8 dígitos):
Valor 0000000100 = R$ 1,00
Valor 0000010000 = R$ 100,00
Valor 8000002603 = R$ 80.000,26
(validar-e-formatar "00190000090114971860168524522114675860000102656") ; => "00190.00009 01149.718601 68524.522114 6 75860000102656"
### Identificar Tipo de Boleto
```clojure
(defn identificar-tipo [boleto-str]
(if (boleto/valid-boleto? boleto-str)
(let [terceiro-digito (get boleto-str 2)]
(case (Integer/parseInt (str terceiro-digito))
0 "Boleto Bancário"
1 "Arrecadação - Prefeitura"
2 "Arrecadação - Serviço"
3 "Arrecadação - Empréstimo"
5 "Arrecadação - Governo"
6 "Arrecadação - Impostos"
7 "Arrecadação - Taxas"
8 "Arrecadação - Saúde"
9 "Arrecadação - Educação"
"Tipo desconhecido"))
"Boleto inválido"))
(identificar-tipo "00190500954014481606906809350314337370000000100")
; => "Boleto Bancário"
(identificar-tipo "23793.12027 12345.678123 01234.567890 8 12345678901234")
; => "Arrecadação - Serviço"
(def boleto-str "34195.17515 23456.787128 34123.456005 5 10318000002603")
(when-let [detalhes (boleto/parse-boleto boleto-str)]
(println (format "Banco: %s" (:bank-name detalhes)))
(println (format "Vencimento: %s" (:due-date detalhes)))
(println (format "Valor: R$ %.2f" (/ (:value detalhes) 100))))
; Saída:
; Banco: Banco Itaú
; Vencimento: 2000-08-03
; Valor: R$ 80000.26
A biblioteca valida automaticamente o dígito verificador usando:
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |