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

Commit

Permalink
Atualiza biblioteca Pydantic (#80)
Browse files Browse the repository at this point in the history
* atualiza libs

* ajustes

* correções
  • Loading branch information
rodrigondec authored Nov 15, 2024
1 parent 3bd85a4 commit 64eed7b
Show file tree
Hide file tree
Showing 7 changed files with 429 additions and 327 deletions.
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

0 comments on commit 64eed7b

Please # to comment.