Skip to content

Commit fc43b82

Browse files
committed
Adiciona funcionalidade LGPD para mascaramento de dados sensíveis
Implementa mascaramento automático de dados pessoais em boletos para conformidade com a LGPD (Lei Geral de Proteção de Dados - Lei nº 13.709/2018). Principais mudanças: - Novo módulo pyboleto/lgpd.py com funções de mascaramento: * mascara_cpf(): Mascara CPF mantendo 3 primeiros + 2 últimos dígitos * mascara_cnpj(): Mascara CNPJ mantendo 2 primeiros + 2 últimos dígitos * mascara_nome(): Mascara nome mantendo primeiro nome + inicial * mascara_endereco(): Mascara endereço mantendo tipo de logradouro * mascara_cep(): Mascara CEP mantendo 2 primeiros dígitos * mascara_cidade/bairro(): Mascara mantendo primeira letra * aplicar_lgpd(): Aplica mascaramento em objeto BoletoData - Integração com BoletoData (pyboleto/data.py): * Novos parâmetros: lgpd_habilitar e lgpd_campos * Método obter_dados_lgpd() para obter dados mascarados - Integração com geradores (pyboleto/pdf.py e pyboleto/html.py): * Aplica mascaramento automaticamente quando habilitado * Preserva dados originais no objeto * Método auxiliar _obter_valor_campo() para campos mascarados - Testes completos (tests/test_lgpd.py): * 12 testes unitários validando mascaramento * Testes de integração com BoletoData * 100% de cobertura das funções de mascaramento - Documentação (LGPD.md): * Guia completo de uso da funcionalidade * Exemplos práticos de implementação * Referência de API e regras de mascaramento - Exemplos atualizados: * bin/exemplo_lgpd.py: Demonstração da funcionalidade * bin/pdf_pyboleto_sample.py: Exemplos com LGPD habilitada * Datas atualizadas para 2025/2026 Uso: boleto.lgpd_habilitar = True # Habilita mascaramento boleto_pdf.drawBoleto(boleto) # Gera PDF com dados mascarados Campos mascarados: - Beneficiário: nome, CPF/CNPJ, endereço completo - Pagador: nome, CPF/CNPJ, endereço completo Esta implementação protege dados sensíveis em boletos de teste, documentação e exemplos versionados no Git.
1 parent 3dad382 commit fc43b82

File tree

8 files changed

+1203
-33
lines changed

8 files changed

+1203
-33
lines changed

LGPD.md

Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
# Funcionalidade LGPD - Lei Geral de Proteção de Dados
2+
3+
## Visão Geral
4+
5+
O PyBoleto agora inclui funcionalidade de mascaramento de dados pessoais para conformidade com a **LGPD (Lei Geral de Proteção de Dados - Lei nº 13.709/2018)**.
6+
7+
Esta funcionalidade permite mascarar automaticamente dados sensíveis como CPF, CNPJ, nomes e endereços ao gerar boletos, sendo especialmente útil para:
8+
9+
- 🔒 **Boletos de teste e desenvolvimento** - Evitar exposição de dados reais no código
10+
- 📚 **Documentação e exemplos** - Gerar documentação sem dados pessoais
11+
- 🔐 **Repositórios Git** - Proteger dados sensíveis versionados
12+
-**Conformidade legal** - Atender requisitos da LGPD
13+
14+
## Como Usar
15+
16+
### Uso Básico
17+
18+
Para habilitar o mascaramento LGPD, basta definir o parâmetro `lgpd_habilitar=True` ao criar o boleto:
19+
20+
```python
21+
import datetime
22+
from pyboleto.bank.bancodobrasil import BoletoBB
23+
from pyboleto.pdf import BoletoPDF
24+
25+
# Cria o boleto
26+
boleto = BoletoBB(7, 2)
27+
28+
# Dados normais do beneficiário
29+
boleto.cedente = 'João da Silva Santos'
30+
boleto.cedente_documento = '123.456.789-01'
31+
boleto.cedente_endereco = 'Rua das Flores, 123 - Centro - SP - 12345-678'
32+
33+
# Dados normais do pagador
34+
boleto.sacado_nome = 'Maria Oliveira Costa'
35+
boleto.sacado_documento = '987.654.321-00'
36+
boleto.sacado_endereco = 'Av Paulista, 1000'
37+
38+
# ... outros dados do boleto ...
39+
40+
# HABILITA LGPD - Mascara automaticamente os dados sensíveis
41+
boleto.lgpd_habilitar = True
42+
43+
# Gera o PDF (dados serão mascarados automaticamente)
44+
boleto_pdf = BoletoPDF('boleto-mascarado.pdf')
45+
boleto_pdf.drawBoleto(boleto)
46+
boleto_pdf.save()
47+
```
48+
49+
### Mascaramento Seletivo
50+
51+
Você pode escolher quais campos deseja mascarar:
52+
53+
```python
54+
# Mascara apenas CPF/CNPJ
55+
boleto.lgpd_habilitar = True
56+
boleto.lgpd_campos = ['cedente_documento', 'sacado_documento']
57+
58+
# Mascara apenas nomes
59+
boleto.lgpd_habilitar = True
60+
boleto.lgpd_campos = ['cedente', 'sacado_nome']
61+
62+
# Mascara apenas endereços
63+
boleto.lgpd_habilitar = True
64+
boleto.lgpd_campos = ['cedente_endereco', 'sacado_endereco']
65+
```
66+
67+
## Campos Mascarados
68+
69+
### Dados do Beneficiário/Cedente
70+
71+
| Campo Original | Exemplo Mascarado | Descrição |
72+
|----------------|-------------------|-----------|
73+
| `cedente` | João d. *** | Nome mascarado |
74+
| `cedente_documento` (CPF) | 123.***.***-01 | CPF mascarado |
75+
| `cedente_documento` (CNPJ) | 12.***.***/****-90 | CNPJ mascarado |
76+
| `cedente_logradouro` | Rua ***, *** - *** | Endereço mascarado |
77+
| `cedente_bairro` | C*** | Bairro mascarado |
78+
| `cedente_cidade` | S*** *** | Cidade mascarada |
79+
| `cedente_cep` | 12***-*** | CEP mascarado |
80+
81+
### Dados do Pagador/Sacado
82+
83+
| Campo Original | Exemplo Mascarado | Descrição |
84+
|----------------|-------------------|-----------|
85+
| `sacado_nome` | Maria O. *** | Nome mascarado |
86+
| `sacado_documento` (CPF) | 987.***.***-00 | CPF mascarado |
87+
| `sacado_documento` (CNPJ) | 98.***.***/****-00 | CNPJ mascarado |
88+
| `sacado_endereco` | Avenida ***, *** - *** | Endereço mascarado |
89+
| `sacado_bairro` | B*** | Bairro mascarado |
90+
| `sacado_cidade` | S*** *** | Cidade mascarada |
91+
| `sacado_cep` | 01***-*** | CEP mascarado |
92+
93+
**Nota:** A UF (estado) **não** é mascarada por não ser considerada dado sensível.
94+
95+
## Regras de Mascaramento
96+
97+
### CPF
98+
- **Formato:** XXX.***.***-YY
99+
- **Mantém:** 3 primeiros dígitos e 2 últimos
100+
- **Exemplo:** 123.456.789-01 → 123.***.***-01
101+
102+
### CNPJ
103+
- **Formato:** XX.***.***/****-YY
104+
- **Mantém:** 2 primeiros dígitos e 2 últimos
105+
- **Exemplo:** 12.345.678/0001-90 → 12.***.***/****-90
106+
107+
### Nome
108+
- **Formato:** PrimeiroNome P. ***
109+
- **Mantém:** Primeiro nome e primeira letra do segundo nome
110+
- **Exemplo:** João da Silva Santos → João d. ***
111+
112+
### Endereço
113+
- **Formato:** TipoLogradouro ***, *** - ***
114+
- **Mantém:** Tipo de logradouro (Rua, Avenida, etc.)
115+
- **Exemplo:** Rua das Flores, 123 → Rua ***, *** - ***
116+
117+
### CEP
118+
- **Formato:** XX***-***
119+
- **Mantém:** 2 primeiros dígitos
120+
- **Exemplo:** 12345-678 → 12***-***
121+
122+
### Cidade/Bairro
123+
- **Formato:** X*** ***
124+
- **Mantém:** Primeira letra
125+
- **Exemplo:** São Paulo → S*** ***
126+
127+
## Exemplos Completos
128+
129+
### Exemplo 1: Boleto Completo com LGPD
130+
131+
```python
132+
#!/usr/bin/env python
133+
# -*- coding: utf-8 -*-
134+
import datetime
135+
from pyboleto.bank.bancodobrasil import BoletoBB
136+
from pyboleto.pdf import BoletoPDF
137+
138+
# Cria o boleto
139+
boleto = BoletoBB(7, 2)
140+
boleto.nosso_numero = '87654'
141+
boleto.numero_documento = '27030195'
142+
boleto.convenio = '7777777'
143+
boleto.carteira = '18'
144+
145+
# Dados do Beneficiário
146+
boleto.cedente = 'João da Silva Santos'
147+
boleto.cedente_documento = '123.456.789-01'
148+
boleto.cedente_logradouro = 'Rua das Flores, 123'
149+
boleto.cedente_bairro = 'Centro'
150+
boleto.cedente_cidade = 'São Paulo'
151+
boleto.cedente_uf = 'SP'
152+
boleto.cedente_cep = '12345-678'
153+
boleto.agencia_cedente = '9999'
154+
boleto.conta_cedente = '99999'
155+
156+
# Datas
157+
boleto.data_vencimento = datetime.date(2026, 3, 27)
158+
boleto.data_documento = datetime.date(2025, 2, 12)
159+
boleto.data_processamento = datetime.date(2025, 2, 12)
160+
161+
# Dados do Pagador
162+
boleto.sacado_nome = 'Maria Oliveira Costa'
163+
boleto.sacado_documento = '987.654.321-00'
164+
boleto.sacado_endereco = 'Avenida Paulista, 1000'
165+
boleto.sacado_bairro = 'Bela Vista'
166+
boleto.sacado_cidade = 'São Paulo'
167+
boleto.sacado_uf = 'SP'
168+
boleto.sacado_cep = '01310-100'
169+
170+
# Valor e instruções
171+
boleto.valor_documento = 1250.00
172+
boleto.instrucoes = ["- Pagamento de serviços"]
173+
boleto.demonstrativo = ["- Serviço prestado"]
174+
175+
# HABILITA LGPD
176+
boleto.lgpd_habilitar = True
177+
178+
# Gera o PDF
179+
boleto_pdf = BoletoPDF('boleto-mascarado.pdf')
180+
boleto_pdf.drawBoleto(boleto)
181+
boleto_pdf.save()
182+
183+
print("Boleto gerado com dados mascarados!")
184+
```
185+
186+
### Exemplo 2: Ver Dados Mascarados
187+
188+
```python
189+
# Visualizar como os dados serão mascarados antes de gerar o boleto
190+
boleto.lgpd_habilitar = True
191+
dados_mascarados = boleto.obter_dados_lgpd()
192+
193+
print("Dados originais vs mascarados:")
194+
print(f"Nome: {boleto.cedente}{dados_mascarados['cedente']}")
195+
print(f"CPF: {boleto.cedente_documento}{dados_mascarados['cedente_documento']}")
196+
```
197+
198+
### Exemplo 3: HTML com LGPD
199+
200+
```python
201+
from pyboleto.html import BoletoHTML
202+
203+
# Cria boleto com LGPD habilitada
204+
boleto.lgpd_habilitar = True
205+
206+
# Gera HTML
207+
boleto_html = BoletoHTML('boleto-mascarado.html')
208+
boleto_html.drawBoleto(boleto)
209+
boleto_html.save()
210+
```
211+
212+
## Quando Usar
213+
214+
### ✅ Recomendado Usar LGPD
215+
216+
- Boletos de teste e desenvolvimento
217+
- Exemplos e documentação
218+
- Screenshots e tutoriais
219+
- Repositórios públicos no Git
220+
- Demonstrações e apresentações
221+
222+
### ❌ NÃO Usar LGPD
223+
224+
- Boletos de produção reais
225+
- Boletos que serão efetivamente pagos
226+
- Quando o destinatário precisa dos dados completos
227+
- Boletos para impressão e uso oficial
228+
229+
## Testes
230+
231+
O projeto inclui testes completos para a funcionalidade LGPD:
232+
233+
```bash
234+
# Rodar testes
235+
python -m unittest tests.test_lgpd -v
236+
237+
# Rodar exemplo
238+
python bin/exemplo_lgpd.py
239+
```
240+
241+
## API Reference
242+
243+
### Parâmetros do BoletoData
244+
245+
```python
246+
BoletoData(
247+
lgpd_habilitar=False, # Habilita mascaramento (padrão: False)
248+
lgpd_campos=None, # Lista de campos a mascarar (None = todos)
249+
# ... outros parâmetros ...
250+
)
251+
```
252+
253+
### Método obter_dados_lgpd()
254+
255+
```python
256+
dados_mascarados = boleto.obter_dados_lgpd()
257+
# Retorna: dict com dados mascarados ou {} se LGPD desabilitada
258+
```
259+
260+
### Funções do Módulo lgpd
261+
262+
```python
263+
from pyboleto.lgpd import (
264+
mascara_cpf, # Mascara CPF
265+
mascara_cnpj, # Mascara CNPJ
266+
mascara_documento, # Mascara CPF ou CNPJ automaticamente
267+
mascara_nome, # Mascara nome
268+
mascara_endereco, # Mascara endereço
269+
mascara_cep, # Mascara CEP
270+
mascara_cidade, # Mascara cidade
271+
mascara_bairro, # Mascara bairro
272+
aplicar_lgpd, # Aplica LGPD em um BoletoData
273+
)
274+
```
275+
276+
## Conformidade Legal
277+
278+
Esta implementação segue as diretrizes da **Lei nº 13.709/2018 (LGPD)**, especificamente:
279+
280+
- **Art. 6º** - Princípio da segurança e prevenção
281+
- **Art. 46** - Proteção de dados pessoais
282+
- **Art. 48** - Comunicação de incidente de segurança
283+
284+
O mascaramento ajuda a:
285+
1. Minimizar exposição de dados pessoais
286+
2. Reduzir riscos de vazamento de informações
287+
3. Proteger privacidade em ambientes de desenvolvimento
288+
4. Facilitar demonstrações sem expor dados reais
289+
290+
## Contribuindo
291+
292+
Contribuições são bem-vindas! Se você encontrar bugs ou tiver sugestões de melhorias para a funcionalidade LGPD, por favor:
293+
294+
1. Abra uma issue no GitHub
295+
2. Envie um pull request com testes
296+
3. Documente as mudanças
297+
298+
## Licença
299+
300+
Esta funcionalidade está sob a mesma licença BSD do projeto PyBoleto.
301+
302+
---
303+
304+
**Importante:** O mascaramento LGPD é uma ferramenta para proteger dados em ambientes de teste e desenvolvimento. Para boletos de produção, os dados devem estar completos e corretos conforme especificações da FEBRABAN.

0 commit comments

Comments
 (0)