Representa e valida todos os dados para a geração de um BR Code Pix.
Esta dataclass serve como um contêiner estruturado para os campos
obrigatórios e opcionais do padrão EMV® QRCPS, aplicando validações
automáticas na inicialização do objeto para garantir a conformidade
e integridade dos dados.
Attributes:
| Name |
Type |
Description |
recebedor_nome |
str
|
Nome do recebedor/comerciante. Deve ter entre 3 e 25 bytes.
|
recebedor_cidade |
str
|
Cidade do recebedor/comerciante. Deve ter entre 3 e 15 bytes.
|
pix_key |
str
|
Chave Pix do recebedor (e-mail, CPF/CNPJ, celular ou chave aleatória). Máximo de 77 caracteres.
|
valor |
Optional[float]
|
O valor da transação. Se for None ou 0, o QR Code será gerado com valor aberto,
permitindo que o pagador insira o valor.
|
transacao_id |
str
|
Identificador da transação (TXID). Deve ser alfanumérico com até 25 caracteres.
O padrão '***' indica que não é utilizado um TXID específico.
|
ponto_iniciacao_metodo |
Optional[str]
|
Define se o QR Code é estático ('11') ou dinâmico ('12').
Se None, o campo não é incluído no payload.
|
receptor_categoria_code |
str
|
Código da Categoria do Comerciante (MCC). Padrão: "0000".
|
recebedor_cep |
Optional[str]
|
CEP do comerciante. Deve conter exatamente 8 dígitos numéricos.
|
info_adicional |
Optional[str]
|
Campo de texto livre para informações adicionais (não usado diretamente
na geração padrão do BR Code, mas útil para o sistema).
|
idioma_preferencia |
Optional[str]
|
Idioma para dados alternativos (ex: "pt_BR").
|
recebedor_nome_alt |
Optional[str]
|
Nome alternativo do recebedor (em outro idioma).
|
recebedor_cidade_alt |
Optional[str]
|
Cidade alternativa do recebedor (em outro idioma).
|
Raises:
| Type |
Description |
GeracaoPayloadError
|
Se qualquer um dos campos não atender às regras
de validação (ex: comprimento, formato).
|
ChavePixInvalidaError
|
Se o formato da chave Pix não for reconhecido como válido.
|
Examples:
Criando uma instância válida de PixData:
>>> dados_validos = PixData(
... recebedor_nome="EMPRESA MODELO",
... recebedor_cidade="SAO PAULO",
... pix_key="123e4567-e89b-12d3-a456-426655440000",
... valor=10.50,
... transacao_id="TXID12345"
... )
Source code in src\pixcore\models.py
| @dataclass
class PixData:
"""
Representa e valida todos os dados para a geração de um BR Code Pix.
Esta dataclass serve como um contêiner estruturado para os campos
obrigatórios e opcionais do padrão EMV® QRCPS, aplicando validações
automáticas na inicialização do objeto para garantir a conformidade
e integridade dos dados.
Attributes:
recebedor_nome (str): Nome do recebedor/comerciante. Deve ter entre 3 e 25 bytes.
recebedor_cidade (str): Cidade do recebedor/comerciante. Deve ter entre 3 e 15 bytes.
pix_key (str): Chave Pix do recebedor (e-mail, CPF/CNPJ, celular ou chave aleatória). Máximo de 77 caracteres.
valor (Optional[float]): O valor da transação. Se for `None` ou `0`, o QR Code será gerado com valor aberto,
permitindo que o pagador insira o valor.
transacao_id (str): Identificador da transação (TXID). Deve ser alfanumérico com até 25 caracteres.
O padrão '***' indica que não é utilizado um TXID específico.
ponto_iniciacao_metodo (Optional[str]): Define se o QR Code é estático ('11') ou dinâmico ('12').
Se `None`, o campo não é incluído no payload.
receptor_categoria_code (str): Código da Categoria do Comerciante (MCC). Padrão: "0000".
recebedor_cep (Optional[str]): CEP do comerciante. Deve conter exatamente 8 dígitos numéricos.
info_adicional (Optional[str]): Campo de texto livre para informações adicionais (não usado diretamente
na geração padrão do BR Code, mas útil para o sistema).
idioma_preferencia (Optional[str]): Idioma para dados alternativos (ex: "pt_BR").
recebedor_nome_alt (Optional[str]): Nome alternativo do recebedor (em outro idioma).
recebedor_cidade_alt (Optional[str]): Cidade alternativa do recebedor (em outro idioma).
Raises:
exceptions.GeracaoPayloadError: Se qualquer um dos campos não atender às regras
de validação (ex: comprimento, formato).
exceptions.ChavePixInvalidaError: Se o formato da chave Pix não for reconhecido como válido.
Examples:
Criando uma instância válida de PixData:
>>> dados_validos = PixData(
... recebedor_nome="EMPRESA MODELO",
... recebedor_cidade="SAO PAULO",
... pix_key="123e4567-e89b-12d3-a456-426655440000",
... valor=10.50,
... transacao_id="TXID12345"
... )
"""
recebedor_nome: str
recebedor_cidade: str
pix_key: str
valor: Optional[float] = None
transacao_id: str = "***"
ponto_iniciacao_metodo: Optional[str] = None
receptor_categoria_code: str = "0000"
recebedor_cep: Optional[str] = None
info_adicional: Optional[str] = None
idioma_preferencia: Optional[str] = None
recebedor_nome_alt: Optional[str] = None
recebedor_cidade_alt: Optional[str] = None
def __post_init__(self):
"""
Executa a validação dos dados após a inicialização do objeto.
Este método é chamado automaticamente pelo dataclass e centraliza todas
as regras de negócio para garantir a integridade dos dados do PIX.
"""
if not self.recebedor_nome or len(self.recebedor_nome.encode('utf-8')) > 25 or len(self.recebedor_nome) < 3:
raise exceptions.GeracaoPayloadError(campo='recebedor_nome', motivo="O nome do recebedor (recebedor_nome) é obrigatório e deve ter entre 3 e 25 bytes.")
if not self.recebedor_cidade or len(self.recebedor_cidade.encode('utf-8')) > 15 or len(self.recebedor_cidade) < 3:
raise exceptions.GeracaoPayloadError('recebedor_cidade', "A cidade do recebedor (recebedor_cidade) é obrigatória e deve ter entre 3 e 15 bytes.")
if self.transacao_id != '***' and not re.match(r'^[a-zA-Z0-9]{1,25}$', self.transacao_id):
raise exceptions.GeracaoPayloadError('transacao_id', "O ID da Transação (transacao_id) deve ser alfanumérico com até 25 caracteres.")
if not self.pix_key or len(self.pix_key) > 77:
raise exceptions.GeracaoPayloadError('pix_key', "A chave Pix (pix_key) é obrigatória e deve ter até 77 caracteres.")
elif self.tipo_chave() == "Tipo Desconhecido":
raise exceptions.ChavePixInvalidaError(self.pix_key,"O formato da chave Pix (pix_key) não é reconhecido.")
if self.valor is not None and self.valor <= 0:
raise exceptions.GeracaoPayloadError('valor', "O valor (valor), se presente, deve ser positivo.")
if self.recebedor_cep and not re.match(r'^\d{8}$', self.recebedor_cep):
raise exceptions.GeracaoPayloadError('recebedor_cep', "O CEP (recebedor_cep) deve conter 8 dígitos numéricos.")
def tipo_chave(self) -> str:
"""
Identifica o tipo da chave Pix com base em seu formato.
A verificação é feita em uma ordem específica para evitar falsos positivos
(ex: um CPF ser confundido com um telefone).
Returns:
str: O tipo da chave (ex: "CPF", "Email", "Tipo Desconhecido").
"""
chave = self.pix_key
if validate.validar_chave_aleatoria(chave):
return "Chave Aleatória (EVP)"
elif '@' in chave and validate.validar_email(chave):
return "Email"
elif validate.validar_telefone(chave):
return "Telefone"
elif validate.validar_cpf(chave):
return "CPF"
elif validate.validar_cnpj(chave):
return "CNPJ"
else:
return "Tipo Desconhecido"
|
__post_init__()
Executa a validação dos dados após a inicialização do objeto.
Este método é chamado automaticamente pelo dataclass e centraliza todas
as regras de negócio para garantir a integridade dos dados do PIX.
Source code in src\pixcore\models.py
| def __post_init__(self):
"""
Executa a validação dos dados após a inicialização do objeto.
Este método é chamado automaticamente pelo dataclass e centraliza todas
as regras de negócio para garantir a integridade dos dados do PIX.
"""
if not self.recebedor_nome or len(self.recebedor_nome.encode('utf-8')) > 25 or len(self.recebedor_nome) < 3:
raise exceptions.GeracaoPayloadError(campo='recebedor_nome', motivo="O nome do recebedor (recebedor_nome) é obrigatório e deve ter entre 3 e 25 bytes.")
if not self.recebedor_cidade or len(self.recebedor_cidade.encode('utf-8')) > 15 or len(self.recebedor_cidade) < 3:
raise exceptions.GeracaoPayloadError('recebedor_cidade', "A cidade do recebedor (recebedor_cidade) é obrigatória e deve ter entre 3 e 15 bytes.")
if self.transacao_id != '***' and not re.match(r'^[a-zA-Z0-9]{1,25}$', self.transacao_id):
raise exceptions.GeracaoPayloadError('transacao_id', "O ID da Transação (transacao_id) deve ser alfanumérico com até 25 caracteres.")
if not self.pix_key or len(self.pix_key) > 77:
raise exceptions.GeracaoPayloadError('pix_key', "A chave Pix (pix_key) é obrigatória e deve ter até 77 caracteres.")
elif self.tipo_chave() == "Tipo Desconhecido":
raise exceptions.ChavePixInvalidaError(self.pix_key,"O formato da chave Pix (pix_key) não é reconhecido.")
if self.valor is not None and self.valor <= 0:
raise exceptions.GeracaoPayloadError('valor', "O valor (valor), se presente, deve ser positivo.")
if self.recebedor_cep and not re.match(r'^\d{8}$', self.recebedor_cep):
raise exceptions.GeracaoPayloadError('recebedor_cep', "O CEP (recebedor_cep) deve conter 8 dígitos numéricos.")
|
tipo_chave()
Identifica o tipo da chave Pix com base em seu formato.
A verificação é feita em uma ordem específica para evitar falsos positivos
(ex: um CPF ser confundido com um telefone).
Returns:
| Name | Type |
Description |
str |
str
|
O tipo da chave (ex: "CPF", "Email", "Tipo Desconhecido").
|
Source code in src\pixcore\models.py
| def tipo_chave(self) -> str:
"""
Identifica o tipo da chave Pix com base em seu formato.
A verificação é feita em uma ordem específica para evitar falsos positivos
(ex: um CPF ser confundido com um telefone).
Returns:
str: O tipo da chave (ex: "CPF", "Email", "Tipo Desconhecido").
"""
chave = self.pix_key
if validate.validar_chave_aleatoria(chave):
return "Chave Aleatória (EVP)"
elif '@' in chave and validate.validar_email(chave):
return "Email"
elif validate.validar_telefone(chave):
return "Telefone"
elif validate.validar_cpf(chave):
return "CPF"
elif validate.validar_cnpj(chave):
return "CNPJ"
else:
return "Tipo Desconhecido"
|