pycobranca 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. pycobranca-1.0.0/LICENSE +29 -0
  2. pycobranca-1.0.0/PKG-INFO +500 -0
  3. pycobranca-1.0.0/README.md +469 -0
  4. pycobranca-1.0.0/pycobranca/__init__.py +54 -0
  5. pycobranca-1.0.0/pycobranca/bancos/__init__.py +76 -0
  6. pycobranca-1.0.0/pycobranca/bancos/ailos.py +38 -0
  7. pycobranca-1.0.0/pycobranca/bancos/banco_do_brasil.py +65 -0
  8. pycobranca-1.0.0/pycobranca/bancos/banco_nordeste.py +45 -0
  9. pycobranca-1.0.0/pycobranca/bancos/banestes.py +45 -0
  10. pycobranca-1.0.0/pycobranca/bancos/banrisul.py +37 -0
  11. pycobranca-1.0.0/pycobranca/bancos/base.py +235 -0
  12. pycobranca-1.0.0/pycobranca/bancos/bradesco.py +71 -0
  13. pycobranca-1.0.0/pycobranca/bancos/brb.py +44 -0
  14. pycobranca-1.0.0/pycobranca/bancos/c6.py +45 -0
  15. pycobranca-1.0.0/pycobranca/bancos/caixa.py +86 -0
  16. pycobranca-1.0.0/pycobranca/bancos/citibank.py +43 -0
  17. pycobranca-1.0.0/pycobranca/bancos/credisis.py +43 -0
  18. pycobranca-1.0.0/pycobranca/bancos/hsbc.py +45 -0
  19. pycobranca-1.0.0/pycobranca/bancos/itau.py +79 -0
  20. pycobranca-1.0.0/pycobranca/bancos/safra.py +47 -0
  21. pycobranca-1.0.0/pycobranca/bancos/santander.py +58 -0
  22. pycobranca-1.0.0/pycobranca/bancos/sicoob.py +53 -0
  23. pycobranca-1.0.0/pycobranca/bancos/sicredi.py +61 -0
  24. pycobranca-1.0.0/pycobranca/bancos/unicred.py +39 -0
  25. pycobranca-1.0.0/pycobranca/boleto/__init__.py +6 -0
  26. pycobranca-1.0.0/pycobranca/boleto/codigo_barras.py +50 -0
  27. pycobranca-1.0.0/pycobranca/boleto/linha_digitavel.py +42 -0
  28. pycobranca-1.0.0/pycobranca/cnab/__init__.py +87 -0
  29. pycobranca-1.0.0/pycobranca/cnab/cnab240/__init__.py +19 -0
  30. pycobranca-1.0.0/pycobranca/cnab/cnab240/ailos.py +95 -0
  31. pycobranca-1.0.0/pycobranca/cnab/cnab240/banco_brasil.py +142 -0
  32. pycobranca-1.0.0/pycobranca/cnab/cnab240/base.py +391 -0
  33. pycobranca-1.0.0/pycobranca/cnab/cnab240/caixa.py +99 -0
  34. pycobranca-1.0.0/pycobranca/cnab/cnab240/pix.py +63 -0
  35. pycobranca-1.0.0/pycobranca/cnab/cnab240/santander.py +202 -0
  36. pycobranca-1.0.0/pycobranca/cnab/cnab240/sicoob.py +142 -0
  37. pycobranca-1.0.0/pycobranca/cnab/cnab240/sicredi.py +113 -0
  38. pycobranca-1.0.0/pycobranca/cnab/cnab240/unicred.py +17 -0
  39. pycobranca-1.0.0/pycobranca/cnab/cnab400/__init__.py +29 -0
  40. pycobranca-1.0.0/pycobranca/cnab/cnab400/banco_brasil.py +108 -0
  41. pycobranca-1.0.0/pycobranca/cnab/cnab400/banco_brasilia.py +120 -0
  42. pycobranca-1.0.0/pycobranca/cnab/cnab400/banco_c6.py +129 -0
  43. pycobranca-1.0.0/pycobranca/cnab/cnab400/banco_nordeste.py +111 -0
  44. pycobranca-1.0.0/pycobranca/cnab/cnab400/banrisul.py +119 -0
  45. pycobranca-1.0.0/pycobranca/cnab/cnab400/base.py +105 -0
  46. pycobranca-1.0.0/pycobranca/cnab/cnab400/bradesco.py +111 -0
  47. pycobranca-1.0.0/pycobranca/cnab/cnab400/citibank.py +84 -0
  48. pycobranca-1.0.0/pycobranca/cnab/cnab400/credisis.py +90 -0
  49. pycobranca-1.0.0/pycobranca/cnab/cnab400/itau.py +95 -0
  50. pycobranca-1.0.0/pycobranca/cnab/cnab400/pix.py +69 -0
  51. pycobranca-1.0.0/pycobranca/cnab/cnab400/santander.py +122 -0
  52. pycobranca-1.0.0/pycobranca/cnab/cnab400/sicoob.py +122 -0
  53. pycobranca-1.0.0/pycobranca/cnab/cnab400/unicred.py +110 -0
  54. pycobranca-1.0.0/pycobranca/cnab/formatacao.py +30 -0
  55. pycobranca-1.0.0/pycobranca/cnab/pagamento.py +211 -0
  56. pycobranca-1.0.0/pycobranca/cnab/retorno/__init__.py +71 -0
  57. pycobranca-1.0.0/pycobranca/cnab/retorno/base.py +146 -0
  58. pycobranca-1.0.0/pycobranca/cnab/retorno/cnab240.py +217 -0
  59. pycobranca-1.0.0/pycobranca/cnab/retorno/cnab400.py +268 -0
  60. pycobranca-1.0.0/pycobranca/cnab/retorno/ocorrencias.py +87 -0
  61. pycobranca-1.0.0/pycobranca/contracts/__init__.py +28 -0
  62. pycobranca-1.0.0/pycobranca/contracts/contrato_rest.json +158 -0
  63. pycobranca-1.0.0/pycobranca/contracts/contrato_rest.py +304 -0
  64. pycobranca-1.0.0/pycobranca/core/__init__.py +15 -0
  65. pycobranca-1.0.0/pycobranca/core/datas.py +48 -0
  66. pycobranca-1.0.0/pycobranca/core/documentos.py +58 -0
  67. pycobranca-1.0.0/pycobranca/core/dv.py +124 -0
  68. pycobranca-1.0.0/pycobranca/exceptions.py +17 -0
  69. pycobranca-1.0.0/pycobranca/ofx/__init__.py +24 -0
  70. pycobranca-1.0.0/pycobranca/ofx/conciliacao.py +86 -0
  71. pycobranca-1.0.0/pycobranca/ofx/nosso_numero.py +39 -0
  72. pycobranca-1.0.0/pycobranca/ofx/parser.py +214 -0
  73. pycobranca-1.0.0/pycobranca/pix/__init__.py +6 -0
  74. pycobranca-1.0.0/pycobranca/pix/payload.py +109 -0
  75. pycobranca-1.0.0/pycobranca/pix/qr.py +54 -0
  76. pycobranca-1.0.0/pycobranca/render/__init__.py +29 -0
  77. pycobranca-1.0.0/pycobranca/render/barcode.py +82 -0
  78. pycobranca-1.0.0/pycobranca/render/logos/001.png +0 -0
  79. pycobranca-1.0.0/pycobranca/render/logos/004.png +0 -0
  80. pycobranca-1.0.0/pycobranca/render/logos/021.png +0 -0
  81. pycobranca-1.0.0/pycobranca/render/logos/033.png +0 -0
  82. pycobranca-1.0.0/pycobranca/render/logos/041.png +0 -0
  83. pycobranca-1.0.0/pycobranca/render/logos/070.png +0 -0
  84. pycobranca-1.0.0/pycobranca/render/logos/085.png +0 -0
  85. pycobranca-1.0.0/pycobranca/render/logos/097.png +0 -0
  86. pycobranca-1.0.0/pycobranca/render/logos/104.png +0 -0
  87. pycobranca-1.0.0/pycobranca/render/logos/136.png +0 -0
  88. pycobranca-1.0.0/pycobranca/render/logos/237.png +0 -0
  89. pycobranca-1.0.0/pycobranca/render/logos/336.png +0 -0
  90. pycobranca-1.0.0/pycobranca/render/logos/341.png +0 -0
  91. pycobranca-1.0.0/pycobranca/render/logos/399.png +0 -0
  92. pycobranca-1.0.0/pycobranca/render/logos/422.png +0 -0
  93. pycobranca-1.0.0/pycobranca/render/logos/748.png +0 -0
  94. pycobranca-1.0.0/pycobranca/render/logos/756.png +0 -0
  95. pycobranca-1.0.0/pycobranca/render/logos/NOTICE.md +55 -0
  96. pycobranca-1.0.0/pycobranca/render/marcas.py +53 -0
  97. pycobranca-1.0.0/pycobranca/render/reportlab.py +1183 -0
  98. pycobranca-1.0.0/pycobranca.egg-info/PKG-INFO +500 -0
  99. pycobranca-1.0.0/pycobranca.egg-info/SOURCES.txt +122 -0
  100. pycobranca-1.0.0/pycobranca.egg-info/dependency_links.txt +1 -0
  101. pycobranca-1.0.0/pycobranca.egg-info/requires.txt +8 -0
  102. pycobranca-1.0.0/pycobranca.egg-info/top_level.txt +1 -0
  103. pycobranca-1.0.0/pyproject.toml +107 -0
  104. pycobranca-1.0.0/setup.cfg +4 -0
  105. pycobranca-1.0.0/tests/test_bancos_itau.py +133 -0
  106. pycobranca-1.0.0/tests/test_bancos_p1.py +158 -0
  107. pycobranca-1.0.0/tests/test_boleto_externo.py +58 -0
  108. pycobranca-1.0.0/tests/test_boletos_todos.py +54 -0
  109. pycobranca-1.0.0/tests/test_cnab_encargos.py +228 -0
  110. pycobranca-1.0.0/tests/test_cnab_encargos_externo.py +243 -0
  111. pycobranca-1.0.0/tests/test_cnab_estrutura.py +136 -0
  112. pycobranca-1.0.0/tests/test_cnab_remessa.py +306 -0
  113. pycobranca-1.0.0/tests/test_cnab_remessa_pix.py +197 -0
  114. pycobranca-1.0.0/tests/test_cnab_retorno.py +101 -0
  115. pycobranca-1.0.0/tests/test_contrato_rest.py +153 -0
  116. pycobranca-1.0.0/tests/test_core.py +79 -0
  117. pycobranca-1.0.0/tests/test_ofx.py +126 -0
  118. pycobranca-1.0.0/tests/test_pix.py +148 -0
  119. pycobranca-1.0.0/tests/test_render.py +291 -0
  120. pycobranca-1.0.0/tests/test_retorno_estrutura.py +104 -0
  121. pycobranca-1.0.0/tests/test_retorno_externos.py +70 -0
  122. pycobranca-1.0.0/tests/test_smoke.py +43 -0
  123. pycobranca-1.0.0/tests/test_validacao_cruzada.py +24 -0
  124. pycobranca-1.0.0/tests/test_validacao_externa.py +113 -0
@@ -0,0 +1,29 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026 M&S DO BRASIL LTDA — PyCobrança
4
+ All rights reserved.
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions are met:
8
+
9
+ 1. Redistributions of source code must retain the above copyright notice, this
10
+ list of conditions and the following disclaimer.
11
+
12
+ 2. Redistributions in binary form must reproduce the above copyright notice,
13
+ this list of conditions and the following disclaimer in the documentation
14
+ and/or other materials provided with the distribution.
15
+
16
+ 3. Neither the name of the copyright holder nor the names of its
17
+ contributors may be used to endorse or promote products derived from
18
+ this software without specific prior written permission.
19
+
20
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
24
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,500 @@
1
+ Metadata-Version: 2.4
2
+ Name: pycobranca
3
+ Version: 1.0.0
4
+ Summary: Plataforma de cobrança bancária brasileira em Python: boletos, CNAB 240/400 e PIX/Bolepix.
5
+ Author-email: M&S DO BRASIL LTDA <maxwbh@gmail.com>
6
+ Maintainer-email: maxwbh <maxwbh@gmail.com>
7
+ License: BSD-3-Clause
8
+ Project-URL: Homepage, https://github.com/Maxwbh/pycobranca
9
+ Project-URL: Mantenedor, https://msbrasil.inf.br
10
+ Project-URL: Documentation, https://github.com/Maxwbh/pycobranca/tree/main/docs
11
+ Project-URL: Repository, https://github.com/Maxwbh/pycobranca
12
+ Keywords: boleto,boleto-bancario,cobranca,cnab,cnab240,cnab400,remessa,retorno,pix,bolepix,qrcode,linha-digitavel,codigo-de-barras,banco,brasil,febraban
13
+ Classifier: Development Status :: 2 - Pre-Alpha
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: License :: OSI Approved :: BSD License
16
+ Classifier: Natural Language :: Portuguese (Brazilian)
17
+ Classifier: Programming Language :: Python :: 3
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Topic :: Office/Business :: Financial
20
+ Requires-Python: >=3.14
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ Requires-Dist: reportlab>=4.0
24
+ Requires-Dist: qrcode>=7.4
25
+ Provides-Extra: dev
26
+ Requires-Dist: pytest>=8.0; extra == "dev"
27
+ Requires-Dist: pytest-cov>=5.0; extra == "dev"
28
+ Requires-Dist: ruff==0.16.0; extra == "dev"
29
+ Requires-Dist: build>=1.2; extra == "dev"
30
+ Dynamic: license-file
31
+
32
+ <div align="center">
33
+
34
+ <img src="docs/images/pycobranca-banner.svg" alt="PyCobrança — boletos, CNAB e PIX em Python puro" width="820">
35
+
36
+ # A plataforma Open Source mais completa para cobrança bancária em Python
37
+
38
+ **Boletos, CNAB 240/400 e PIX para 18 bancos — com uma única biblioteca, em Python puro.**
39
+
40
+ [![Versão](https://img.shields.io/badge/versão-1.0.0-2ea44f)](CHANGELOG.md)
41
+ [![Python](https://img.shields.io/badge/python-3.14+-3776AB?logo=python&logoColor=white)](https://www.python.org/)
42
+ [![Licença](https://img.shields.io/badge/licença-BSD--3--Clause-blue)](LICENSE)
43
+ [![Python puro](https://img.shields.io/badge/Python_puro-sem_libs_de_sistema-2ea44f)](pyproject.toml)
44
+ [![PIX](https://img.shields.io/badge/PIX-Bolepix-32BCAD)](docs/07-pix.md)
45
+ [![Estrelas](https://img.shields.io/github/stars/Maxwbh/pycobranca?style=flat&logo=github&color=2ea44f)](https://github.com/Maxwbh/pycobranca/stargazers)
46
+
47
+ ⭐ **18 bancos** · 📄 **CNAB 240/400** · 💳 **PIX / Bolepix** · ⚡ **Python puro** · 📦 **Um único `pip install`** · 🔓 **BSD-3**
48
+
49
+ </div>
50
+
51
+ **PyCobrança** é a plataforma Open Source de **cobrança bancária brasileira** em Python. Uma única
52
+ biblioteca cobre todo o ciclo: emite boletos (código de barras, linha digitável e PDF), gera e lê
53
+ arquivos **CNAB** (remessa e retorno 240/400) e produz **PIX/Bolepix** (QR Code e segmento PIX no
54
+ CNAB) — para **18 bancos**, com uma API limpa e **sem dependências de sistema** (tudo em Python
55
+ puro, instalado com um `pip install`).
56
+
57
+ Projetada para ser o **motor de cobrança** de sistemas Python — do script pontual à emissão em
58
+ lote de milhares de boletos — com identidade e arquitetura próprias.
59
+
60
+ <div align="center">
61
+
62
+ <img src="docs/images/demo.gif" alt="Do pip install ao boleto, PIX e remessa CNAB em segundos" width="720">
63
+
64
+ </div>
65
+
66
+ ---
67
+
68
+ ## 🏗️ Arquitetura
69
+
70
+ A PyCobrança é a **camada única** que emite os artefatos de cobrança. A sua aplicação (ERP, API,
71
+ back-end) chama a biblioteca; ela cuida de boletos, CNAB, PIX e PDF.
72
+
73
+ <div align="center">
74
+
75
+ <img src="docs/images/pycobranca-arquitetura.svg" alt="Arquitetura: ERPs e frameworks consomem a PyCobrança, que emite boletos, CNAB, PIX e PDF" width="820">
76
+
77
+ </div>
78
+
79
+ ---
80
+
81
+ ## 💡 Por que a PyCobrança?
82
+
83
+ A cobrança bancária brasileira mudou. O **PIX** e o **Bolepix** entraram no dia a dia, o **Python
84
+ moderno** consolidou-se como base de back-ends e integrações, e as **APIs REST** tornaram-se o
85
+ padrão para conectar sistemas de emissão a ERPs e plataformas de pagamento.
86
+
87
+ A PyCobrança nasceu para atender esse cenário com uma **plataforma única e coesa** — pensada desde
88
+ o início para PIX, CNAB 240/400, PDF em Python puro e consumo via API. Em vez de juntar
89
+ peças soltas, oferece uma API consistente, testada banco a banco e pronta para produção.
90
+
91
+ ## ✨ Destaques
92
+
93
+ - 🏦 **18 bancos** com emissão de boleto ponta a ponta (código de barras de 44 posições, linha
94
+ digitável com DVs e regras de carteira/nosso número por banco).
95
+ - 📄 **PDF em Python puro** via ReportLab — dois modelos visuais (*clássico* e *moderno*), **carnê**
96
+ (3 parcelas por A4) e **tema** (marca da empresa, cor, marca d'água, rodapé).
97
+ - 🖼️ **Logo no cabeçalho** (opt-in): use o seu próprio arquivo (`banco.logo`) ou os **logos de 17
98
+ bancos já empacotados** (`logo_do_banco`), em alta resolução com transparência.
99
+ - 🧾 **Remessa CNAB** 400 (12 bancos) e 240 (7 bancos), com agrupamento por convênio/carteira e
100
+ **juros, multa e desconto** (1º/2º/3º, IOF e abatimento).
101
+ - 📥 **Retorno CNAB** 400/240 com parsing por banco e tradução dos códigos de ocorrência.
102
+ - 🧮 **Extrato OFX** (v1/v2) com extração de nosso número e **conciliação** contra os boletos
103
+ emitidos — fecha o ciclo emissão → retorno → extrato.
104
+ - 🟢 **PIX / Bolepix**: BR Code (EMV) copia-e-cola com CRC16, QR Code embutido no PDF e **segmento
105
+ PIX na remessa** (registro tipo 8 no CNAB 400; segmento Y-03 no CNAB 240).
106
+ - 🔌 **Pronto para API REST** (OpenAPI 3.0): serializadores JSON dos artefatos para consumo HTTP.
107
+ - ⚡ **Instalação única**: boleto, CNAB, PIX, PDF e QR num só `pip install` — tudo Python puro,
108
+ sem bibliotecas de sistema (nada de cairo, Pango ou wkhtmltopdf).
109
+
110
+ ## 🖼️ Exemplos reais
111
+
112
+ PDFs gerados pela própria PyCobrança (dados fictícios, saída real do backend ReportLab):
113
+
114
+ <div align="center">
115
+
116
+ | Boleto (modelo moderno) | Boleto com PIX (Bolepix) |
117
+ |:---:|:---:|
118
+ | <img src="docs/images/screenshots/boleto-moderno.png" alt="Boleto no modelo moderno gerado pela PyCobrança" width="330"> | <img src="docs/images/screenshots/boleto-pix.png" alt="Boleto híbrido com QR Code PIX" width="330"> |
119
+ | Recibo do Pagador + ficha, código de barras nativo | QR Code Bolepix embutido, célula PIX teal |
120
+ | **Boleto com logo do banco** | **Carnê (3 por A4)** |
121
+ | <img src="docs/images/screenshots/boleto-logo.png" alt="Boleto com o logo do banco no cabeçalho (recibo e ficha)" width="330"> | <img src="docs/images/screenshots/carne.png" alt="Carnê com 3 parcelas por página A4" width="330"> |
122
+ | Logo no cabeçalho do recibo e da ficha (`logo_do_banco`) | Canhoto à esquerda, uma A4 a cada 3 parcelas |
123
+
124
+ </div>
125
+
126
+ ## 📦 Instalação
127
+
128
+ ```bash
129
+ pip install pycobranca # tudo: boleto, CNAB, PIX, PDF e QR Code (Bolepix)
130
+ ```
131
+
132
+ Uma única instalação entrega o que um sistema de cobrança precisa — código de barras, linha
133
+ digitável, remessa/retorno **CNAB**, **PIX** (copia-e-cola e QR) e **PDF**. Sem extras a decorar e
134
+ **sem bibliotecas de sistema**: ReportLab e qrcode são Python puro, resolvidos pelo próprio `pip`.
135
+
136
+ Requer **Python 3.14+**.
137
+
138
+ ## 🚀 Início rápido
139
+
140
+ ### Emitir um boleto (PDF)
141
+
142
+ ```python
143
+ from datetime import date
144
+ from pycobranca.bancos import Bancos
145
+ from pycobranca.render import render_boleto_pdf
146
+
147
+ Banco = Bancos.find("341") # Itaú (descoberta pelo código FEBRABAN)
148
+ boleto = Banco(
149
+ valor="127.50",
150
+ cedente="Empresa Exemplo LTDA",
151
+ cedente_documento="11.222.333/0001-81",
152
+ agencia="0057",
153
+ conta="12345",
154
+ carteira="109",
155
+ nosso_numero="12345678",
156
+ data_vencimento=date(2026, 8, 15),
157
+ sacado="Cliente Final da Silva",
158
+ sacado_documento="529.982.247-25",
159
+ )
160
+
161
+ boleto.validar()
162
+ print(boleto.linha_digitavel) # 34191.09123 ... com DVs
163
+ print(boleto.codigo_barras) # 44 posições (DV geral módulo 11)
164
+
165
+ pdf = render_boleto_pdf(boleto.contexto_render(), modelo="moderno")
166
+ open("boleto.pdf", "wb").write(pdf)
167
+ ```
168
+
169
+ Para exibir um logo no cabeçalho, use o seu arquivo ou um logo empacotado:
170
+
171
+ ```python
172
+ from pycobranca.render import logo_do_banco
173
+
174
+ boleto = Banco(..., logo=logo_do_banco("341")) # ou logo=b"...bytes PNG/JPEG..." / "caminho.png"
175
+ ```
176
+
177
+ ### Gerar uma remessa CNAB
178
+
179
+ ```python
180
+ from datetime import date
181
+ from pycobranca.cnab import Pagamento, RemessaItau400
182
+
183
+ remessa = RemessaItau400(
184
+ empresa_mae="Empresa Exemplo LTDA",
185
+ documento_cedente="11222333000181",
186
+ agencia="0057",
187
+ conta_corrente="12345",
188
+ digito_conta="7",
189
+ carteira="109",
190
+ pagamentos=[
191
+ Pagamento(
192
+ nosso_numero="12345678",
193
+ valor=199.90,
194
+ data_vencimento=date(2026, 8, 15),
195
+ documento_sacado="52998224725",
196
+ nome_sacado="Cliente Final da Silva",
197
+ endereco_sacado="Rua das Flores, 100",
198
+ bairro_sacado="Centro",
199
+ cep_sacado="30110000",
200
+ cidade_sacado="Belo Horizonte",
201
+ uf_sacado="MG",
202
+ ),
203
+ ],
204
+ )
205
+ open("CB.REM", "w", newline="").write(remessa.gera_arquivo())
206
+ ```
207
+
208
+ ### Juros, multa e desconto na remessa
209
+
210
+ Cada encargo é opcional e informado direto no `Pagamento`. Com os defaults, o boleto sai sem
211
+ encargos (o caixa preenche na hora do recebimento); ao informá-los, eles entram na remessa nas
212
+ posições do padrão FEBRABAN.
213
+
214
+ ```python
215
+ from datetime import date
216
+ from pycobranca.cnab import Pagamento
217
+
218
+ Pagamento(
219
+ nosso_numero="12345678",
220
+ valor=199.90,
221
+ data_vencimento=date(2026, 8, 15),
222
+ # ... dados do sacado ...
223
+ # Juros de mora: por dia (tipo_mora="1") ou taxa mensal % (tipo_mora="2")
224
+ tipo_mora="1",
225
+ valor_mora=1.53, # R$ 1,53 ao dia
226
+ # tipo_mora="2", percentual_mora=1.00, # 1% ao mês
227
+ # Multa por atraso (percentual)
228
+ codigo_multa="2",
229
+ percentual_multa=2.00, # 2%
230
+ data_multa=date(2026, 8, 16), # opcional; padrão = vencimento
231
+ # Descontos (até 3) — código, valor e data por faixa
232
+ cod_desconto="1",
233
+ valor_desconto=10.00,
234
+ data_desconto=date(2026, 8, 1),
235
+ cod_segundo_desconto="1",
236
+ valor_segundo_desconto=5.00,
237
+ data_segundo_desconto=date(2026, 8, 10),
238
+ valor_abatimento=0.0,
239
+ valor_iof=0.0,
240
+ )
241
+ ```
242
+
243
+ | Encargo | Código/tipo | Valor | Data |
244
+ |---|---|---|---|
245
+ | **Multa** | `codigo_multa` (`0` isento · `1` valor · `2` %) | `percentual_multa` (%) | `data_multa` |
246
+ | **Juros/Mora** | `tipo_mora` (`1` valor/dia · `2` taxa mensal % · `3` isento) | `valor_mora` · `percentual_mora` | `data_mora` |
247
+ | **Desconto 1º/2º/3º** | `cod_desconto` / `cod_segundo_desconto` / `cod_terceiro_desconto` | `valor_desconto` / `valor_segundo_desconto` / `valor_terceiro_desconto` | `data_desconto` / `data_segundo_desconto` / `data_terceiro_desconto` |
248
+ | **IOF** · **Abatimento** | — | `valor_iof` · `valor_abatimento` | — |
249
+
250
+ **Suporte por banco.** O `Pagamento` sempre aceita os campos; eles entram no arquivo onde o layout
251
+ tem posição.
252
+
253
+ **CNAB 240** — suporte **completo e uniforme** (segmentos P/R):
254
+
255
+ | Banco (CNAB 240) | Mora (valor/%) | Multa | Desc. 1º | Desc. 2º | Desc. 3º | IOF | Abat. |
256
+ |---|:--:|:--:|:--:|:--:|:--:|:--:|:--:|
257
+ | Banco do Brasil (001) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
258
+ | Caixa (104) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
259
+ | Santander (033) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
260
+ | Sicoob (756) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
261
+ | Sicredi (748) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
262
+ | Unicred (136) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
263
+ | Ailos (085) | ✅ | ✅⁴ | ✅ | ✅ | ✅ | ✅ | ✅ |
264
+
265
+ **CNAB 400** — varia por layout do banco:
266
+
267
+ | Banco (CNAB 400) | Mora | Multa | Desc. 1º | Desc. 2º | IOF | Abat. |
268
+ |---|:--:|:--:|:--:|:--:|:--:|:--:|
269
+ | Santander (033) | ✅ | ✅ | ✅ | 📅² | ✅ | ✅ |
270
+ | Bradesco (237) | ✅ | ✅ | ✅ | — | ✅ | ✅ |
271
+ | Sicoob (756) | ✅ | ✅ | ✅ | — | ✅ | ✅ |
272
+ | Banrisul (041) | ✅ | ✅ | ✅ | — | ✅ | ✅ |
273
+ | Banco do Nordeste (004) | ✅ | ✅ | ✅ | — | ✅ | ✅ |
274
+ | C6 (336) | ✅ | ✅ | ✅ | — | — | ✅ |
275
+ | Unicred (136) | ✅ | ✅ | ✅ | — | — | ✅ |
276
+ | CrediSIS (097) | ✅ | ✅ | ✅³ | — | — | — |
277
+ | Itaú (341) | ✅ | 📝¹ | ✅ | — | ✅ | ✅ |
278
+ | Banco do Brasil (001) | ✅ | 📝¹ | ✅ | — | ✅ | ✅ |
279
+ | Citibank (745) | ✅ | — | ✅ | ✅ | ✅ | ✅ |
280
+ | BRB/Brasília (070) | ✅ | — | ✅ | — | — | ✅ |
281
+
282
+ <sub>✅ campo posicional na remessa · — sem campo no layout · **Desc. 3º**: apenas CNAB 240.
283
+ 📝¹ Itaú/BB (400): multa vai por **instrução** (código), não como percentual posicional.
284
+ 📅² Santander (400): 2º desconto só a **data**. ³ CrediSIS: 1º desconto **sem** campo de data.
285
+ ⁴ Ailos (240): segmento R (multa + 2º/3º desconto) emitido só quando há multa.
286
+ Banestes (021), HSBC (399) e Safra (422) só emitem boleto (sem remessa CNAB).</sub>
287
+
288
+ > Detalhes por layout (posições 240/400, valor × percentual por banco) em
289
+ > [`docs/06-cnab.md`](docs/06-cnab.md); via API REST, o objeto `encargos` em
290
+ > [`docs/04-api-rest.md`](docs/04-api-rest.md).
291
+
292
+ ### Ler um retorno CNAB
293
+
294
+ ```python
295
+ from pycobranca.cnab.retorno import Retorno
296
+
297
+ retorno = Retorno.ler("CB.RET") # layout (240/400) e banco detectados pelo arquivo
298
+ for r in retorno.registros:
299
+ print(r.nosso_numero, r.codigo_ocorrencia, retorno.descricao_ocorrencia(r), r.valor_recebido)
300
+ ```
301
+
302
+ ### Ler um extrato OFX e conciliar
303
+
304
+ Lê o extrato bancário (OFX v1/v2), extrai o **nosso número** do memo de cada transação e **concilia**
305
+ contra os boletos emitidos — fechando o ciclo emissão → retorno → extrato.
306
+
307
+ ```python
308
+ from pycobranca.ofx import Extrato, concilia
309
+
310
+ extrato = Extrato.ler("extrato.ofx") # OFX v1 (SGML) ou v2 (XML), encoding Latin-1/UTF-8
311
+ print(extrato.org, extrato.saldo_valor)
312
+ for t in extrato.creditos:
313
+ print(t.data, t.valor, t.nosso_numero_extraido, t.memo)
314
+
315
+ # Conciliação contra os nossos números emitidos
316
+ resultado = concilia(extrato, ["12345678", "87654321"])
317
+ print(len(resultado.conciliadas), "casadas ·", resultado.pendentes, "pendentes")
318
+ ```
319
+
320
+ <div align="center">
321
+
322
+ <img src="docs/images/pycobranca-ciclo.svg" alt="Ciclo de cobrança: emissão → remessa CNAB → retorno CNAB → extrato OFX, conciliados pelo nosso número" width="820">
323
+
324
+ </div>
325
+
326
+ ### Boleto híbrido com PIX (Bolepix)
327
+
328
+ ```python
329
+ Banco = Bancos.find("237") # Bradesco
330
+ boleto = Banco(
331
+ valor="127.50",
332
+ cedente="Empresa Exemplo LTDA",
333
+ cedente_documento="11222333000181",
334
+ agencia="1234",
335
+ conta="56789",
336
+ carteira="09",
337
+ nosso_numero="12345678",
338
+ data_vencimento=date(2026, 8, 15),
339
+ sacado="Cliente Final",
340
+ sacado_documento="52998224725",
341
+ cedente_cidade="SAO PAULO",
342
+ pix_chave="11222333000181",
343
+ pix_txid="TX2026080100001",
344
+ )
345
+ pdf = render_boleto_pdf(boleto.contexto_render(), modelo="moderno") # QR embutido
346
+ ```
347
+
348
+ ## 🏦 Bancos suportados
349
+
350
+ Funcionalidade por banco (✅ = disponível/validado):
351
+
352
+ | Cód. | Banco | Boleto | Rem. 400 | Rem. 240 | Retorno | PIX | Logo |
353
+ |:----:|-------|:------:|:--------:|:--------:|:-------:|:---:|:----:|
354
+ | 001 | Banco do Brasil | ✅ | ✅ | ✅ | | ✅ | ✅ |
355
+ | 004 | Banco do Nordeste | ✅ | ✅ | | ✅ | | ✅ |
356
+ | 021 | Banestes | ✅ | | | | | ✅ |
357
+ | 033 | Santander | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
358
+ | 041 | Banrisul | ✅ | ✅ | | ✅ | | ✅ |
359
+ | 070 | BRB | ✅ | ✅¹ | | ✅ | | ✅ |
360
+ | 085 | Ailos | ✅ | | ✅ | ✅ | | ✅ |
361
+ | 097 | CrediSIS | ✅ | ✅ | | ✅ | | ✅ |
362
+ | 104 | Caixa | ✅ | | ✅ | ✅ | ✅ | ✅ |
363
+ | 136 | Unicred | ✅ | ✅ | ✅ | ✅ | | ✅ |
364
+ | 237 | Bradesco | ✅ | ✅ | | ✅ | ✅ | ✅ |
365
+ | 336 | C6 Bank | ✅ | ✅ | | | ✅ | ✅ |
366
+ | 341 | Itaú | ✅ | ✅ | | ✅ | ✅ | ✅ |
367
+ | 399 | HSBC | ✅ | | | ✅ | | ✅ |
368
+ | 422 | Safra | ✅ | | | | | ✅ |
369
+ | 745 | Citibank | ✅ | ✅ | | | | |
370
+ | 748 | Sicredi | ✅ | | ✅ | ✅ | | ✅ |
371
+ | 756 | Sicoob | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
372
+ | **Σ 18** | | **18** | **12** | **7** | **13** | **7** | **17** |
373
+
374
+ - **Boleto** — código de barras (44 pos.), linha digitável e PDF.
375
+ - **Rem. 400 / Rem. 240** — remessa CNAB validada **byte a byte** contra vetores de referência.
376
+ - **Retorno** — parser validado contra arquivo `.RET` **real**; o leitor auto-detecta 240/400 pelo
377
+ cabeçalho e também processa layouts compatíveis dos demais bancos.
378
+ - **PIX** — Bolepix (BR Code + QR no PDF + segmento PIX na remessa).
379
+ - **Logo** — logo empacotado via `logo_do_banco("NNN")`, em alta resolução com transparência
380
+ (17 dos 18 bancos; marca do banco, uso nominativo — origem e licença por arquivo em
381
+ [`render/logos/NOTICE.md`](pycobranca/render/logos/NOTICE.md)).
382
+ - ¹ BRB usa formato de remessa **DCB proprietário**.
383
+
384
+ Detalhes de carteiras, quirks e fixtures por banco na
385
+ [matriz de bancos](docs/05-bancos-suportados.md) e nos [documentos por banco](docs/bancos/README.md).
386
+
387
+ ## 🧩 O que a PyCobrança faz
388
+
389
+ | Recurso | Descrição |
390
+ |---------|-----------|
391
+ | **Boleto** | Código de barras (44 pos.), linha digitável (DVs), fator de vencimento e regras por banco. |
392
+ | **PDF** | ReportLab (Python puro): modelos *clássico* e *moderno*, carnê e tema. |
393
+ | **Remessa CNAB** | 400 (12 bancos) e 240 (7 bancos), com `Pagamento`/`PagamentoPix`. |
394
+ | **Retorno CNAB** | Parsing 400/240 por banco + tradução de ocorrências. |
395
+ | **PIX/Bolepix** | BR Code (EMV) + CRC16, QR no PDF e segmento PIX na remessa. |
396
+ | **API REST** | Serialização JSON dos artefatos (OpenAPI 3.0), pronta para consumo HTTP. |
397
+
398
+ ## ⚖️ Comparação
399
+
400
+ | Recurso | PyCobrança | PyBoleto | BrCobrança |
401
+ |---|:---:|:---:|:---:|
402
+ | Boleto (código de barras + linha digitável) | ✅ | ✅ | ✅ |
403
+ | CNAB 240/400 (remessa e retorno) | ✅ | ❌ | ✅ |
404
+ | PIX / Bolepix | ✅ | ❌ | ✅ |
405
+ | PDF do boleto | ✅ | ✅ | ✅ |
406
+ | Linguagem | Python 3.14+ | Python (legado) | Ruby |
407
+ | Instalação única (um `pip install`) | ✅ | ✅ | — |
408
+ | Contrato para API REST | ✅ | ❌ | ❌ |
409
+ | Situação | 🟢 Desenvolvimento ativo | Manutenção | Manutenção |
410
+
411
+ ## 👥 Para quem é
412
+
413
+ Feita para quem precisa **emitir e conciliar cobrança bancária** dentro de um sistema Python:
414
+
415
+ **ERPs** · **sistemas financeiros** · **SaaS de cobrança** · **software de contabilidade** ·
416
+ **fintechs** · **marketplaces** · **e-commerce** · **prefeituras e órgãos públicos** ·
417
+ **universidades**.
418
+
419
+ Do script pontual à emissão em lote de milhares de boletos — a API é a mesma, sem serviço externo
420
+ nem dependências de sistema.
421
+
422
+ ## 🔭 Visão
423
+
424
+ A PyCobrança é construída para ser a **base de longo prazo** do ecossistema de cobrança bancária
425
+ brasileira em Python. O rumo do projeto:
426
+
427
+ - **Emissão de boletos** para os principais bancos, com regras por carteira e nosso número.
428
+ - **CNAB 240 e 400** — remessa e retorno, cobrindo os layouts do mercado.
429
+ - **PIX e Bolepix** — BR Code (EMV), QR Code e o segmento PIX no CNAB.
430
+ - **APIs REST** — artefatos serializáveis em JSON, prontos para expor via HTTP.
431
+ - **OpenAPI** — contrato validável dos artefatos (OpenAPI 3.0).
432
+ - **Renderização em PDF** — em Python puro, sem dependências de sistema.
433
+ - **Integração com ERPs e frameworks Python** — API limpa, pronta para embutir.
434
+ - **Evolução contínua** conforme os padrões da **FEBRABAN** e a regulação de meios de pagamento.
435
+
436
+ ## 🗺️ Roadmap
437
+
438
+ Entregue e em evolução:
439
+
440
+ - ✅ Emissão de boletos (18 bancos)
441
+ - ✅ CNAB 240 e 400 (remessa e retorno)
442
+ - ✅ PIX / Bolepix (BR Code, QR e segmento PIX na remessa)
443
+ - ✅ Renderização em PDF (boleto, carnê e tema)
444
+ - ✅ Serialização REST dos artefatos (OpenAPI 3.0)
445
+ - ✅ Validação FEBRABAN independente do boleto
446
+ - 🚧 DDA (Débito Direto Autorizado)
447
+ - 🚧 Open Finance
448
+ - 🚧 Integração direta com APIs bancárias
449
+ - 🚧 Novos bancos (mediante manual oficial com exemplo validável)
450
+
451
+ ## 📚 Documentação
452
+
453
+ | Documento | Conteúdo |
454
+ |-----------|----------|
455
+ | [Visão Geral](docs/00-visao-geral.md) · [Arquitetura](docs/01-arquitetura.md) | Objetivo, escopo e camadas |
456
+ | [Bancos Suportados](docs/05-bancos-suportados.md) · [por banco](docs/bancos/README.md) | Matriz, carteiras e especificação |
457
+ | [CNAB](docs/06-cnab.md) | Remessa e retorno 240/400 |
458
+ | [OFX](docs/13-ofx.md) | Extrato bancário e conciliação |
459
+ | [PIX / Bolepix](docs/07-pix.md) | QR Code e segmento PIX no CNAB |
460
+ | [API REST](docs/04-api-rest.md) | Contrato de dados e consumo via HTTP |
461
+ | [Renderização](docs/11-renderizacao.md) | Backend de PDF (ReportLab) |
462
+
463
+ ## 🤝 Contribuindo
464
+
465
+ Este é um projeto **novo** e contribuições são muito bem-vindas — desde relatar um comportamento
466
+ de banco divergente até adicionar um layout de CNAB. Comece pelo
467
+ [guia de contribuição](CONTRIBUTING.md). Em resumo:
468
+
469
+ ```bash
470
+ git clone https://github.com/Maxwbh/pycobranca.git
471
+ cd pycobranca
472
+ pip install -e ".[dev]"
473
+ ruff check . && ruff format --check . # lint + formatação
474
+ pytest # suíte de testes
475
+ ```
476
+
477
+ Boas primeiras contribuições: novos bancos (com exemplo oficial validável), casos de teste de
478
+ retorno reais (anonimizados) e melhorias de documentação. Abra uma _issue_ antes de mudanças
479
+ grandes para alinharmos o desenho.
480
+
481
+ ## 📄 Licença
482
+
483
+ Distribuída sob a licença **[BSD-3-Clause](LICENSE)** — permissiva: permite uso comercial,
484
+ modificação e redistribuição, exigindo apenas a manutenção do aviso de copyright.
485
+ © 2026 **[M&S DO BRASIL LTDA](https://msbrasil.inf.br)**.
486
+
487
+ ## 🙏 Créditos
488
+
489
+ Desenvolvida e mantida pela **[M&S DO BRASIL LTDA](https://msbrasil.inf.br)**. Projeto independente,
490
+ inspirado em soluções Open Source anteriores de cobrança bancária em Python e Ruby.
491
+
492
+ Feito com ☕ para o ecossistema de pagamentos brasileiro.
493
+
494
+ ---
495
+
496
+ <sub>
497
+ <b>Palavras-chave:</b> boleto Python · CNAB Python · FEBRABAN · remessa CNAB · retorno CNAB ·
498
+ PIX QR Code · boleto PIX · Bolepix · boleto bancário Python · integração bancária ·
499
+ cobrança bancária · CNAB 240 · CNAB 400 · linha digitável · código de barras · boleto PDF.
500
+ </sub>