Source code for src.cardapio.inversao_dia_cardapio.api.validators

"""Validadores de negócio da API de Inversão de dia de Cardápio."""

import datetime

from django.db.models import Q
from rest_framework import serializers

from src.cardapio.inversao_dia_cardapio.models import InversaoCardapio
from src.escola.models import Escola


[docs] def nao_pode_existir_solicitacao_igual_para_mesma_escola( data_de: datetime.date, data_para: datetime.date, escola: Escola, tipos_alimentacao: list, ): """Impede a criação de solicitações duplicadas para a mesma escola. Considera tanto o primeiro quanto o segundo par de datas da solicitação e ignora pedidos em status finais que não bloqueiam nova criação. Args: data_de (datetime.date): Data inicial da inversão. data_para (datetime.date): Data final da inversão. escola (Escola): Escola associada ao pedido. tipos_alimentacao (list): Tipos de alimentação vinculados ao pedido. Returns: bool: ``True`` quando não existe solicitação equivalente em aberto. Raises: ValidationError: Quando já existe uma solicitação com os mesmos dados. """ inversao_cardapio = ( InversaoCardapio.objects.filter( Q( data_de_inversao=data_de, data_para_inversao=data_para, escola=escola, tipos_alimentacao__in=tipos_alimentacao, ) | Q( data_de_inversao_2=data_de, data_para_inversao_2=data_para, escola=escola, tipos_alimentacao__in=tipos_alimentacao, ) ) .filter( ~Q( status__in=[ InversaoCardapio.workflow_class.RASCUNHO, InversaoCardapio.workflow_class.DRE_NAO_VALIDOU_PEDIDO_ESCOLA, InversaoCardapio.workflow_class.CODAE_NEGOU_PEDIDO, InversaoCardapio.workflow_class.ESCOLA_CANCELOU, InversaoCardapio.workflow_class.CANCELADO_AUTOMATICAMENTE, ] ) ) .exists() ) if inversao_cardapio: raise serializers.ValidationError( "Já existe uma solicitação de inversão com estes dados" ) return True
[docs] def nao_pode_ter_mais_que_60_dias_diferenca( data_de: datetime.date, data_para: datetime.date ): """Valida o limite máximo de diferença entre as datas da inversão, que é de 60 dias. Args: data_de (datetime.date): Data inicial da inversão. data_para (datetime.date): Data final da inversão. Returns: bool: ``True`` quando a diferença entre as datas é de até 60 dias. Raises: ValidationError: Quando a diferença absoluta entre as datas ultrapassa 60 dias. """ diferenca = abs((data_para - data_de).days) if diferenca > 60: raise serializers.ValidationError( "Diferença entre as datas não pode ultrapassar 60 dias" ) return True