models

gerar_numero_solicitacao(sender, instance, created, **kwargs)[source]

Sinal post_save que gera o número da solicitação de alteração.

Executado automaticamente após a criação de uma SolicitacaoAlteracaoCronograma, atribuindo o número no formato XXXXXXXX-ALT.

Cronograma

Cronograma é o modelo central do módulo de pré-recebimento. Representa o planejamento de entregas de um produto alimentício ao longo de um período, vinculado a um contrato e empresa fornecedora. Cada cronograma possui um fluxo de aprovação que envolve fornecedor, DILOG Abastecimento e CODAE.

Um cronograma pode ser de dois tipos:

  • Armazenável: Produtos comuns estocados em armazém. Possui etapas com datas específicas (DD/MM/YYYY), programações de recebimento e embalagem secundária.

  • FLV Ponto a Ponto: Hortifrutigranjeiros entregues diretamente pelo fornecedor às escolas. Possui apenas etapas mensais (MM/YYYY), sem armazém, embalagem secundária ou programações de recebimento.

class Cronograma(*args, **kwargs)[source]

Bases: ModeloBase, TemIdentificadorExternoAmigavel, Logs, FluxoCronograma

Cronograma de entrega de produtos alimentícios para as escolas.

Registra o planejamento de entregas de um produto vinculado a uma ficha técnica, contrato e empresa fornecedora. Passa por um fluxo de aprovação (FluxoCronograma): RASCUNHO, ASSINADO_E_ENVIADO_AO_FORNECEDOR, ASSINADO_FORNECEDOR, ASSINADO_DILOG_ABASTECIMENTO, ASSINADO_CODAE.

Divide-se em dois tipos conforme a categoria do produto e o tipo de entrega:

Armazenável

Produtos comuns, armazenados em almoxarifado/distribuidor. Possui etapas com data específica (DD/MM/YYYY) e programações de recebimento. A numeração utiliza o sufixo A (ex.: 001/2025A).

FLV Ponto a Ponto

Produtos hortifrutigranjeiros (FLV) entregues diretamente pelo fornecedor às unidades escolares. Possui etapas mensais (MM/YYYY) e não possui armazém, embalagem secundária nem programações de recebimento. A numeração utiliza o sufixo P (ex.: 001/2025P).

id: int

Origem: dados_comuns/behaviors.py (ModeloBase)

Descrição: Chave primária inteira criada automaticamente pelo Django para identificar o cronograma.

uuid: uuid.UUID

Origem: dados_comuns/behaviors.py (TemChaveExterna)

Descrição: Identificador externo único do cronograma, usado em integrações e endpoints que expõem UUID.

numero: str

Descrição: Número único do cronograma, gerado automaticamente no formato XXX/YYYYA (armazenável) ou XXX/YYYYP (ponto a ponto), onde XXX é o sequencial e YYYY o ano.

status: str

Origem: dados_comuns/fluxo_status.py (FluxoCronograma)

Descrição: Status atual do workflow do cronograma. Os estados possíveis são: RASCUNHO, ASSINADO_E_ENVIADO_AO_FORNECEDOR, ASSINADO_FORNECEDOR, ASSINADO_DILOG_ABASTECIMENTO, ASSINADO_CODAE, SOLICITADO_ALTERACAO, ALTERACAO_CODAE.

criado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (CriadoEm)

Descrição: Timestamp preenchido automaticamente na criação do cronograma.

alterado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (TemAlteradoEm)

Descrição: Timestamp preenchido automaticamente na última alteração do cronograma.

contrato: terceirizada.Contrato | None

Descrição: Contrato vinculado ao cronograma. Define o número do contrato, pregão/chamada pública, ata e demais informações contratuais.

empresa: terceirizada.Terceirizada | None

Descrição: Empresa fornecedora responsável pela entrega dos produtos.

qtd_total_programada: float | None

Descrição: Quantidade total programada para entrega, na unidade de medida definida em unidade_medida.

unidade_medida: UnidadeMedida | None

Descrição: Unidade de medida da quantidade programada (ex.: kg, ton, unidades).

armazem: terceirizada.Terceirizada | None

Descrição: Distribuidor/armazém responsável pelo armazenamento dos produtos.

ficha_tecnica: ficha_tecnica.FichaTecnicaDoProduto | None

Descrição: Ficha técnica do produto alimentício, contendo especificações, embalagens, marca, categoria e programa (ex.: LEVE_LEITE).

tipo_embalagem_secundaria: qualidade.TipoEmbalagemQld | None

Descrição: Tipo de embalagem secundária utilizada no produto, conforme cadastro no módulo de qualidade.

custo_unitario_produto: float | None

Descrição: Custo unitário do produto em reais (R$).

numero_empenho: str

Descrição: Número do empenho associado ao cronograma.

qtd_total_empenho: float | None

Descrição: Quantidade total registrada no empenho.

observacoes: str

Descrição: Observações gerais sobre o cronograma, registradas durante a criação.

etapas: django.db.models.QuerySet[EtapasDoCronograma]

Descrição: Relação reversa 1:N com EtapasDoCronograma.

Lista as etapas programadas de entrega do cronograma, cada uma com data, quantidade, empenho e embalagens.

programacoes_de_recebimento: django.db.models.QuerySet[ProgramacaoDoRecebimentoDoCronograma]

Descrição: Relação reversa 1:N com ProgramacaoDoRecebimentoDoCronograma.

Lista as programações de recebimento associadas ao cronograma.

solicitacoes_de_alteracao: django.db.models.QuerySet[SolicitacaoAlteracaoCronograma]

Descrição: Relação reversa 1:N com SolicitacaoAlteracaoCronograma.

Lista as solicitações de alteração já realizadas para este cronograma.

logs: list[LogSolicitacoesUsuario]

Origem: dados_comuns/behaviors.py (Logs)

Descrição: Lista dos registros de log de transições de status do cronograma, ordenados por criado_em.

log_mais_recente: LogSolicitacoesUsuario | None

Origem: dados_comuns/behaviors.py (Logs)

Descrição: Último registro de log de transição de status do cronograma.

id_externo: str

Origem: dados_comuns/behaviors.py (TemIdentificadorExternoAmigavel)

Descrição: Identificador externo amigável composto pelos 5 primeiros caracteres maiúsculos do UUID.

ponto_a_ponto: bool

Descrição: Propriedade que indica se o cronograma é do tipo Ponto a Ponto (FLV). Retorna True quando a ficha técnica tem categoria FLV e tipo de entrega PONTO_A_PONTO.

salvar_log_transicao: Callable[source]

Descrição: Registra no log uma transição de status do cronograma, criando um LogSolicitacoesUsuario com o tipo CRONOGRAMA.

exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

cronogramatermorecebimentodefinitivo_set

Accessor to the related objects manager on the reverse side of a many-to-one relation.

In the example:

class Child(Model):
    parent = ForeignKey(Parent, related_name='children')

Parent.children is a ReverseManyToOneDescriptor instance.

Most of the implementation is delegated to a dynamically defined manager class built by create_reverse_many_to_one_manager() defined below.

termos_recebimento_definitivo

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

EtapasDoCronograma

Cada cronograma é dividido em uma ou mais etapas de entrega. Uma etapa representa uma remessa programada, com data, quantidade, empenho e total de embalagens. As etapas são a unidade que efetivamente aparece no calendário de entregas e são validadas contra as interrupções.

class EtapasDoCronograma(*args, **kwargs)[source]

Bases: ModeloBase

Etapa individual de um cronograma de entrega.

Cada etapa representa uma parcela programada dentro do cronograma, com data, quantidade, empenho e total de embalagens. Pode ser subdividida em partes.

id: int

Descrição: Chave primária inteira criada automaticamente pelo Django para identificar a etapa.

uuid: uuid.UUID

Origem: dados_comuns/behaviors.py (TemChaveExterna)

Descrição: Identificador externo único da etapa, usado em integrações.

cronograma: Cronograma | None

Descrição: Cronograma ao qual a etapa pertence.

numero_empenho: str

Descrição: Número do empenho específico para esta etapa.

qtd_total_empenho: float | None

Descrição: Quantidade total do empenho alocada para esta etapa.

etapa: int | None

Descrição: Número sequencial da etapa (1 a 100), utilizado para ordenação.

parte: int | None

Descrição: Subdivisão da etapa (parte), quando a etapa é desmembrada em entregas menores.

data_programada: date | None

Descrição: Data programada para entrega da etapa.

quantidade: float | None

Descrição: Quantidade a ser entregue nesta etapa, na unidade de medida do cronograma.

total_embalagens: float | None

Descrição: Total de embalagens previstas para esta etapa.

criado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (CriadoEm)

Descrição: Timestamp preenchido automaticamente na criação do registro.

alterado_em: datetime.datetime

Descrição: Timestamp preenchido automaticamente na última alteração do registro.

exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

etapas_antigas

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

etapas_novas

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

property quantidade_estimada_disponivel

Calcula a quantidade remanescente disponível para este mês.

Agrega a quantidade de TODAS as etapas do mesmo cronograma e mês, subtrai a soma de todas as programações semanais (ProgramacaoEntregaSemanal) vinculadas ao mesmo cronograma e mesmo mês.

Todas as etapas do mesmo mês retornam o mesmo valor (o saldo agregado do mês), evitando dupla-contagem quando há múltiplas etapas no mesmo período.

Retorna None se não for possível calcular (sem data ou sem cronograma), ou um float com o saldo restante.

ProgramacaoDoRecebimentoDoCronograma

Exclusiva para cronogramas do tipo armazenável. Define as datas em que o recebimento físico dos produtos deve ocorrer e o tipo de carga (paletizada ou estivada/batida). Serve como guia para a logística de recebimento nos armazéns.

class ProgramacaoDoRecebimentoDoCronograma(*args, **kwargs)[source]

Bases: ModeloBase

Programação de recebimento associada a um cronograma.

Define as datas programadas e o tipo de carga (paletizada ou estivada/batida) para o recebimento dos produtos.

id: int

Descrição: Chave primária inteira criada automaticamente pelo Django para identificar a programação.

uuid: uuid.UUID

Origem: dados_comuns/behaviors.py (TemChaveExterna)

Descrição: Identificador externo único da programação, usado em integrações.

cronograma: Cronograma | None

Descrição: Cronograma ao qual a programação de recebimento está vinculada.

data_programada: str

Descrição: Data programada para recebimento. Campo texto para aceitar tanto datas completas quanto formato MM/YYYY (usado em cronogramas ponto a ponto).

tipo_carga: str

Descrição: Tipo de carga para recebimento. Valores possíveis: PALETIZADA (Paletizada) ou ESTIVADA_BATIDA (Estivada / Batida).

ESTIVADA_BATIDA = 'ESTIVADA_BATIDA'
exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

PALETIZADA = 'PALETIZADA'
TIPO_CARGA_CHOICES = (('PALETIZADA', 'Paletizada'), ('ESTIVADA_BATIDA', 'Estivada / Batida'))
get_tipo_carga_display(*, field=<django.db.models.fields.CharField: tipo_carga>)
programacoes_novas

Accessor to the related objects manager on the forward and reverse sides of a many-to-many relation.

In the example:

class Pizza(Model):
    toppings = ManyToManyField(Topping, related_name='pizzas')

Pizza.toppings and Topping.pizzas are ManyToManyDescriptor instances.

Most of the implementation is delegated to a dynamically defined manager class built by create_forward_many_to_many_manager() defined below.

SolicitacaoAlteracaoCronograma

Quando um cronograma já está assinado e em vigor, fornecedores ou a CODAE podem solicitar alterações nas etapas e programações de recebimento. Esta solicitação passa por um fluxo de aprovação próprio: a DILOG Abastecimento revisa, o cronograma toma ciência, a DILOG Abastecimento aprova ou reprova, e por fim a DILOG aprova ou reprova. Se aprovada, as etapas e programações novas substituem as antigas no cronograma original.

class SolicitacaoAlteracaoCronograma(*args, **kwargs)[source]

Bases: ModeloBase, TemIdentificadorExternoAmigavel, FluxoAlteracaoCronograma, Logs

Solicitação de alteração de um cronograma já assinado.

Permite que fornecedores ou CODAE solicitem alterações nas etapas e programações de recebimento de um cronograma. Passa por um fluxo de aprovação próprio (FluxoAlteracaoCronograma).

id: int

Descrição: Chave primária inteira criada automaticamente pelo Django para identificar a solicitação.

uuid: uuid.UUID

Origem: dados_comuns/behaviors.py (TemChaveExterna)

Descrição: Identificador externo único da solicitação, usado em integrações e endpoints.

objects: SolicitacaoAlteracaoCronogramaQuerySet

Descrição: Manager personalizado que fornece métodos de filtro por status (filtrar_por_status, em_analise).

numero_solicitacao: str

Descrição: Número único da solicitação, gerado automaticamente no formato XXXXXXXX-ALT, onde XXXXXXXX é o PK preenchido com zeros.

status: str

Origem: dados_comuns/fluxo_status.py (FluxoAlteracaoCronograma)

Descrição: Status atual do workflow de alteração. Os estados possíveis são: SOLICITACAO_CRIADA, EM_ANALISE, CRONOGRAMA_CIENTE, APROVADO_DILOG_ABASTECIMENTO, REPROVADO_DILOG_ABASTECIMENTO, APROVADO_DILOG, REPROVADO_DILOG, ALTERACAO_ENVIADA_FORNECEDOR, FORNECEDOR_CIENTE.

cronograma: Cronograma

Descrição: Cronograma original ao qual a solicitação de alteração se refere.

qtd_total_programada: float | None

Descrição: Nova quantidade total programada proposta na alteração.

etapas_antigas: django.db.models.QuerySet[EtapasDoCronograma]

Descrição: Relação M:N com EtapasDoCronograma.

Etapas originais do cronograma no momento da solicitação, mantidas como referência para comparação com as etapas novas.

etapas_novas: django.db.models.QuerySet[EtapasDoCronograma]

Descrição: Relação M:N com EtapasDoCronograma.

Novas etapas propostas na solicitação de alteração. Em caso de aprovação pela DILOG, substituem as etapas_antigas no cronograma.

programacoes_novas: django.db.models.QuerySet[ProgramacaoDoRecebimentoDoCronograma]

Descrição: Relação M:N com ProgramacaoDoRecebimentoDoCronograma.

Novas programações de recebimento propostas para substituir as programações atuais do cronograma.

justificativa: str

Descrição: Justificativa fornecida pelo solicitante (fornecedor ou CODAE) para a alteração.

usuario_solicitante: perfil.Usuario

Descrição: Usuário que criou a solicitação de alteração.

criado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (CriadoEm)

Descrição: Timestamp preenchido automaticamente na criação da solicitação.

logs: list[LogSolicitacoesUsuario]

Origem: dados_comuns/behaviors.py (Logs)

Descrição: Lista dos registros de log de transições de status da solicitação.

exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

cronograma_ciente

NoOp function, ignores all arguments.

dilog_abastecimento_aprova

NoOp function, ignores all arguments.

dilog_abastecimento_reprova

NoOp function, ignores all arguments.

dilog_aprova

NoOp function, ignores all arguments.

dilog_reprova

NoOp function, ignores all arguments.

fornecedor_ciente

NoOp function, ignores all arguments.

inicia_fluxo

NoOp function, ignores all arguments.

inicia_fluxo_codae

NoOp function, ignores all arguments.

SolicitacaoAlteracaoCronogramaQuerySet

QuerySet personalizado que ordena as solicitações pelo log mais recente e oferece filtros por fornecedor, número do cronograma e nome do produto.

class SolicitacaoAlteracaoCronogramaQuerySet(model=None, query=None, using=None, hints=None)[source]

Bases: QuerySet

QuerySet personalizado para SolicitacaoAlteracaoCronograma.

Fornece métodos de filtro por status com ordenação pelo log mais recente e filtros por fornecedor, cronograma e produto.

em_analise()[source]
filtrar_por_status(status, filtros=None, init=None, end=None)[source]

Filtra solicitações por status, ordenando pelo log mais recente.

Aceita filtros opcionais por nome_fornecedor, numero_cronograma e nome_produto, além de parâmetros init/end para paginação.

InterrupcaoProgramadaEntrega

Gerencia os dias em que não pode haver entrega. Feriados, emendas, reuniões e inventários são cadastrados aqui e consultados pelo calendário de cronogramas para impedir que etapas sejam agendadas nessas datas. A interrupção é separada por tipo de calendário: armazenável ou ponto a ponto.

class InterrupcaoProgramadaEntrega(*args, **kwargs)[source]

Bases: ModeloBase

Interrupção programada em que não há recebimento de entregas.

Utilizada pelo calendário de cronogramas para bloquear datas específicas em que as entregas não podem ocorrer (feriados, emendas de feriado, reuniões, inventários, etc.).

A interrupção é separada por tipo de calendário: - ARMAZENAVEL: Bloqueia o calendário de cronogramas armazenáveis. - PONTO_A_PONTO: Bloqueia o calendário de cronogramas FLV.

A combinação data + tipo_calendario é única, garantindo que não haja duplicidade de registros para o mesmo dia e tipo.

id: int

Descrição: Chave primária inteira criada automaticamente pelo Django.

uuid: uuid.UUID

Origem: dados_comuns/behaviors.py (TemChaveExterna)

Descrição: Identificador externo único da interrupção, usado em integrações.

data: datetime.date

Descrição: Data em que a entrega está suspensa. Utilizada pelo calendário de cronogramas para impedir o cadastro de etapas nesta data.

motivo: str

Descrição: Motivo da interrupção. Valores possíveis: EMENDA, REUNIAO, INVENTARIO, FERIADO, OUTROS.

descricao_motivo: str

Descrição: Descrição detalhada do motivo. Obrigatório quando motivo = OUTROS.

tipo_calendario: str

Descrição: Tipo de calendário ao qual a interrupção se aplica. ARMAZENAVEL (Armazenável): bloqueia o calendário de cronogramas armazenáveis. PONTO_A_PONTO (Ponto a Ponto): bloqueia o calendário de cronogramas FLV.

MOTIVO_CHOICES = (('EMENDA', 'Emenda'), ('REUNIAO', 'Reunião'), ('INVENTARIO', 'Inventário'), ('FERIADO', 'Feriado'), ('OUTROS', 'Outros'))
MOTIVO_EMENDA = 'EMENDA'
MOTIVO_FERIADO = 'FERIADO'
MOTIVO_INVENTARIO = 'INVENTARIO'
MOTIVO_OUTROS = 'OUTROS'
MOTIVO_REUNIAO = 'REUNIAO'
exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

TIPO_CALENDARIO_ARMAZENAVEL = 'ARMAZENAVEL'
TIPO_CALENDARIO_CHOICES = (('ARMAZENAVEL', 'Armazenável'), ('PONTO_A_PONTO', 'Ponto a Ponto'))
TIPO_CALENDARIO_PONTO_A_PONTO = 'PONTO_A_PONTO'
get_motivo_display(*, field=<django.db.models.fields.CharField: motivo>)
get_next_by_data(*, field=<django.db.models.fields.DateField: data>, is_next=True, **kwargs)
get_previous_by_data(*, field=<django.db.models.fields.DateField: data>, is_next=False, **kwargs)
get_tipo_calendario_display(*, field=<django.db.models.fields.CharField: tipo_calendario>)