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 emRASCUNHO).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 acategoria) 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-relatorioeexportar-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) egerar-pdf-ficha(GET).
viewsets
- class FichaTecnicaModelViewSet(**kwargs)[source]
Bases:
ListModelMixin,RetrieveModelMixin,CreateModelMixin,UpdateModelMixin,GenericViewSet- filter_backends = (<class 'django_filters.rest_framework.backends.DjangoFilterBackend'>,)
- filterset_class
alias of
FichaTecnicaFilter
- 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)
- lookup_field = 'uuid'
- pagination_class
alias of
DefaultPagination
- permission_classes = (<class 'src.dados_comuns.permissions.PermissaoParaVisualizarFichaTecnica'>,)
- queryset = <QuerySet de FichaTecnicaDoProduto>
- serializer_class
alias of
FichaTecnicaRascunhoSerializer
- 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
FichaTecnicaRascunhoViewSetCriação e atualização de rascunhos (apenas
UsuarioEhFornecedor). O rascunho não inicia o fluxo (permanece emRASCUNHO).FichaTecnicaModelViewSetCRUD 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:
list→FichaTecnicaListagemSerializer;retrieve→FichaTecnicaDetalharSerializer;create/update→FichaTecnicaFLVCreateSerializerquando a ficha é da categoriaFLV, senãoFichaTecnicaCreateSerializer;listagem_relatorio→RelatorioFichaTecnicaSerializer.Verificação de autenticidade no
create/updatee nas ações de correção/atualização do fornecedor (verificar_autenticidade_usuario).
Ações:
dashboard: painel de fichas por status com os filtrosFichaTecnicaFilter, viaServiceDashboardFichaTecnica.lista_simples: fichas fora do statusRASCUNHO(filtradas por empresa quando o usuário é fornecedor).lista_simples_aprovadas: fichas no statusAPROVADA.lista_simples_sem_cronograma: fichas sem vínculo com cronograma e fora deRASCUNHO(usado para vincular fichas a cronogramas).lista_simples_sem_layout_embalagem: fichas sem layout de embalagem (fora deRASCUNHO).lista_simples_sem_questoes_conferencia: fichas sem questões de conferência cadastradas (fora deRASCUNHO).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. Retorna201na criação e200na atualização.analise_gpcodae(POST/PUT): registra a análise final (AnaliseFichaTecnicaCreateSerializer) e altera o status da ficha (aprova ou envia para correção conformeaprovada).correcao_fornecedor(PATCH): fornecedor corrige uma ficha no statusENVIADA_PARA_CORRECAO(CorrecaoFichaTecnicaSerializer), validando apenas os campos dos blocos reprovados; após salvar, a ficha volta paraENVIADA_PARA_ANALISEe é gerada uma nova análise.atualizacao_fornecedor(PATCH): fornecedor atualiza uma fichaAPROVADA(FichaTecnicaAtualizacaoSerializer), o que reabre a análise (a ficha volta paraENVIADA_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 categoriaFLV.exportar_excel(GET): dispara a task assíncronaexporta_relatorio_fichas_tecnicas_xlsxcom 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']}}
Funções de validação por categoria:
valida_campos_flv_ficha_tecnica: exigeorganicoeespecie_variedade.valida_campos_pereciveis_ficha_tecnica: exigeorganico,prazo_validade_descongelamento,temperatura_congelamento,temperatura_veiculo,condicoes_de_transporteevariacao_percentual.valida_campos_nao_pereciveis_ficha_tecnica: exigeorganicoeproduto_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 exigeingredientes_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_PERECIVEISeCAMPOS_FLVdefinem, 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
Funções auxiliares da criação/atualização:
cria_ficha_tecnica: cria a ficha, o fabricante/envasador e as informações nutricionais; converte oarquivo(base64) emContentFile.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 marcarorganico/alergenicos/lactose/produto_eh_liquidocomoFalse, 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 comoFalseos 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')
- 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
- 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
- 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
- class InformacoesNutricionaisFichaTecnicaSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer
- 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
- 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 comget_status_display).InformacoesNutricionaisFichaTecnicaSerializer: item nutricional com aInformacaoNutricionalaninhada.FabricanteFichaTecnicaSerializer: fabricante/envasador com oFabricanteaninhado.FichaTecnicaDetalharSerializer: detalhe completo da ficha, com produto, marca, empresa, fabricante/envasador, unidades de medida, informações nutricionais elogs.AnaliseFichaTecnicaSerializer: análise com o campo computadoaprovada.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
- class AnaliseFichaTecnicaRascunhoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id',)
- model
alias of
AnaliseFichaTecnica
- 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
- 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
- class FichaTecnicaCreateSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id',)
- model
alias of
FichaTecnicaDoProduto
- class FichaTecnicaFLVCreateSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id',)
- model
alias of
FichaTecnicaDoProduto
- class FichaTecnicaRascunhoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id',)
- model
alias of
FichaTecnicaDoProduto
- 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_nutricionalpor uuid).FabricanteFichaTecnicaCreateSerializer: fabricante/envasador do payload; o campofabricanteé 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_anexoerotulo_legivel=True), valida que oarquivoé PDF e, ao criar/atualizar, inicia o fluxo (ficha vai paraENVIADA_PARA_ANALISE).FichaTecnicaFLVCreateSerializer: cadastro de fichas FLV (exigeorganico,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 = Falseexige*_correcoespreenchido e vice-versa; ao salvar, aprova ou envia para correção a ficha conformeaprovada.CorrecaoFichaTecnicaSerializer: correção do fornecedor (ServiceValidacaoCorrecaoFichaTecnica+ validação de campos dependentes); ao atualizar, limpa os campos dependentes, chamafornecedor_corrigee gera nova análise.FichaTecnicaAtualizacaoSerializer: atualização de ficha aprovada pelo fornecedor; gera nova análise (resetando os blocos afetados), chamafornecedor_atualizae reabre o fluxo de análise.