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