api

A API do submódulo expõe dois conjuntos de endpoints (prefixo raiz, sem pre-recebimento/ no path — ver src/pre_recebimento/urls.py):

Rascunho (fornecedor):

  • POST /rascunho-ficha-tecnica/ — cria um rascunho de ficha técnica (permanece em RASCUNHO).

  • PATCH /rascunho-ficha-tecnica/<uuid>/ — atualiza o rascunho.

Ficha técnica (lista/detalhe/cadastro/análise):

  • GET /ficha-tecnica/ — listagem paginada com filtros (FichaTecnicaFilter); fornecedores veem apenas as fichas da própria empresa.

  • GET /ficha-tecnica/<uuid>/ — detalhe completo.

  • POST /ficha-tecnica/ — cadastro de ficha (Perecíveis/Não perecíveis ou FLV conforme a categoria) que já envia a ficha para análise (inicia_fluxo).

  • PATCH /ficha-tecnica/<uuid>/ — atualização.

  • Ações detail=False: dashboard, lista-simples, lista-simples-aprovadas, lista-simples-sem-cronograma, lista-simples-sem-layout-embalagem, lista-simples-sem-questoes-conferencia, listagem-relatorio e exportar-excel.

  • Ações detail=True: dados-cronograma, detalhar-com-analise, rascunho-analise-gpcodae (POST/PUT), analise-gpcodae (POST/PUT), correcao-fornecedor (PATCH), atualizacao-fornecedor (PATCH) e gerar-pdf-ficha (GET).

viewsets

class FichaTecnicaModelViewSet(**kwargs)[source]

Bases: ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, GenericViewSet

analise_gpcodae(request, *args, **kwargs)[source]
atualizacao_fornecedor(request, *args, **kwargs)[source]
correcao_fornecedor(request, *args, **kwargs)[source]
create(request, *args, **kwargs)[source]
dados_cronograma(request, **kwargs)[source]
dashboard(request)[source]
detalhar_com_analise(request, **kwargs)[source]
exportar_excel(request)[source]
filter_backends = (<class 'django_filters.rest_framework.backends.DjangoFilterBackend'>,)
filterset_class

alias of FichaTecnicaFilter

gerar_pdf_ficha(request, uuid=None)[source]
get_queryset()[source]

Get the list of items for this view. This must be an iterable, and may be a queryset. Defaults to using self.queryset.

This method should always be used rather than accessing self.queryset directly, as self.queryset gets evaluated only once, and those results are cached for all subsequent requests.

You may want to override this if you need to provide different querysets depending on the incoming request.

(Eg. return a list of items that is specific to the user)

get_serializer_class()[source]

Return the class to use for the serializer. Defaults to using self.serializer_class.

You may want to override this if you need to provide different serializations depending on the incoming request.

(Eg. admins get full serialization, others get basic serialization)

lista_simples(request, **kwargs)[source]
lista_simples_aprovadas(request, **kwargs)[source]
lista_simples_sem_cronograma(request, **kwargs)[source]
lista_simples_sem_layout_embalagem(request, **kwargs)[source]
lista_simples_sem_questoes_conferencia(request, **kwargs)[source]
listagem_relatorio(request)[source]
lookup_field = 'uuid'
pagination_class

alias of DefaultPagination

permission_classes = (<class 'src.dados_comuns.permissions.PermissaoParaVisualizarFichaTecnica'>,)
queryset = <QuerySet de FichaTecnicaDoProduto>
rascunho_analise_gpcodae(request, *args, **kwargs)[source]
serializer_class

alias of FichaTecnicaRascunhoSerializer

update(request, *args, **kwargs)[source]
class FichaTecnicaRascunhoViewSet(**kwargs)[source]

Bases: CreateModelMixin, UpdateModelMixin, GenericViewSet

lookup_field = 'uuid'
permission_classes = (<class 'src.dados_comuns.permissions.UsuarioEhFornecedor'>,)
queryset = <QuerySet de FichaTecnicaDoProduto>
serializer_class

alias of FichaTecnicaRascunhoSerializer

FichaTecnicaRascunhoViewSet

Criação e atualização de rascunhos (apenas UsuarioEhFornecedor). O rascunho não inicia o fluxo (permanece em RASCUNHO).

FichaTecnicaModelViewSet

CRUD completo (list/retrieve/create/update) com:

  • Queryset dinâmico: usuários fornecedores veem apenas as fichas da própria empresa (empresa=vinculo_atual.instituicao).

  • Serializador dinâmico: listFichaTecnicaListagemSerializer; retrieveFichaTecnicaDetalharSerializer; create/updateFichaTecnicaFLVCreateSerializer quando a ficha é da categoria FLV, senão FichaTecnicaCreateSerializer; listagem_relatorioRelatorioFichaTecnicaSerializer.

  • Verificação de autenticidade no create/update e nas ações de correção/atualização do fornecedor (verificar_autenticidade_usuario).

Ações:

  • dashboard: painel de fichas por status com os filtros FichaTecnicaFilter, via ServiceDashboardFichaTecnica.

  • lista_simples: fichas fora do status RASCUNHO (filtradas por empresa quando o usuário é fornecedor).

  • lista_simples_aprovadas: fichas no status APROVADA.

  • lista_simples_sem_cronograma: fichas sem vínculo com cronograma e fora de RASCUNHO (usado para vincular fichas a cronogramas).

  • lista_simples_sem_layout_embalagem: fichas sem layout de embalagem (fora de RASCUNHO).

  • lista_simples_sem_questoes_conferencia: fichas sem questões de conferência cadastradas (fora de RASCUNHO).

  • dados_cronograma: dados da ficha para o cadastro de cronograma.

  • detalhar_com_analise: detalhe + análise mais recente + log mais recente.

  • rascunho_analise_gpcodae (POST/PUT): salva a análise em rascunho (AnaliseFichaTecnicaRascunhoSerializer) — não altera o status da ficha. Retorna 201 na criação e 200 na atualização.

  • analise_gpcodae (POST/PUT): registra a análise final (AnaliseFichaTecnicaCreateSerializer) e altera o status da ficha (aprova ou envia para correção conforme aprovada).

  • correcao_fornecedor (PATCH): fornecedor corrige uma ficha no status ENVIADA_PARA_CORRECAO (CorrecaoFichaTecnicaSerializer), validando apenas os campos dos blocos reprovados; após salvar, a ficha volta para ENVIADA_PARA_ANALISE e é gerada uma nova análise.

  • atualizacao_fornecedor (PATCH): fornecedor atualiza uma ficha APROVADA (FichaTecnicaAtualizacaoSerializer), o que reabre a análise (a ficha volta para ENVIADA_PARA_ANALISE).

  • gerar_pdf_ficha (GET): gera o PDF da ficha técnica (get_pdf_ficha_tecnica).

  • listagem_relatorio (GET): relatório paginado com totalizadores (aprovadas, enviadas para correção, pendentes de aprovação), excluindo fichas da categoria FLV.

  • exportar_excel (GET): dispara a task assíncrona exporta_relatorio_fichas_tecnicas_xlsx com o mesmo queryset do relatório e responde “Solicitação de geração de arquivo recebida com sucesso.”

filters

class FichaTecnicaFilter(data=None, queryset=None, *, request=None, prefix=None)[source]

Bases: FilterSet

base_filters = {'categoria': <django_filters.filters.CharFilter object>, 'data_cadastro': <django_filters.filters.DateFilter object>, 'empresa': <django_filters.filters.UUIDFilter object>, 'nome_empresa': <django_filters.filters.CharFilter object>, 'nome_produto': <django_filters.filters.CharFilter object>, 'numero_ficha': <django_filters.filters.CharFilter object>, 'pregao': <django_filters.filters.CharFilter object>, 'programa': <django_filters.filters.CharFilter object>, 'status': <django_filters.filters.MultipleChoiceFilter object>}
declared_filters = {'categoria': <django_filters.filters.CharFilter object>, 'data_cadastro': <django_filters.filters.DateFilter object>, 'empresa': <django_filters.filters.UUIDFilter object>, 'nome_empresa': <django_filters.filters.CharFilter object>, 'nome_produto': <django_filters.filters.CharFilter object>, 'numero_ficha': <django_filters.filters.CharFilter object>, 'pregao': <django_filters.filters.CharFilter object>, 'programa': <django_filters.filters.CharFilter object>, 'status': <django_filters.filters.MultipleChoiceFilter object>}

FichaTecnicaFilter permite filtrar por numero_ficha, nome_produto, nome_empresa, empresa (uuid), pregao, status (múltiplo, pelos estados do workflow), data_cadastro, categoria e programa.

services

class ServiceDashboardFichaTecnica(original_queryset, filter_class, serializer_class, request)[source]

Bases: BaseServiceDashboard

STATUS_POR_PERFIL = {'ADMINISTRADOR_CODAE_GABINETE': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO'], 'ADMINISTRADOR_GESTAO_PRODUTO': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO'], 'COORDENADOR_CODAE_DILOG_LOGISTICA': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO'], 'COORDENADOR_GESTAO_PRODUTO': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO'], 'DILOG_ABASTECIMENTO': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO'], 'DILOG_CRONOGRAMA': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO'], 'DILOG_DIRETORIA': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO'], 'DILOG_QUALIDADE': ['ENVIADA_PARA_ANALISE', 'APROVADA', 'ENVIADA_PARA_CORRECAO']}

ServiceDashboardFichaTecnica (herda BaseServiceDashboard) monta o painel de fichas técnicas: para cada perfil autorizado, define os status exibidos (ENVIADA_PARA_ANALISE, APROVADA e ENVIADA_PARA_CORRECAO). Perfis contemplados: COORDENADOR_GESTAO_PRODUTO, ADMINISTRADOR_GESTAO_PRODUTO, COORDENADOR_CODAE_DILOG_LOGISTICA, ADMINISTRADOR_CODAE_GABINETE, DILOG_DIRETORIA, DILOG_QUALIDADE, DILOG_ABASTECIMENTO e DILOG_CRONOGRAMA.

validators

class ServiceValidacaoCorrecaoFichaTecnica(ficha_tecnica, attrs)[source]

Bases: object

CAMPOS_FLV = {'detalhes_produto_conferido': {'dependentes': ['mecanismo_controle'], 'obrigatorios': ['organico', 'especie_variedade'], 'opcionais': ['numero_registro']}, 'fabricante_envasador_conferido': {'obrigatorios': ['fabricante'], 'opcionais': ['envasador_distribuidor']}, 'outras_informacoes_conferido': {'obrigatorios': []}, 'responsavel_tecnico_conferido': {'obrigatorios': ['nome_responsavel_tecnico', 'habilitacao', 'numero_registro_orgao', 'arquivo']}}
CAMPOS_NAO_PERECIVEIS = {'armazenamento_conferido': {'obrigatorios': ['embalagem_primaria', 'embalagem_secundaria']}, 'conservacao_conferido': {'obrigatorios': ['condicoes_de_conservacao']}, 'detalhes_produto_conferido': {'dependentes': ['mecanismo_controle', 'ingredientes_alergenicos', 'lactose_detalhe'], 'obrigatorios': ['prazo_validade', 'organico', 'componentes_produto', 'alergenicos', 'gluten', 'lactose'], 'opcionais': ['numero_registro']}, 'embalagem_e_rotulagem_conferido': {'dependentes': ['volume_embalagem_primaria', 'unidade_medida_volume_primaria'], 'obrigatorios': ['embalagens_de_acordo_com_anexo', 'material_embalagem_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', 'sistema_vedacao_embalagem_secundaria', 'produto_eh_liquido', 'rotulo_legivel']}, 'fabricante_envasador_conferido': {'obrigatorios': ['fabricante'], 'opcionais': ['envasador_distribuidor']}, 'informacoes_nutricionais_conferido': {'obrigatorios': ['porcao', 'unidade_medida_porcao', 'valor_unidade_caseira', 'unidade_medida_caseira', 'informacoes_nutricionais']}, 'modo_preparo_conferido': {'obrigatorios': ['modo_de_preparo']}, 'responsavel_tecnico_conferido': {'obrigatorios': ['nome_responsavel_tecnico', 'habilitacao', 'numero_registro_orgao', 'arquivo']}}
CAMPOS_OBRIGATORIOS_COMUNS = {'armazenamento_conferido': {'obrigatorios': ['embalagem_primaria', 'embalagem_secundaria']}, 'detalhes_produto_conferido': {'dependentes': ['mecanismo_controle', 'ingredientes_alergenicos', 'lactose_detalhe'], 'obrigatorios': ['prazo_validade', 'organico', 'componentes_produto', 'alergenicos', 'gluten', 'lactose'], 'opcionais': ['numero_registro']}, 'fabricante_envasador_conferido': {'obrigatorios': ['fabricante'], 'opcionais': ['envasador_distribuidor']}, 'informacoes_nutricionais_conferido': {'obrigatorios': ['porcao', 'unidade_medida_porcao', 'valor_unidade_caseira', 'unidade_medida_caseira', 'informacoes_nutricionais']}, 'modo_preparo_conferido': {'obrigatorios': ['modo_de_preparo']}, 'responsavel_tecnico_conferido': {'obrigatorios': ['nome_responsavel_tecnico', 'habilitacao', 'numero_registro_orgao', 'arquivo']}}
CAMPOS_PERECIVEIS = {'armazenamento_conferido': {'obrigatorios': ['embalagem_primaria', 'embalagem_secundaria']}, 'conservacao_conferido': {'obrigatorios': ['prazo_validade_descongelamento', 'condicoes_de_conservacao']}, 'detalhes_produto_conferido': {'dependentes': ['mecanismo_controle', 'ingredientes_alergenicos', 'lactose_detalhe'], 'obrigatorios': ['prazo_validade', 'organico', 'componentes_produto', 'alergenicos', 'gluten', 'lactose'], 'opcionais': ['numero_registro']}, 'embalagem_e_rotulagem_conferido': {'obrigatorios': ['embalagens_de_acordo_com_anexo', 'material_embalagem_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', 'sistema_vedacao_embalagem_secundaria', 'variacao_percentual', 'rotulo_legivel']}, 'fabricante_envasador_conferido': {'obrigatorios': ['fabricante'], 'opcionais': ['envasador_distribuidor']}, 'informacoes_nutricionais_conferido': {'obrigatorios': ['porcao', 'unidade_medida_porcao', 'valor_unidade_caseira', 'unidade_medida_caseira', 'informacoes_nutricionais']}, 'modo_preparo_conferido': {'obrigatorios': ['modo_de_preparo']}, 'responsavel_tecnico_conferido': {'obrigatorios': ['nome_responsavel_tecnico', 'habilitacao', 'numero_registro_orgao', 'arquivo']}, 'temperatura_e_transporte_conferido': {'obrigatorios': ['temperatura_congelamento', 'temperatura_veiculo', 'condicoes_de_transporte']}}
valida_campos_nao_permitidos_por_collapse()[source]
valida_campos_obrigatorios_por_collapse()[source]
valida_status_enviada_para_correcao()[source]
valida_campos_dependentes_ficha_tecnica(attrs)[source]
valida_campos_flv_ficha_tecnica(attrs)[source]
valida_campos_nao_pereciveis_ficha_tecnica(attrs)[source]
valida_campos_pereciveis_ficha_tecnica(attrs)[source]
valida_ingredientes_alergenicos_ficha_tecnica(attrs)[source]

Funções de validação por categoria:

  • valida_campos_flv_ficha_tecnica: exige organico e especie_variedade.

  • valida_campos_pereciveis_ficha_tecnica: exige organico, prazo_validade_descongelamento, temperatura_congelamento, temperatura_veiculo, condicoes_de_transporte e variacao_percentual.

  • valida_campos_nao_pereciveis_ficha_tecnica: exige organico e produto_eh_liquido.

  • valida_campos_dependentes_ficha_tecnica: regras dependentes (orgânico → mecanismo_controle; alergênico → ingredientes_alergenicos; lactose → lactose_detalhe; líquido → volume e unidade de medida).

  • valida_ingredientes_alergenicos_ficha_tecnica: alergênico exige ingredientes_alergenicos.

ServiceValidacaoCorrecaoFichaTecnica valida a correção do fornecedor:

  • Só permite corrigir fichas no status ENVIADA_PARA_CORRECAO.

  • Exige os campos obrigatórios de cada bloco reprovado (collapse) — os conjuntos CAMPOS_OBRIGATORIOS_COMUNS, CAMPOS_PERECIVEIS, CAMPOS_NAO_PERECIVEIS e CAMPOS_FLV definem, por bloco, os campos obrigatórios, dependentes e opcionais.

  • Rejeita campos não permitidos no bloco sendo corrigido (um atributo só é aceito se pertencer aos campos daquele bloco).

  • Os blocos a corrigir são obtidos da análise mais recente (campos *_conferido = False).

helpers

atualiza_ficha_tecnica(ficha_tecnica, validated_data)[source]
cria_ficha_tecnica(validated_data)[source]
formata_cnpj_ficha_tecnica(cnpj)[source]
formata_telefone_ficha_tecnica(telefone)[source]
gerar_nova_analise_ficha_tecnica(ficha_tecnica, payload=None)[source]
limpar_campos_dependentes_ficha_tecnica(instance, validated_data)[source]
reseta_analise_atualizacao(analise, payload)[source]
retorna_status_ficha_tecnica(status)[source]

Funções auxiliares da criação/atualização:

  • cria_ficha_tecnica: cria a ficha, o fabricante/envasador e as informações nutricionais; converte o arquivo (base64) em ContentFile.

  • atualiza_ficha_tecnica: atualiza os dados da ficha, criando fabricantes/informações nutricionais novos quando necessário (e apagando as informações nutricionais antigas na atualização).

  • limpar_campos_dependentes_ficha_tecnica: ao marcar organico/ alergenicos/lactose/produto_eh_liquido como False, limpa os campos dependentes correspondentes.

  • gerar_nova_analise_ficha_tecnica: cria uma nova análise a partir da anterior, preservando os blocos aprovados e as correções pendentes (usado após correção/atualização do fornecedor).

  • reseta_analise_atualizacao: marca como False os blocos da análise afetados pelos campos alterados na atualização do fornecedor.

  • retorna_status_ficha_tecnica/formata_cnpj_ficha_tecnica/ formata_telefone_ficha_tecnica: utilitários de exibição.

relatorio_fichas_tecnicas_excel

gera_relatorio_fichas_tecnicas_xlsx(fichas_ids)[source]

Gera o arquivo Excel do Relatório de Fichas Técnicas.

Parameters:

fichas_ids – Lista de ids de FichaTecnicaDoProduto.

Returns:

Conteúdo do arquivo .xlsx.

Return type:

bytes

Geração do arquivo Excel do Relatório de Fichas Técnicas (gera_relatorio_fichas_tecnicas_xlsx), usado pela task assíncrona exporta_relatorio_fichas_tecnicas_xlsx. O relatório contém 18 colunas (nome do produto, empresa, categoria, programa, pregão, fabricante, validade, orgânico, mecanismo de controle, alergênicos, glúten, lactose, líquido, pesos e unidades de medida, status), com sanitização contra fórmulas (injeção de =/+/-/@), formatação numérica dos pesos e largura dinâmica das colunas.

serializers

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

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id', 'ficha_tecnica')
model

alias of AnaliseFichaTecnica

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

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'fabricante', 'cnpj', 'cep', 'endereco', 'numero', 'complemento', 'bairro', 'cidade', 'estado', 'email', 'telefone')
model

alias of FabricanteFichaTecnica

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

Bases: FichaTecnicaDetalharSerializer

class Meta[source]

Bases: Meta

fields = ('uuid', 'numero', 'produto', 'pregao_chamada_publica', 'marca', 'categoria', 'tipo_entrega', 'programa', 'programa_display', 'status', 'criado_em', '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', 'informacoes_nutricionais', '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', 'logs', 'analise', 'log_mais_recente')
get_analise(obj)[source]
get_log_mais_recente(obj)[source]
class FichaTecnicaCronogramaSerializer(*args, **kwargs)[source]

Bases: FichaTecnicaSimplesSerializer

class Meta[source]

Bases: Meta

fields = ('uuid', 'numero', 'produto', 'uuid_empresa', 'pregao_chamada_publica', 'programa', 'ponto_a_ponto', 'marca', 'volume_embalagem_primaria', 'unidade_medida_volume_primaria', 'peso_liquido_embalagem_primaria', 'unidade_medida_primaria', 'peso_liquido_embalagem_secundaria', 'unidade_medida_secundaria')
class FichaTecnicaDetalharSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'numero', 'produto', 'pregao_chamada_publica', 'marca', 'categoria', 'tipo_entrega', 'programa', 'programa_display', 'status', 'criado_em', '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', 'informacoes_nutricionais', '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', 'logs')
model

alias of FichaTecnicaDoProduto

get_criado_em(obj)[source]
class FichaTecnicaListagemSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'numero', 'nome_produto', 'pregao_chamada_publica', 'criado_em', 'status', 'programa', 'ponto_a_ponto')
model

alias of FichaTecnicaDoProduto

get_criado_em(obj)[source]
get_nome_produto(obj)[source]
class FichaTecnicaSimplesSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'numero', 'produto', 'uuid_empresa', 'pregao_chamada_publica', 'programa', 'ponto_a_ponto')
model

alias of FichaTecnicaDoProduto

get_uuid_empresa(obj)[source]
class InformacoesNutricionaisFichaTecnicaSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'informacao_nutricional', 'quantidade_por_100g', 'quantidade_porcao', 'valor_diario')
model

alias of InformacoesNutricionaisFichaTecnica

read_only_fields = ('uuid',)
class PainelFichaTecnicaSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'numero_ficha', 'nome_produto', 'nome_empresa', 'status', 'log_mais_recente', 'programa_leve_leite', 'categoria', 'tipo_entrega')
model

alias of FichaTecnicaDoProduto

get_log_mais_recente(obj)[source]
get_programa_leve_leite(obj)[source]
class RelatorioFichaTecnicaSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('uuid', 'numero', 'produto', 'empresa', 'categoria', 'programa', 'pregao_chamada_publica', 'status')
model

alias of FichaTecnicaDoProduto

Serializadores de saída:

  • FichaTecnicaSimplesSerializer: lista enxuta (uuid, número, produto, uuid da empresa, pregão, programa, ponto_a_ponto).

  • FichaTecnicaCronogramaSerializer: dados da ficha usados no cadastro de cronograma (marca e unidades de medida de volume/pesos).

  • FichaTecnicaListagemSerializer: listagem da tela (nome do produto, data de cadastro formatada, status com get_status_display).

  • InformacoesNutricionaisFichaTecnicaSerializer: item nutricional com a InformacaoNutricional aninhada.

  • FabricanteFichaTecnicaSerializer: fabricante/envasador com o Fabricante aninhado.

  • FichaTecnicaDetalharSerializer: detalhe completo da ficha, com produto, marca, empresa, fabricante/envasador, unidades de medida, informações nutricionais e logs.

  • AnaliseFichaTecnicaSerializer: análise com o campo computado aprovada.

  • FichaTecnicaComAnaliseDetalharSerializer: detalhe + análise mais recente + log mais recente formatado.

  • PainelFichaTecnicaSerializer: linha do dashboard (número, produto, empresa, status, log mais recente, programa_leve_leite).

  • RelatorioFichaTecnicaSerializer: linha do relatório (produto, empresa, categoria/programa/status com display).

serializer_create

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

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id', 'ficha_tecnica')
model

alias of AnaliseFichaTecnica

create(validated_data)[source]

Cria a análise final e avalia o estado da ficha: aprova (gpcodae_aprova) ou envia para correção (gpcodae_envia_para_correcao) conforme a análise ser aprovada.

update(instance, validated_data)[source]
validate(attrs)[source]
class AnaliseFichaTecnicaRascunhoSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id',)
model

alias of AnaliseFichaTecnica

create(validated_data)[source]

Cria a análise em rascunho (não altera o status da ficha).

update(instance, validated_data)[source]
class CorrecaoFichaTecnicaSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

extra_kwargs = {<ManyToOneRel: pre_recebimento.analisefichatecnica>: {'required': False}, <ManyToOneRel: pre_recebimento.cronograma>: {'required': False}, <ManyToOneRel: pre_recebimento.informacoesnutricionaisfichatecnica>: {'required': False}, <OneToOneRel: pre_recebimento.layoutdeembalagem>: {'required': False}, <OneToOneRel: recebimento.questoesporproduto>: {'required': False}, <django.db.models.fields.AutoField: id>: {'required': False}, <django.db.models.fields.BooleanField: alergenicos>: {'required': False}, <django.db.models.fields.BooleanField: embalagens_de_acordo_com_anexo>: {'required': False}, <django.db.models.fields.BooleanField: gluten>: {'required': False}, <django.db.models.fields.BooleanField: lactose>: {'required': False}, <django.db.models.fields.BooleanField: organico>: {'required': False}, <django.db.models.fields.BooleanField: produto_eh_liquido>: {'required': False}, <django.db.models.fields.BooleanField: rotulo_legivel>: {'required': False}, <django.db.models.fields.CharField: categoria>: {'required': False}, <django.db.models.fields.CharField: especie_variedade>: {'required': False}, <django.db.models.fields.CharField: habilitacao>: {'required': False}, <django.db.models.fields.CharField: ingredientes_alergenicos>: {'required': False}, <django.db.models.fields.CharField: lactose_detalhe>: {'required': False}, <django.db.models.fields.CharField: mecanismo_controle>: {'required': False}, <django.db.models.fields.CharField: nome_responsavel_tecnico>: {'required': False}, <django.db.models.fields.CharField: numero>: {'required': False}, <django.db.models.fields.CharField: numero_registro>: {'required': False}, <django.db.models.fields.CharField: numero_registro_orgao>: {'required': False}, <django.db.models.fields.CharField: porcao>: {'required': False}, <django.db.models.fields.CharField: prazo_validade>: {'required': False}, <django.db.models.fields.CharField: prazo_validade_descongelamento>: {'required': False}, <django.db.models.fields.CharField: pregao_chamada_publica>: {'required': False}, <django.db.models.fields.CharField: programa>: {'required': False}, <django.db.models.fields.CharField: tipo_entrega>: {'required': False}, <django.db.models.fields.CharField: unidade_medida_caseira>: {'required': False}, <django.db.models.fields.CharField: valor_unidade_caseira>: {'required': False}, <django.db.models.fields.DateTimeField: alterado_em>: {'required': False}, <django.db.models.fields.DateTimeField: criado_em>: {'required': False}, <django.db.models.fields.FloatField: peso_embalagem_primaria_vazia>: {'required': False}, <django.db.models.fields.FloatField: peso_embalagem_secundaria_vazia>: {'required': False}, <django.db.models.fields.FloatField: peso_liquido_embalagem_primaria>: {'required': False}, <django.db.models.fields.FloatField: peso_liquido_embalagem_secundaria>: {'required': False}, <django.db.models.fields.FloatField: temperatura_congelamento>: {'required': False}, <django.db.models.fields.FloatField: temperatura_veiculo>: {'required': False}, <django.db.models.fields.FloatField: variacao_percentual>: {'required': False}, <django.db.models.fields.FloatField: volume_embalagem_primaria>: {'required': False}, <django.db.models.fields.TextField: componentes_produto>: {'required': False}, <django.db.models.fields.TextField: condicoes_de_conservacao>: {'required': False}, <django.db.models.fields.TextField: condicoes_de_transporte>: {'required': False}, <django.db.models.fields.TextField: embalagem_primaria>: {'required': False}, <django.db.models.fields.TextField: embalagem_secundaria>: {'required': False}, <django.db.models.fields.TextField: informacoes_adicionais>: {'required': False}, <django.db.models.fields.TextField: material_embalagem_primaria>: {'required': False}, <django.db.models.fields.TextField: modo_de_preparo>: {'required': False}, <django.db.models.fields.TextField: sistema_vedacao_embalagem_secundaria>: {'required': False}, <django.db.models.fields.UUIDField: uuid>: {'required': False}, <django.db.models.fields.files.FileField: arquivo>: {'required': False}, <django.db.models.fields.related.ForeignKey: empresa>: {'required': False}, <django.db.models.fields.related.ForeignKey: envasador_distribuidor>: {'required': False}, <django.db.models.fields.related.ForeignKey: fabricante>: {'required': False}, <django.db.models.fields.related.ForeignKey: marca>: {'required': False}, <django.db.models.fields.related.ForeignKey: produto>: {'required': False}, <django.db.models.fields.related.ForeignKey: unidade_medida_porcao>: {'required': False}, <django.db.models.fields.related.ForeignKey: unidade_medida_primaria>: {'required': False}, <django.db.models.fields.related.ForeignKey: unidade_medida_primaria_vazia>: {'required': False}, <django.db.models.fields.related.ForeignKey: unidade_medida_secundaria>: {'required': False}, <django.db.models.fields.related.ForeignKey: unidade_medida_secundaria_vazia>: {'required': False}, <django.db.models.fields.related.ForeignKey: unidade_medida_volume_primaria>: {'required': False}, <django_xworkflows.models.StateField: status>: {'required': False}}
fields = '__all__'
model

alias of FichaTecnicaDoProduto

update(instance, validated_data)[source]
validate(attrs)[source]
class FabricanteFichaTecnicaCreateSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('fabricante', 'cnpj', 'cep', 'endereco', 'numero', 'complemento', 'bairro', 'cidade', 'estado', 'email', 'telefone')
model

alias of FabricanteFichaTecnica

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

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id', 'produto')
model

alias of FichaTecnicaDoProduto

update(instance, validated_data)[source]
validate(attrs)[source]
validate_arquivo(value)[source]
class FichaTecnicaCreateSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id',)
model

alias of FichaTecnicaDoProduto

create(validated_data)[source]

Cria a ficha técnica, registra o log de cadastro e inicia o fluxo (a ficha passa para ENVIADA_PARA_ANALISE).

update(instance, validated_data)[source]
validate(attrs)[source]
validate_arquivo(value)[source]
validate_embalagens_de_acordo_com_anexo(value)[source]
validate_rotulo_legivel(value)[source]
class FichaTecnicaFLVCreateSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id',)
model

alias of FichaTecnicaDoProduto

create(validated_data)[source]

Cria a ficha técnica FLV, registra o log de cadastro e inicia o fluxo (a ficha passa para ENVIADA_PARA_ANALISE).

update(instance, validated_data)[source]
validate(attrs)[source]
validate_arquivo(value)[source]
class FichaTecnicaRascunhoSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id',)
model

alias of FichaTecnicaDoProduto

create(validated_data)[source]

Cria a ficha técnica como rascunho (via helper) e registra o log de cadastro. Não inicia o fluxo: a ficha permanece em RASCUNHO.

update(instance, validated_data)[source]
validate_arquivo(value)[source]
class InformacoesNutricionaisFichaTecnicaCreateSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('informacao_nutricional', 'quantidade_por_100g', 'quantidade_porcao', 'valor_diario')
model

alias of InformacoesNutricionaisFichaTecnica

Serializadores de entrada:

  • InformacoesNutricionaisFichaTecnicaCreateSerializer: item nutricional do payload (informacao_nutricional por uuid).

  • FabricanteFichaTecnicaCreateSerializer: fabricante/envasador do payload; o campo fabricante é opcional quando o serializador é usado em correções (fabricante_opcional=True).

  • FichaTecnicaRascunhoSerializer: cadastro de rascunho (todos os campos opcionais); ao criar, registra o log de cadastro mas não inicia o fluxo.

  • FichaTecnicaCreateSerializer: cadastro definitivo (campos obrigatórios conforme a tela), valida os campos por categoria e dependentes, exige os checkboxes do Anexo I (embalagens_de_acordo_com_anexo e rotulo_legivel = True), valida que o arquivo é PDF e, ao criar/atualizar, inicia o fluxo (ficha vai para ENVIADA_PARA_ANALISE).

  • FichaTecnicaFLVCreateSerializer: cadastro de fichas FLV (exige organico, especie_variedade, responsável técnico e arquivo).

  • AnaliseFichaTecnicaRascunhoSerializer: análise em rascunho da GPCODAE (todos os blocos opcionais) — não altera o status da ficha.

  • AnaliseFichaTecnicaCreateSerializer: análise final da GPCODAE. Para fichas FLV ponto a ponto, remove os blocos inexistentes; valida que *_conferido = False exige *_correcoes preenchido e vice-versa; ao salvar, aprova ou envia para correção a ficha conforme aprovada.

  • CorrecaoFichaTecnicaSerializer: correção do fornecedor (ServiceValidacaoCorrecaoFichaTecnica + validação de campos dependentes); ao atualizar, limpa os campos dependentes, chama fornecedor_corrige e gera nova análise.

  • FichaTecnicaAtualizacaoSerializer: atualização de ficha aprovada pelo fornecedor; gera nova análise (resetando os blocos afetados), chama fornecedor_atualiza e reabre o fluxo de análise.