from django.db import models
from django_prometheus.models import ExportModelOperationsMixin
from sme_sigpae_api.cardapio.base.models import Cardapio
from sme_sigpae_api.cardapio.inversao_dia_cardapio.managers.inversao_dia_cardapio_managers import (
InversaoCardapioDestaSemanaManager,
InversaoCardapioDesteMesManager,
InversaoCardapioVencidaManager,
)
from sme_sigpae_api.dados_comuns.behaviors import (
CriadoEm,
CriadoPor,
Logs,
Motivo,
SolicitacaoForaDoPrazo,
TemChaveExterna,
TemIdentificadorExternoAmigavel,
TemObservacao,
TemPrioridade,
TemTerceirizadaConferiuGestaoAlimentacao,
)
from sme_sigpae_api.dados_comuns.fluxo_status import FluxoAprovacaoPartindoDaEscola
from sme_sigpae_api.dados_comuns.models import LogSolicitacoesUsuario, TemplateMensagem
FORMATO_DATA_BR = "%d/%m/%Y"
[docs]
class InversaoCardapio(
ExportModelOperationsMixin("inversao_cardapio"),
CriadoEm,
CriadoPor,
TemObservacao,
Motivo,
TemChaveExterna,
TemIdentificadorExternoAmigavel,
FluxoAprovacaoPartindoDaEscola,
TemPrioridade,
Logs,
SolicitacaoForaDoPrazo,
TemTerceirizadaConferiuGestaoAlimentacao,
):
"""Troca um cardápio de um dia por outro.
servir o cardápio do dia 30 no dia 15, automaticamente o
cardápio do dia 15 será servido no dia 30
"""
DESCRICAO = "Inversão de Cardápio"
objects = models.Manager() # Manager Padrão
desta_semana = InversaoCardapioDestaSemanaManager()
deste_mes = InversaoCardapioDesteMesManager()
vencidos = InversaoCardapioVencidaManager()
data_de_inversao = models.DateField("Data de inversão", blank=True, null=True)
data_para_inversao = models.DateField("Data para inversão", blank=True, null=True)
data_de_inversao_2 = models.DateField("Data de inversão", blank=True, null=True)
data_para_inversao_2 = models.DateField("Data para inversão", blank=True, null=True)
alunos_da_cemei = models.CharField(
"Alunos da CEMEI", blank=True, default="", max_length=50
)
alunos_da_cemei_2 = models.CharField(
"Alunos da CEMEI", blank=True, default="", max_length=50
)
cardapio_de = models.ForeignKey(
Cardapio,
on_delete=models.DO_NOTHING,
blank=True,
null=True,
related_name="cardapio_de",
)
cardapio_para = models.ForeignKey(
Cardapio,
on_delete=models.DO_NOTHING,
blank=True,
null=True,
related_name="cardapio_para",
)
escola = models.ForeignKey(
"escola.Escola", blank=True, null=True, on_delete=models.DO_NOTHING
)
tipos_alimentacao = models.ManyToManyField(
"TipoAlimentacao", help_text="Tipos de alimentacao.", blank=True
)
[docs]
@classmethod
def get_solicitacoes_rascunho(cls, usuario):
solicitacoes_unificadas = InversaoCardapio.objects.filter(
criado_por=usuario, status=InversaoCardapio.workflow_class.RASCUNHO
)
return solicitacoes_unificadas
@property
def datas(self):
if self.cardapio_de:
datas = self.cardapio_de.data.strftime(FORMATO_DATA_BR)
else:
datas = self.data_de_inversao.strftime(FORMATO_DATA_BR)
if self.data_de_inversao_2:
datas += "<br />" + self.data_de_inversao_2.strftime(FORMATO_DATA_BR)
return datas
@property
def data_de(self):
return (
self.cardapio_de.data if self.cardapio_de else self.data_de_inversao or None
)
@property
def data_para(self):
return (
self.cardapio_para.data
if self.cardapio_para
else self.data_para_inversao or None
)
@property
def data(self):
return self.data_para if self.data_para < self.data_de else self.data_de
@property
def tipo(self):
return "Inversão de Dia de Cardápio"
@property
def path(self):
return f"inversao-de-dia-de-cardapio/relatorio?uuid={self.uuid}&tipoSolicitacao=solicitacao-normal"
@property
def numero_alunos(self):
return ""
@property
def template_mensagem(self):
template = TemplateMensagem.objects.get(tipo=TemplateMensagem.INVERSAO_CARDAPIO)
template_troca = {
"@id": self.id_externo,
"@criado_em": str(self.criado_em),
"@criado_por": str(self.criado_por),
"@status": str(self.status),
# TODO: verificar a url padrão do pedido
"@link": "https://teste.com",
}
corpo = template.template_html
for chave, valor in template_troca.items():
corpo = corpo.replace(chave, valor)
return template.assunto, corpo
[docs]
def salvar_log_transicao(self, status_evento, usuario, **kwargs):
justificativa = kwargs.get("justificativa", "")
resposta_sim_nao = kwargs.get("resposta_sim_nao", False)
LogSolicitacoesUsuario.objects.create(
descricao=str(self),
status_evento=status_evento,
solicitacao_tipo=LogSolicitacoesUsuario.INVERSAO_DE_CARDAPIO,
usuario=usuario,
uuid_original=self.uuid,
justificativa=justificativa,
resposta_sim_nao=resposta_sim_nao,
)
[docs]
def solicitacao_dict_para_relatorio(self, label_data, data_log, instituicao):
data_de_inversao = ""
data_de_inversao_2 = ""
if self.data_de_inversao:
data_de_inversao = self.data_de_inversao.strftime(FORMATO_DATA_BR)
if self.data_de_inversao_2:
data_de_inversao_2 = self.data_de_inversao_2.strftime(FORMATO_DATA_BR)
return {
"lote": f"{self.rastro_lote.diretoria_regional.iniciais} - {self.rastro_lote.nome}",
"unidade_educacional": self.rastro_escola.nome_historico(self.data),
"terceirizada": self.rastro_terceirizada,
"tipo_doc": "Inversão de dia de Cardápio",
"data_evento": f"{data_de_inversao} {data_de_inversao_2}",
"numero_alunos": self.numero_alunos,
"data_de_inversao": self.data_de_inversao,
"data_inicial": self.data_de_inversao,
"data_final": self.data_para_inversao,
"data_para_inversao": self.data_para_inversao,
"data_de_inversao_2": self.data_de_inversao_2,
"data_para_inversao_2": self.data_para_inversao_2,
"data_de": self.data_de,
"data_para": self.data_para,
"label_data": label_data,
"data_log": data_log,
"motivo": self.motivo,
"observacao": self.observacao,
"tipos_alimentacao": ", ".join(
self.tipos_alimentacao.values_list("nome", flat=True)
),
"datas": self.datas,
"id_externo": self.id_externo,
}
def __str__(self):
return (
f"Inversão de Cardápio \nDe: {self.cardapio_de or self.data_de_inversao} \n"
f"Para: {self.cardapio_para or self.data_para_inversao}"
)
class Meta:
verbose_name = "Inversão de cardápio"
verbose_name_plural = "Inversões de cardápio"