Skip to content
This repository has been archived by the owner on Jan 24, 2025. It is now read-only.

Atualiza biblioteca Pydantic #80

Merged
merged 3 commits into from
Nov 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 41 additions & 38 deletions bb_wrapper/models/barcode.py
Original file line number Diff line number Diff line change
@@ -1,80 +1,83 @@
from typing import Optional
from pydantic.functional_validators import model_validator, field_validator
from typing_extensions import Annotated

from pydantic import BaseModel, constr, validator, root_validator
from pydantic import BaseModel, StringConstraints

from ..services.barcode_cobranca import BarcodeCobrancaService
from ..services.barcode_tributo import BarcodeTributoService


class BarcodeCobranca(BaseModel):
code_line: Optional[constr(min_length=47, max_length=47, regex=r"^\d+$")]
barcode: Optional[constr(min_length=44, max_length=44, regex=r"^\d+$")]
barcode_image: Optional[str]

# noinspection PyMethodParameters
@validator("code_line")
code_line: Annotated[
str, StringConstraints(min_length=47, max_length=47, pattern=r"^\d+$")
] = None
barcode: Annotated[
str, StringConstraints(min_length=44, max_length=44, pattern=r"^\d+$")
] = None
barcode_image: str = None

@classmethod
@field_validator("code_line")
def _code_line_must_be_valid(cls, code_line):
BarcodeCobrancaService().validate_code_line(code_line)
return code_line

# noinspection PyMethodParameters
@validator("barcode")
@classmethod
@field_validator("barcode")
def _barcode_must_be_valid(cls, barcode):
BarcodeCobrancaService().validate_barcode(barcode)
return barcode

# noinspection PyMethodParameters
@root_validator
def _set_data(cls, values):
@model_validator(mode="after")
def _set_barcode_or_code_line(self):
from ..services.barcode import BarcodeService

code_line, barcode = values.get("code_line"), values.get("barcode")
code_line, barcode = self.code_line, self.barcode

if code_line:
values["barcode"] = BarcodeCobrancaService().code_line_to_barcode(code_line)
self.barcode = BarcodeCobrancaService().code_line_to_barcode(code_line)
elif barcode:
values["code_line"] = BarcodeCobrancaService().barcode_to_code_line(barcode)
self.code_line = BarcodeCobrancaService().barcode_to_code_line(barcode)
else:
raise ValueError("Informe a linha digitável ou código de barras!")

values["barcode_image"] = BarcodeService().generate_barcode_b64image(
values["barcode"]
)
return values
self.barcode_image = BarcodeService().generate_barcode_b64image(self.barcode)
return self


class BarcodeTributo(BaseModel):
code_line: Optional[constr(min_length=48, max_length=48, regex=r"^\d+$")]
barcode: Optional[constr(min_length=44, max_length=44, regex=r"^\d+$")]
barcode_image: Optional[str]

# noinspection PyMethodParameters
@validator("code_line")
code_line: Annotated[
str, StringConstraints(min_length=48, max_length=48, pattern=r"^\d+$")
] = None
barcode: Annotated[
str, StringConstraints(min_length=44, max_length=44, pattern=r"^\d+$")
] = None
barcode_image: str = None

@classmethod
@field_validator("code_line")
def _code_line_must_be_valid(cls, code_line):
BarcodeTributoService().validate_code_line(code_line)
return code_line

# noinspection PyMethodParameters
@validator("barcode")
@classmethod
@field_validator("barcode")
def _barcode_must_be_valid(cls, barcode):
BarcodeTributoService().validate_barcode(barcode)
return barcode

# noinspection PyMethodParameters
@root_validator
def _set_data(cls, values):
@model_validator(mode="after")
def _set_barcode_or_code_line(self):
from ..services.barcode import BarcodeService

code_line, barcode = values.get("code_line"), values.get("barcode")
code_line, barcode = self.code_line, self.barcode

if code_line:
values["barcode"] = BarcodeTributoService().code_line_to_barcode(code_line)
self.barcode = BarcodeTributoService().code_line_to_barcode(code_line)
elif barcode:
values["code_line"] = BarcodeTributoService().barcode_to_code_line(barcode)
self.code_line = BarcodeTributoService().barcode_to_code_line(barcode)
else:
raise ValueError("Informe a linha digitável ou código de barras!")

values["barcode_image"] = BarcodeService().generate_barcode_b64image(
values["barcode"]
)
return values
self.barcode_image = BarcodeService().generate_barcode_b64image(self.barcode)
return self
44 changes: 22 additions & 22 deletions bb_wrapper/models/boleto.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from enum import IntEnum
from typing import Optional, Literal
from typing import Literal

from pydantic import BaseModel, confloat, conint, constr

Expand Down Expand Up @@ -56,8 +56,8 @@ class ConfiguracaoBaseTipoEnum(IntEnum):


class ConfiguracaoBase(BaseModel):
valor: Optional[confloat(strict=True, gt=0.0)]
porcentagem: Optional[confloat(strict=True, gt=0.0)]
valor: confloat(strict=True, gt=0.0) = None
porcentagem: confloat(strict=True, gt=0.0) = None


class BoletoConfiguracaoBase(ConfiguracaoBase):
Expand Down Expand Up @@ -94,34 +94,34 @@ class Boleto(BaseModel):

dataEmissao: str
dataVencimento: str
indicadorAceiteTituloVencido: Optional[Literal["S", "N"]] = "S"
numeroDiasLimiteRecebimento: Optional[conint(ge=0)]
indicadorAceiteTituloVencido: Literal["S", "N"] = "S"
numeroDiasLimiteRecebimento: conint(ge=0) = None

valorOriginal: confloat(strict=True, gt=0.0)
valorAbatimento: Optional[confloat(strict=True, gt=0.0)]
valorAbatimento: confloat(strict=True, gt=0.0) = None
indicadorPermissaoRecebimentoParcial: Literal["N", "S"] = "N"

numeroTituloCliente: constr(max_length=20)
pagador: PessoaComEndereco
beneficiarioFinal: Optional[Pessoa]
beneficiarioFinal: Pessoa = None

quantidadeDiasProtesto: Optional[conint(ge=0)]
quantidadeDiasNegativacao: Optional[conint(ge=0)]
quantidadeDiasProtesto: conint(ge=0) = None
quantidadeDiasNegativacao: conint(ge=0) = None
codigoAceite: Literal["A", "N"] = "N"
codigoTipoTitulo: TipoBoletoEnum
descricaoTipoTitulo: Optional[str]
numeroTituloBeneficiario: Optional[str]
textoCampoUtilizacaoBeneficiario: Optional[constr(max_length=30)]
textoMensagemBloquetoOcorrencia: Optional[constr(max_length=30)]
email: Optional[str]

jurosMora: Optional[BoletoConfiguracaoBase]
multa: Optional[BoletoConfiguracaoBase]
desconto: Optional[PrimeiroDesconto]
segundoDesconto: Optional[SegundoOuTerceiroDesconto]
terceiroDesconto: Optional[SegundoOuTerceiroDesconto]

indicadorPix: Optional[Literal["S", "N"]]
descricaoTipoTitulo: str = None
numeroTituloBeneficiario: str = None
textoCampoUtilizacaoBeneficiario: constr(max_length=30) = None
textoMensagemBloquetoOcorrencia: constr(max_length=30) = None
email: str = None

jurosMora: BoletoConfiguracaoBase = None
multa: BoletoConfiguracaoBase = None
desconto: PrimeiroDesconto = None
segundoDesconto: SegundoOuTerceiroDesconto = None
terceiroDesconto: SegundoOuTerceiroDesconto = None

indicadorPix: Literal["S", "N"] = None


class BoletoEstadoEnum(IntEnum):
Expand Down
57 changes: 28 additions & 29 deletions bb_wrapper/models/pagamentos.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Optional
from enum import IntEnum, Enum

from pydantic import BaseModel, root_validator
from pydantic import BaseModel
from pydantic.functional_validators import model_validator
from pycpfcnpj import cpfcnpj

from .perfis import TipoInscricaoEnum
Expand Down Expand Up @@ -55,56 +55,55 @@ class TransferenciaPIX(BaseModel):
data: str
valor: float
chave: str
formaIdentificacao: Optional[TipoChavePIX]
dddTelefone: Optional[int]
telefone: Optional[int]
email: Optional[str]
cpf: Optional[int]
cnpj: Optional[int]
identificacaoAleatoria: Optional[str]
formaIdentificacao: TipoChavePIX = None
dddTelefone: int = None
telefone: int = None
email: str = None
cpf: int = None
cnpj: int = None
identificacaoAleatoria: str = None

# noinspection PyMethodParameters
@root_validator
def _set_data(cls, values):
@model_validator(mode="after")
def _set_key_accordingly(self):
"""
Esse método realiza o processamento em cima do valor 'chave'
identificando que tipo de chave é e configurando-a corretamente
no objeto.
"""
from ..services.pix import PixService

key = values.get("chave")
key = self.chave

key_type = PixService().identify_key_type(key)
values["formaIdentificacao"] = key_type
self.formaIdentificacao = key_type

if key_type == TipoChavePIX.telefone:
values["dddTelefone"] = int(key[:2])
values["telefone"] = int(key[2:])
self.dddTelefone = int(key[:2])
self.telefone = int(key[2:])
elif key_type == TipoChavePIX.email:
values["email"] = key
self.email = key
elif key_type == TipoChavePIX.uuid:
values["identificacaoAleatoria"] = key
self.identificacaoAleatoria = key
elif key_type == TipoChavePIX.documento:
key_value = cpfcnpj.clear_punctuation(key)
if len(key_value) == 1:
values["cpf"] = int(key_value)
self.cpf = int(key_value)
else:
values["cnpj"] = int(key_value)
return values
self.cnpj = int(key_value)
return self


class TransferenciaTED(BaseModel):
numeroCOMPE: int
cpfBeneficiario: Optional[int]
cnpjBeneficiario: Optional[int]
cpfBeneficiario: int = None
cnpjBeneficiario: int = None
dataTransferencia: str
valorTransferencia: float
contaPagamentoCredito: Optional[str]
agenciaCredito: Optional[int]
contaCorrenteCredito: Optional[int]
digitoVerificadorContaCorrente: Optional[str]
codigoFinalidadeTED: Optional[FinalidadeTED]
contaPagamentoCredito: str = None
agenciaCredito: int = None
contaCorrenteCredito: int = None
digitoVerificadorContaCorrente: str = None
codigoFinalidadeTED: FinalidadeTED = None


class Boleto(BaseModel):
Expand All @@ -128,7 +127,7 @@ class LoteData(BaseModel):
agencia: int
conta: int
dv_conta: str
convenio: Optional[int]
convenio: int = None


class LoteTransferenciaData(LoteData):
Expand Down
3 changes: 1 addition & 2 deletions bb_wrapper/models/perfis.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from typing import Optional
from enum import IntEnum

from pydantic import BaseModel, constr
Expand Down Expand Up @@ -26,7 +25,7 @@ class PessoaComEndereco(Pessoa):
cidade: constr(max_length=30)
bairro: constr(max_length=30)
uf: constr(max_length=2, min_length=2)
telefone: Optional[constr(max_length=30)]
telefone: constr(max_length=30) = None


class PessoaPix(BaseModel):
Expand Down
4 changes: 2 additions & 2 deletions bb_wrapper/models/pix_cob.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Union, Optional
from typing import Union

from pydantic import BaseModel, confloat, conint, constr, conlist

Expand All @@ -24,4 +24,4 @@ class CobrancaPix(BaseModel):
valor: Valor
chave: constr(max_length=77)
solicitacaoPagador: constr(max_length=140)
infoAdicionais: Optional[conlist(InfoAdicional, max_items=50)]
infoAdicionais: conlist(InfoAdicional, max_length=50) = None
Loading