Source code for src.cardapio.base.models

from django.db import models
from django_prometheus.models import ExportModelOperationsMixin

from src.dados_comuns.behaviors import (
    Ativavel,
    Nomeavel,
    Posicao,
    TemChaveExterna,
)


[docs] class TipoAlimentacao( ExportModelOperationsMixin("tipo_alimentacao"), Nomeavel, TemChaveExterna, Posicao ): """Representa um tipo de alimentação que pode compor o cardápio escolar. Os registros deste modelo são reutilizados em vínculos com período escolar, configurações de horário por unidade educacional e solicitações que dependem do tipo de alimentação servido. Tipos cadastrados: - Desjejum - Colação - Almoço - Refeição - Sobremesa - Lanche - Lanche 4h - Lanche Emergencial Tipos de alimentação de CEI: - Desjejum - Colação - Almoço - Refeição da Tarde Tipos de alimentação de EMEF/EMEI/CIEJA, etc: - Refeição - Sobremesa - Lanche - Lanche 4h - Lanche Emergencial """ LANCHE_EMERGENCIAL = "Lanche Emergencial" LANCHE_4H = "Lanche 4h" @property def substituicoes_periodo_escolar(self): return self.substituicoes_periodo_escolar def __str__(self): return self.nome class Meta: verbose_name = "Tipo de alimentação" verbose_name_plural = "Tipos de alimentação" ordering = ["posicao"]
[docs] class HorarioDoComboDoTipoDeAlimentacaoPorUnidadeEscolar(TemChaveExterna): """Define a faixa de horário de um tipo de alimentação em uma escola. O cadastro relaciona uma escola, um período escolar e um tipo de alimentação a uma janela de atendimento. Os vínculos opcionais preservam a compatibilidade com registros legados e permitem configurações parciais. """ hora_inicial = models.TimeField(auto_now=False, auto_now_add=False) hora_final = models.TimeField(auto_now=False, auto_now_add=False) escola = models.ForeignKey( "escola.Escola", blank=True, null=True, on_delete=models.DO_NOTHING ) tipo_alimentacao = models.ForeignKey( "cardapio.TipoAlimentacao", blank=True, null=True, on_delete=models.DO_NOTHING ) periodo_escolar = models.ForeignKey( "escola.PeriodoEscolar", blank=True, null=True, on_delete=models.DO_NOTHING ) def __str__(self): return f"{self.tipo_alimentacao.nome} DE: {self.hora_inicial} ATE: {self.hora_final}"
[docs] class VinculoTipoAlimentacaoComPeriodoEscolarETipoUnidadeEscolar( ExportModelOperationsMixin("vinculo_alimentacao_periodo_escolar_tipo_ue"), Ativavel, TemChaveExterna, ): """Relaciona tipos de alimentação permitidos a um período escolar e tipo de U.E. O vínculo funciona como uma regra de negócio do cardápio, definindo quais tipos de alimentação podem ser servidos para uma combinação específica de tipo de unidade escolar e período escolar. Exemplos: - Uma CEI no período da MANHA pode servir Desjejum, Colação e Almoço. - Uma EMEF no período INTEGRAL pode servir Refeição, Sobremesa, Lanche, Lanche 4h e Lanche Emergencial. """ tipo_unidade_escolar = models.ForeignKey( "escola.TipoUnidadeEscolar", null=True, on_delete=models.DO_NOTHING ) periodo_escolar = models.ForeignKey( "escola.PeriodoEscolar", null=True, on_delete=models.DO_NOTHING ) tipos_alimentacao = models.ManyToManyField( "TipoAlimentacao", related_name="vinculos", blank=True ) def __str__(self): return f"{self.tipo_unidade_escolar.iniciais} - {self.periodo_escolar.nome}" class Meta: unique_together = [["periodo_escolar", "tipo_unidade_escolar"]] verbose_name = "Vínculo tipo alimentação" verbose_name_plural = "Vínculos tipo alimentação"
[docs] class MotivoDRENaoValida( ExportModelOperationsMixin("motivo_dre_nao_valida"), Nomeavel, TemChaveExterna ): """Armazena motivos usados pela DRE para não validar uma solicitação no módulo de Gestão de Alimentação. Os registros deste modelo são exibidos quando uma solicitação que passa pela Diretoria Regional de Educação é invalidada. Exemplos: - Em desacordo com o contrato - Preenchimento incorreto - Outro """ def __str__(self): return self.nome class Meta: verbose_name = "Motivo de não validação da DRE" verbose_name_plural = "Motivos de não validação da DRE"