api-admim/app/schemas/validacoes.py

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