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,FluxoCronogramaCronograma 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) ouXXX/YYYYP(ponto a ponto), ondeXXXé o sequencial eYYYYo 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
Truequando a ficha técnica tem categoriaFLVe tipo de entregaPONTO_A_PONTO.
- salvar_log_transicao: Callable[source]
Descrição: Registra no log uma transição de status do cronograma, criando um
LogSolicitacoesUsuariocom o tipoCRONOGRAMA.
- 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.childrenis aReverseManyToOneDescriptorinstance.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.toppingsandTopping.pizzasareManyToManyDescriptorinstances.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:
ModeloBaseEtapa 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.toppingsandTopping.pizzasareManyToManyDescriptorinstances.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.toppingsandTopping.pizzasareManyToManyDescriptorinstances.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:
ModeloBaseProgramaçã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) ouESTIVADA_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.toppingsandTopping.pizzasareManyToManyDescriptorinstances.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,LogsSolicitaçã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, ondeXXXXXXXXé 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_antigasno 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.
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:
ModeloBaseInterrupçã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>)