models

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

FabricanteFichaTecnica

Armazena os dados do fabricante (e do envasador/distribuidor) específicos de uma ficha técnica. Diferente do cadastro global de Fabricante, estes dados são “congelados” na ficha no momento do cadastro, podendo divergir do cadastro mestre (CNPJ, endereço, contato, etc.).

A mesma entidade é usada tanto para o campo fabricante quanto para o campo envasador_distribuidor da ficha (duas instâncias distintas).

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

Bases: ModeloBase

Modelo para armazenar informações do fabricante específicas para uma ficha técnica.

id: int

Origem: dados_comuns/behaviors.py (ModeloBase)

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

uuid: uuid.UUID

Origem: dados_comuns/behaviors.py (TemChaveExterna)

Descrição: Identificador externo único do registro de fabricante da ficha.

fabricante: produto.Fabricante | None

Descrição: Referência opcional ao cadastro global de fabricante (on_delete=SET_NULL). Quando presente, o nome exibido vem deste cadastro; os demais dados (endereço, contato) ficam neste modelo.

cnpj: str

Descrição: CNPJ do fabricante/envasador (até 14 dígitos, mínimo 14 com MinLengthValidator). Aceita apenas números (sem máscara).

cep: str

Descrição: CEP (8 dígitos, sem máscara).

endereco: str

Descrição: Logradouro do endereço.

numero: str

Descrição: Número do endereço.

complemento: str

Descrição: Complemento do endereço (ex.: bloco, andar, sala).

bairro: str

Descrição: Bairro.

cidade: str

Descrição: Cidade.

estado: str

Descrição: Estado (UF). Utilizado no filtro do admin por estado.

email: str

Descrição: E-mail de contato (EmailField).

telefone: str

Descrição: Telefone de contato (até 13 caracteres, mínimo 8 com MinLengthValidator).

criado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (CriadoEm)

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

alterado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (TemAlteradoEm)

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

exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

FichaTecnicaDoProduto

Modelo central do submódulo. Representa a ficha técnica de um produto alimentício: especificações do produto, fabricante/envasador, tabela nutricional, conservação, transporte, embalagens, rotulagem, responsável técnico e modo de preparo.

O número da ficha é gerado automaticamente após a primeira gravação no formato FTXXX (XXX é o PK preenchido com zeros), via signal post_save.

A ficha possui um workflow de aprovação (FichaTecnicaDoProdutoWorkflow) com os estados:

  • RASCUNHO (Rascunho) — estado inicial; cadastro parcial pelo fornecedor.

  • ENVIADA_PARA_ANALISE (Enviada para Análise) — enviada pelo fornecedor para a GPCODAE (transição inicia_fluxo).

  • APROVADA (Aprovada) — aprovada pela GPCODAE (transição gpcodae_aprova).

  • ENVIADA_PARA_CORRECAO (Enviada para Correção) — devolvida ao fornecedor com correções (transição gpcodae_envia_para_correcao).

O fluxo também permite: fornecedor_corrige (de ENVIADA_PARA_CORRECAO de volta para ENVIADA_PARA_ANALISE) e fornecedor_atualiza (de APROVADA para ENVIADA_PARA_ANALISE — atualização de uma ficha já aprovada). Cada transição gera um LogSolicitacoesUsuario do tipo FICHA_TECNICA_DO_PRODUTO e o envio para análise dispara e-mail de notificação.

Regras de negócio por categoria (aplicadas nos serializadores/validators):

  • FLV (hortifrutigranjeiros): exige organico e especie_variedade.

  • Perecíveis: exige organico, prazo_validade_descongelamento, temperatura_congelamento, temperatura_veiculo, condicoes_de_transporte e variacao_percentual.

  • Não perecíveis: exige organico e produto_eh_liquido.

Campos dependentes obrigatórios:

  • organico = True exige mecanismo_controle (CERTIFICACAO/OPAC/OCS).

  • alergenicos = True exige ingredientes_alergenicos.

  • lactose = True exige lactose_detalhe.

  • produto_eh_liquido = True exige volume_embalagem_primaria e unidade_medida_volume_primaria.

As declarações de conformidade com o Anexo I do Edital (embalagens_de_acordo_com_anexo e rotulo_legivel) devem ser marcadas como True na criação (validadas no serializador de criação).

class FichaTecnicaDoProduto(id, criado_em, alterado_em, uuid, status, numero, produto, marca, categoria, tipo_entrega, programa, pregao_chamada_publica, empresa, fabricante, envasador_distribuidor, prazo_validade, numero_registro, organico, mecanismo_controle, especie_variedade, componentes_produto, alergenicos, ingredientes_alergenicos, gluten, lactose, lactose_detalhe, porcao, unidade_medida_porcao, valor_unidade_caseira, unidade_medida_caseira, prazo_validade_descongelamento, condicoes_de_conservacao, temperatura_congelamento, temperatura_veiculo, condicoes_de_transporte, embalagem_primaria, embalagem_secundaria, embalagens_de_acordo_com_anexo, material_embalagem_primaria, produto_eh_liquido, volume_embalagem_primaria, unidade_medida_volume_primaria, peso_liquido_embalagem_primaria, unidade_medida_primaria, peso_liquido_embalagem_secundaria, unidade_medida_secundaria, peso_embalagem_primaria_vazia, unidade_medida_primaria_vazia, peso_embalagem_secundaria_vazia, unidade_medida_secundaria_vazia, variacao_percentual, sistema_vedacao_embalagem_secundaria, rotulo_legivel, nome_responsavel_tecnico, habilitacao, numero_registro_orgao, arquivo, modo_de_preparo, informacoes_adicionais)[source]

Bases: ModeloBase, TemIdentificadorExternoAmigavel, Logs, FluxoFichaTecnicaDoProduto

id: int

Origem: dados_comuns/behaviors.py (ModeloBase)

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 ficha, usado em integrações e endpoints.

id_externo: str

Origem: dados_comuns/behaviors.py (TemIdentificadorExternoAmigavel)

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

numero: str

Descrição: Número da ficha técnica, único, gerado automaticamente após a criação no formato FTXXX (XXX = PK com zeros à esquerda).

produto: produto.NomeDeProdutoEdital

Descrição: Produto (nome do produto do edital) ao qual a ficha se refere. Obrigatório com on_delete=PROTECT.

marca: produto.Marca | None

Descrição: Marca do produto (opcional, on_delete=PROTECT).

categoria: str

Descrição: Categoria do produto. Valores possíveis: PERECIVEIS (Perecíveis), NAO_PERECIVEIS (Não Perecíveis) e FLV. Define o conjunto de campos obrigatórios da ficha.

tipo_entrega: str

Descrição: Tipo de entrega. Valores possíveis: ARMAZEM (Armazém, default) e PONTO_A_PONTO (Ponto a Ponto). Fichas FLV + PONTO_A_PONTO têm regras de análise simplificadas (não exigem os blocos de informações nutricionais, conservação, armazenamento, embalagem/ rotulagem e modo de preparo).

programa: str

Descrição: Programa de alimentação. Valores possíveis: LEVE_LEITE (Leve Leite) e ALIMENTACAO_ESCOLAR (Alimentação Escolar, default).

pregao_chamada_publica: str

Descrição: Número do pregão eletrônico / chamada pública ao qual o produto está vinculado.

empresa: terceirizada.Terceirizada | None

Descrição: Empresa fornecedora responsável pela ficha (on_delete=CASCADE). Utilizada para filtrar as fichas visíveis para usuários fornecedores.

fabricante: FabricanteFichaTecnica | None

Descrição: Dados do fabricante específicos da ficha (on_delete=CASCADE).

envasador_distribuidor: FabricanteFichaTecnica | None

Descrição: Dados do envasador/distribuidor específicos da ficha (on_delete=CASCADE).

prazo_validade: str

Descrição: Prazo de validade do produto.

numero_registro: str

Descrição: Número do registro do rótulo.

organico: bool | None

Descrição: Indica se o produto é orgânico. Quando True, exige mecanismo_controle.

mecanismo_controle: str

Descrição: Mecanismo de controle de produto orgânico. Valores possíveis: CERTIFICACAO (Certificação), OPAC e OCS. Obrigatório quando organico = True.

especie_variedade: str

Descrição: Espécie ou variedade cultivada. Obrigatório para fichas FLV.

componentes_produto: str

Descrição: Componentes do produto (texto).

alergenicos: bool | None

Descrição: Indica se o produto pode conter alergênicos. Quando True, exige ingredientes_alergenicos.

ingredientes_alergenicos: str

Descrição: Ingredientes/aditivos alergênicos. Obrigatório quando alergenicos = True.

gluten: bool | None

Descrição: Indica se o produto contém glúten.

lactose: bool | None

Descrição: Indica se o produto contém lactose. Quando True, exige lactose_detalhe.

lactose_detalhe: str

Descrição: Detalhamento sobre a lactose. Obrigatório quando lactose = True.

porcao: str | None

Descrição: Porção (quantidade de referência para a tabela nutricional).

unidade_medida_porcao: base.UnidadeMedida | None

Descrição: Unidade de medida da porção (ex.: g, ml).

valor_unidade_caseira: str | None

Descrição: Medida caseira correspondente à porção (ex.: “1 colher de sopa”).

unidade_medida_caseira: str

Descrição: Unidade de medida caseira (texto livre).

informacoes_nutricionais: django.db.models.QuerySet[InformacoesNutricionaisFichaTecnica]

Descrição: Relação reversa 1:N com InformacoesNutricionaisFichaTecnica. Lista os itens da tabela nutricional da ficha (cada um com quantidade por 100 g, por porção e valor diário).

prazo_validade_descongelamento: str

Descrição: Prazo de validade após o descongelamento, mantido sob refrigeração. Obrigatório para produtos perecíveis.

condicoes_de_conservacao: str

Descrição: Condições de conservação e prazo máximo para consumo após a abertura da embalagem primária.

temperatura_congelamento: float | None

Descrição: Temperatura de congelamento do produto. Obrigatório para perecíveis.

temperatura_veiculo: float | None

Descrição: Temperatura interna do veículo para transporte. Obrigatório para perecíveis.

condicoes_de_transporte: str

Descrição: Condições de transporte do produto. Obrigatório para perecíveis.

embalagem_primaria: str

Descrição: Descrição da embalagem primária do produto.

embalagem_secundaria: str

Descrição: Descrição da embalagem secundária do produto.

embalagens_de_acordo_com_anexo: bool | None

Descrição: Declaração de que as embalagens primária e secundária estão de acordo com as especificações do Anexo I do Edital. Deve ser marcada como True na criação (validação no serializador).

material_embalagem_primaria: str

Descrição: Material da embalagem primária.

produto_eh_liquido: bool | None

Descrição: Indica se o produto é líquido. Quando True, exige volume_embalagem_primaria e unidade_medida_volume_primaria. Obrigatório para não perecíveis.

volume_embalagem_primaria: float | None

Descrição: Volume do produto na embalagem primária.

unidade_medida_volume_primaria: base.UnidadeMedida | None

Descrição: Unidade de medida do volume da embalagem primária.

peso_liquido_embalagem_primaria: float | None

Descrição: Peso líquido do produto na embalagem primária.

unidade_medida_primaria: base.UnidadeMedida | None

Descrição: Unidade de medida do peso líquido da embalagem primária.

peso_liquido_embalagem_secundaria: float | None

Descrição: Peso líquido do produto na embalagem secundária.

unidade_medida_secundaria: base.UnidadeMedida | None

Descrição: Unidade de medida do peso líquido da embalagem secundária.

peso_embalagem_primaria_vazia: float | None

Descrição: Peso da embalagem primária vazia.

unidade_medida_primaria_vazia: base.UnidadeMedida | None

Descrição: Unidade de medida do peso da embalagem primária vazia.

peso_embalagem_secundaria_vazia: float | None

Descrição: Peso da embalagem secundária vazia.

unidade_medida_secundaria_vazia: base.UnidadeMedida | None

Descrição: Unidade de medida do peso da embalagem secundária vazia.

variacao_percentual: float | None

Descrição: Variação percentual aceita nos pesos. Obrigatório para perecíveis.

sistema_vedacao_embalagem_secundaria: str

Descrição: Sistema de vedação da embalagem secundária.

rotulo_legivel: bool | None

Descrição: Declaração de que o rótulo da embalagem primária (e secundária, se for o caso) conterá, de forma legível e indelével, todas as informações solicitadas no Anexo I do Edital. Deve ser marcada como True na criação.

nome_responsavel_tecnico: str

Descrição: Nome completo do responsável técnico.

habilitacao: str

Descrição: Habilitação do responsável técnico.

numero_registro_orgao: str

Descrição: Número do registro em órgão competente do responsável técnico.

arquivo: django.db.models.fields.files.FieldFile | None

Descrição: Arquivo PDF da ficha técnica (upload_to="fichas_tecnicas"), com validação de extensão PDF e tamanho máximo de 10 MB. Recebido como base64 pela API e convertido para ContentFile no helper de criação.

modo_de_preparo: str

Descrição: Modo de preparo do produto.

informacoes_adicionais: str

Descrição: Informações adicionais da ficha.

status: str

Origem: dados_comuns/fluxo_status.py (FichaTecnicaDoProdutoWorkflow)

Descrição: Status atual do workflow. Estados possíveis: RASCUNHO, ENVIADA_PARA_ANALISE, APROVADA e ENVIADA_PARA_CORRECAO.

criado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (CriadoEm)

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

alterado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (TemAlteradoEm)

Descrição: Timestamp preenchido automaticamente na última alteração da ficha.

logs: list[LogSolicitacoesUsuario]

Origem: dados_comuns/behaviors.py (Logs)

Descrição: Lista dos registros de log de transições de status da ficha, 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 da ficha. Usado nos serializadores de painel/detalhe para exibir a data/hora da última movimentação.

analises: django.db.models.QuerySet[AnaliseFichaTecnica]

Descrição: Relação reversa 1:N com AnaliseFichaTecnica. Lista as análises da GPCODAE realizadas sobre a ficha, ordenáveis por criado_em (a análise vigente é a última).

cronograma: django.db.models.QuerySet[Cronograma]

Descrição: Relação reversa com Cronograma via o campo Cronograma.ficha_tecnica (definido sem related_name).

cronograma é o nome de consulta (query name) da relação — usado em filtros ORM como cronograma__isnull (endpoint lista-simples-sem-cronograma). O accessor padrão de instância é cronograma_set.

layout_embalagem: layout_embalagem.LayoutDeEmbalagem | None

Descrição: Relação reversa 1:1 com LayoutDeEmbalagem. Layout de embalagem vinculado à ficha, quando existir.

questoes_conferencia: recebimento.QuestoesPorProduto | None

Descrição: Relação reversa 1:1 com QuestoesPorProduto. Questões de conferência de qualidade vinculadas à ficha, quando existirem.

ponto_a_ponto: bool

Descrição: Propriedade que indica se a ficha é do tipo Ponto a Ponto (FLV). Retorna True quando tipo_entrega = PONTO_A_PONTO. Usada nos serializadores e na lógica de análise: fichas FLV ponto a ponto não exigem os blocos de informações nutricionais, conservação, armazenamento, embalagem/rotulagem e modo de preparo.

salvar_log_transicao: Callable[source]

Descrição: Registra no log uma transição de status da ficha, criando um LogSolicitacoesUsuario com o tipo FICHA_TECNICA_DO_PRODUTO.

exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

InformacoesNutricionaisFichaTecnica

Item da tabela nutricional de uma ficha técnica. Vincula uma InformacaoNutricional (ex.: “Valor energético”, “Carboidratos”) aos valores declarados por 100 g, por porção e o valor diário (percentual).

class InformacoesNutricionaisFichaTecnica(id, uuid, ficha_tecnica, informacao_nutricional, quantidade_por_100g, quantidade_porcao, valor_diario)[source]

Bases: TemChaveExterna

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 do item nutricional.

ficha_tecnica: FichaTecnicaDoProduto

Descrição: Ficha técnica à qual o item pertence (on_delete=CASCADE).

informacao_nutricional: produto.InformacaoNutricional

Descrição: Informação nutricional de referência (nome do nutriente/informação), com on_delete=DO_NOTHING.

quantidade_por_100g: str

Descrição: Quantidade do nutriente por 100 g (texto, ex.: “12,5 g”).

quantidade_porcao: str

Descrição: Quantidade do nutriente por porção (texto).

valor_diario: str

Descrição: Percentual do valor diário de referência (texto, ex.: “5%”).

exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError

AnaliseFichaTecnica

Registro da análise da ficha técnica pela GPCODAE. A análise é dividida em blocos (“collapses”) de conferência, cada um com um campo *_conferido (bool) e um campo *_correcoes (texto com as observações/correções exigidas quando o bloco não foi aprovado).

Blocos de conferência:

  • fabricante_envasador — fabricante e envasador/distribuidor.

  • detalhes_produto — detalhes do produto (validade, orgânico, componentes, alergênicos, glúten, lactose).

  • informacoes_nutricionais — tabela nutricional.

  • conservacao — conservação e descongelamento (perecíveis).

  • temperatura_e_transporte — temperaturas e transporte (perecíveis).

  • armazenamento — embalagens (primária/secundária).

  • embalagem_e_rotulagem — embalagens, pesos, vedações e rotulagem.

  • responsavel_tecnico — responsável técnico e arquivo.

  • modo_preparo — modo de preparo.

  • outras_informacoes — informações adicionais (só booleano).

Regras de negócio da análise:

  • A propriedade aprovada computa se todos os blocos necessários foram conferidos sem correções. Para fichas FLV ponto a ponto, os blocos de informações nutricionais, conservação, armazenamento, embalagem/rotulagem e modo de preparo são ignorados.

  • Ao salvar uma análise com aprovada = True a ficha é aprovada (gpcodae_aprova); caso contrário é enviada para correção (gpcodae_envia_para_correcao).

  • Na análise, um bloco marcado *_conferido = False exige *_correcoes preenchido; um bloco True exige *_correcoes vazio.

class AnaliseFichaTecnica(id, criado_em, alterado_em, uuid, criado_por, ficha_tecnica, fabricante_envasador_conferido, fabricante_envasador_correcoes, detalhes_produto_conferido, detalhes_produto_correcoes, informacoes_nutricionais_conferido, informacoes_nutricionais_correcoes, conservacao_conferido, conservacao_correcoes, temperatura_e_transporte_conferido, temperatura_e_transporte_correcoes, armazenamento_conferido, armazenamento_correcoes, embalagem_e_rotulagem_conferido, embalagem_e_rotulagem_correcoes, responsavel_tecnico_conferido, responsavel_tecnico_correcoes, modo_preparo_conferido, modo_preparo_correcoes, outras_informacoes_conferido)[source]

Bases: ModeloBase, CriadoPor

id: int

Origem: dados_comuns/behaviors.py (ModeloBase)

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 análise.

ficha_tecnica: FichaTecnicaDoProduto

Descrição: Ficha técnica analisada (on_delete=CASCADE). Uma ficha pode ter várias análises ao longo do tempo (a vigente é a última por criado_em).

fabricante_envasador_conferido: bool | None

Descrição: Bloco “Fabricante/Envasador” conferido (sem correções pendentes).

fabricante_envasador_correcoes: str

Descrição: Correções exigidas no bloco “Fabricante/Envasador”.

detalhes_produto_conferido: bool | None

Descrição: Bloco “Detalhes do Produto” conferido.

detalhes_produto_correcoes: str

Descrição: Correções exigidas no bloco “Detalhes do Produto”.

informacoes_nutricionais_conferido: bool | None

Descrição: Bloco “Informações Nutricionais” conferido. Ignorado para fichas FLV ponto a ponto.

informacoes_nutricionais_correcoes: str

Descrição: Correções exigidas no bloco “Informações Nutricionais”.

conservacao_conferido: bool | None

Descrição: Bloco “Conservação” conferido (perecíveis).

conservacao_correcoes: str

Descrição: Correções exigidas no bloco “Conservação”.

temperatura_e_transporte_conferido: bool | None

Descrição: Bloco “Temperatura e Transporte” conferido (perecíveis). Aceita None na validação de aprovação.

temperatura_e_transporte_correcoes: str

Descrição: Correções exigidas no bloco “Temperatura e Transporte”.

armazenamento_conferido: bool | None

Descrição: Bloco “Armazenamento” conferido.

armazenamento_correcoes: str

Descrição: Correções exigidas no bloco “Armazenamento”.

embalagem_e_rotulagem_conferido: bool | None

Descrição: Bloco “Embalagem e Rotulagem” conferido.

embalagem_e_rotulagem_correcoes: str

Descrição: Correções exigidas no bloco “Embalagem e Rotulagem”.

responsavel_tecnico_conferido: bool | None

Descrição: Bloco “Responsável Técnico” conferido.

responsavel_tecnico_correcoes: str

Descrição: Correções exigidas no bloco “Responsável Técnico”.

modo_preparo_conferido: bool | None

Descrição: Bloco “Modo de Preparo” conferido.

modo_preparo_correcoes: str

Descrição: Correções exigidas no bloco “Modo de Preparo”.

outras_informacoes_conferido: bool | None

Descrição: Bloco “Outras Informações” conferido. Não possui campo de correções; é sempre exigido True para a aprovação.

criado_por: perfil.Usuario | None

Origem: dados_comuns/behaviors.py (CriadoPor)

Descrição: Usuário que realizou a análise.

criado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (CriadoEm)

Descrição: Timestamp preenchido automaticamente na criação da análise.

alterado_em: datetime.datetime

Origem: dados_comuns/behaviors.py (TemAlteradoEm)

Descrição: Timestamp preenchido automaticamente na última alteração da análise.

aprovada: bool

Descrição: Propriedade que indica se a análise aprovou a ficha. Todos os blocos exigidos devem estar True e sem correções, com exceção de temperatura_e_transporte (aceita None). Para fichas FLV ponto a ponto, os blocos de informações nutricionais, conservação, armazenamento, embalagem/rotulagem e modo de preparo são ignorados.

exception NotUpdated

Bases: ObjectNotUpdated, DatabaseError