140 lines
5.2 KiB
Python
140 lines
5.2 KiB
Python
from datetime import date
|
|
from decimal import Decimal
|
|
|
|
from fastapi import HTTPException
|
|
|
|
|
|
class ValidacoesUtil:
|
|
@classmethod
|
|
def validar_valor_monetario(cls, value: float, precision: int = 10, scale: int = 2):
|
|
decimal_value = Decimal(value).quantize(Decimal(f'1.{"0" * scale}'))
|
|
if len(decimal_value.as_tuple().digits) > precision:
|
|
raise ValueError(f"O valor excede {precision} dígitos, incluindo, {scale} casas decimais.")
|
|
return float(decimal_value)
|
|
|
|
# Você pode adicionar outras validações aqui
|
|
@classmethod
|
|
def validar_se_positivo(cls, value: float):
|
|
if value <= 0:
|
|
raise HTTPException(status_code=400, detail="O valor deve ser positivo.")
|
|
return value
|
|
|
|
@classmethod
|
|
def data_no_passado(cls, data: date):
|
|
"""
|
|
Valida se a data é no passado (antes de hoje).
|
|
"""
|
|
if data >= date.today():
|
|
raise HTTPException(status_code=400, detail="A data deve estar no passado.")
|
|
return data
|
|
|
|
@classmethod
|
|
def data_no_passado_ou_hoje(cls, data: date):
|
|
"""
|
|
Valida se a data é no passado ou hoje (igual ou antes de hoje).
|
|
"""
|
|
if data > date.today():
|
|
raise HTTPException(status_code=400, detail="A data não pode ser no futuro.")
|
|
return data
|
|
|
|
@classmethod
|
|
def data_no_futuro(cls, data: date):
|
|
"""
|
|
Valida se a data é no futuro (depois de hoje).
|
|
"""
|
|
if data <= date.today():
|
|
raise HTTPException(status_code=400, detail="A data deve ser no futuro.")
|
|
return data
|
|
|
|
@classmethod
|
|
def data_no_futuro_ou_hoje(cls, data: date):
|
|
"""
|
|
Valida se a data é hoje ou no futuro (igual ou depois de hoje).
|
|
"""
|
|
if data < date.today():
|
|
raise HTTPException(status_code=400, detail="A data não pode estar no passado.")
|
|
return data
|
|
|
|
@classmethod
|
|
def data_final_maior(cls, data_final: date, data_inicial: date):
|
|
"""
|
|
Valida se a data final é posterior à data inicial.
|
|
"""
|
|
if data_final <= data_inicial:
|
|
raise HTTPException(status_code=400, detail="A data final deve ser posterior à data inicial.")
|
|
return data_final
|
|
|
|
@classmethod
|
|
def data_final_maior_ou_igual(cls, data_final: date, data_inicial: date):
|
|
"""
|
|
Valida se a data final é igual ou posterior à data inicial.
|
|
"""
|
|
if data_final < data_inicial:
|
|
raise HTTPException(status_code=400, detail="A data final não pode ser anterior à data inicial.")
|
|
return data_final
|
|
|
|
@classmethod
|
|
def data_final_menor(cls, data_final: date, data_inicial: date):
|
|
"""
|
|
Valida se a data final é anterior à data inicial.
|
|
"""
|
|
if data_final >= data_inicial:
|
|
raise HTTPException(status_code=400, detail="A data final deve ser anterior à data inicial.")
|
|
return data_final
|
|
|
|
@classmethod
|
|
def data_final_menor_ou_igual(cls, data_final: date, data_inicial: date):
|
|
"""
|
|
Valida se a data final é igual ou anterior à data inicial.
|
|
"""
|
|
if data_final > data_inicial:
|
|
raise HTTPException(status_code=400, detail="A data final não pode ser posterior à data inicial.")
|
|
return data_final
|
|
|
|
@classmethod
|
|
def validate_intervalo_minimo(cls, data_inicial: date, data_final: date, dias_minimos: int):
|
|
"""
|
|
Valida se há um intervalo mínimo de dias entre as duas datas.
|
|
"""
|
|
if (data_final - data_inicial).days < dias_minimos:
|
|
raise HTTPException(status_code=400,
|
|
detail=f"O intervalo entre as datas deve ser de pelo menos {dias_minimos} dias.")
|
|
return data_final
|
|
|
|
@classmethod
|
|
def validate_intervalo_maximo(cls, data_inicial: date, data_final: date, dias_maximos: int):
|
|
"""
|
|
Valida se o intervalo entre duas datas não excede um número máximo de dias.
|
|
"""
|
|
if (data_final - data_inicial).days > dias_maximos:
|
|
raise HTTPException(status_code=400,
|
|
detail=f"O intervalo entre as datas não pode ser maior que {dias_maximos} dias.")
|
|
return data_final
|
|
|
|
@classmethod
|
|
def validate_data_intervalo_anos(cls, data: date, ano_inicial: int, ano_final: int):
|
|
"""
|
|
Valida se a data está dentro de um intervalo de anos permitido.
|
|
"""
|
|
if not (ano_inicial <= data.year <= ano_final):
|
|
raise HTTPException(status_code=400, detail=f"A data deve estar entre os anos {ano_inicial} e {ano_final}.")
|
|
return data
|
|
|
|
@classmethod
|
|
def validate_data_expirada(cls, data_expiracao: date):
|
|
"""
|
|
Verifica se a data de expiração já passou.
|
|
"""
|
|
if data_expiracao < date.today():
|
|
raise HTTPException(status_code=400, detail="A data de expiração já passou.")
|
|
return data_expiracao
|
|
|
|
@classmethod
|
|
def validate_dia_util(cls, data: date):
|
|
"""
|
|
Valida se a data cai em um dia útil (segunda a sexta-feira).
|
|
"""
|
|
if data.weekday() > 4: # Dias 5 e 6 são sábado e domingo
|
|
raise HTTPException(status_code=400, detail="A data deve ser em um dia útil.")
|
|
return data
|