api
A API do submódulo expõe o endpoint /documentos-de-recebimento/
(basename documentos-de-recebimento), com CRUD completo e ações de
análise/correção/atualização/relatório:
GET /documentos-de-recebimento/— listagem paginada com filtros (DocumentoDeRecebimentoFilter); fornecedores veem apenas os documentos dos próprios cronogramas.POST /documentos-de-recebimento/— criação pelo fornecedor (UsuarioEhFornecedor); o documento vai paraENVIADO_PARA_ANALISE.GET /documentos-de-recebimento/<uuid>/— detalhe (visão do fornecedor ou da CODAE, conforme o perfil).PATCH/DELETE /documentos-de-recebimento/<uuid>/— atualização e exclusão (exclusão apenas por fornecedor).Ações
detail=False:dashboard,listagem-relatorioeexportar-excel.Ações
detail=True:analise-documentos-rascunho,analise-documentos,corrigir-documentos,atualizar-documentosedownload-laudo-assinado.
viewsets
- class DocumentoDeRecebimentoModelViewSet(**kwargs)[source]
Bases:
ViewSetActionPermissionMixin,ModelViewSet- filter_backends = (<class 'django_filters.rest_framework.backends.DjangoFilterBackend'>,)
- filterset_class
alias of
DocumentoDeRecebimentoFilter
- 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_action_classes = {'create': [<class 'src.dados_comuns.permissions.UsuarioEhFornecedor'>], 'delete': [<class 'src.dados_comuns.permissions.UsuarioEhFornecedor'>]}
- permission_classes = (<class 'src.dados_comuns.permissions.PermissaoParaVisualizarDocumentosDeRecebimento'>,)
- serializer_class
alias of
DocumentoDeRecebimentoSerializer
DocumentoDeRecebimentoModelViewSet (ModelViewSet com
ViewSetActionPermissionMixin):
Permissões: leitura/visualização com
PermissaoParaVisualizarDocumentosDeRecebimento;createedeleterestritos aUsuarioEhFornecedor.Queryset dinâmico: usuários fornecedores veem apenas documentos de cronogramas da própria empresa (
cronograma__empresa = vinculo_atual.instituicao).Serializador dinâmico:
list→DocumentoDeRecebimentoSerializer;retrieve→DocRecebimentoDetalharSerializer(fornecedor) ouDocRecebimentoDetalharCodaeSerializer(CODAE); demais ações →DocumentoDeRecebimentoCreateSerializer.
Ações:
dashboard(GET): painel por status viaServiceDashboardDocumentosDeRecebimento.codae_analisa_documentos_rascunho(PATCHanalise-documentos-rascunho,UsuarioEhDilogQualidade): salva a análise em rascunho (dados do laudo/laboratório/datas) sem alterar o status.codae_analisa_documentos(PATCHanalise-documentos,UsuarioEhDilogQualidade): análise final — se houvercorrecao_solicitadao documento vai paraENVIADO_PARA_CORRECAO(qualidade_solicita_correcao), senão é aprovado (qualidade_aprova_analise).fornecedor_realiza_correcao(PATCHcorrigir-documentos,UsuarioEhFornecedor): recria os tipos de documento (exigindo ao menos umLAUDO) e chamafornecedor_realiza_correcao(volta paraENVIADO_PARA_ANALISE).fornecedor_realiza_atualizacao(PATCHatualizar-documentos,UsuarioEhFornecedor): atualiza os tipos de documento de um documentoAPROVADO(preservando oLAUDO) e chamafornecedor_atualiza(volta paraENVIADO_PARA_ANALISE).download_laudo_assinado(GETdownload-laudo-assinado): retorna o PDF do laudo assinado; retorna401se o documento não estiverAPROVADO.lista_relatorio(GETlistagem-relatorio,PermissaoParaRelatorioDocumentosDeRecebimento): relatório por cronograma com os documentos (filtrosCronogramaRelatorioDocumentosFilterestatus_documento) e totalizadores (recebidos, pendentes de aprovação, enviados para correção, aprovados).exportar_excel(GETexportar-excel,PermissaoParaRelatorioDocumentosDeRecebimento): gera e baixa orelatorio_documentos_recebimento.xlsxcom o mesmo queryset do relatório.
filters
- class CronogramaRelatorioDocumentosFilter(data=None, queryset=None, *, request=None, prefix=None)[source]
Bases:
FilterSet- base_filters = {'empresa': <django_filters.filters.ModelMultipleChoiceFilter object>, 'nome_produto': <django_filters.filters.CharFilter object>, 'numero_cronograma': <django_filters.filters.CharFilter object>}
- declared_filters = {'empresa': <django_filters.filters.ModelMultipleChoiceFilter object>, 'nome_produto': <django_filters.filters.CharFilter object>, 'numero_cronograma': <django_filters.filters.CharFilter object>}
- class DocumentoDeRecebimentoFilter(data=None, queryset=None, *, request=None, prefix=None)[source]
Bases:
FilterSet- base_filters = {'data_cadastro': <django_filters.filters.DateFilter object>, 'nome_fornecedor': <django_filters.filters.CharFilter object>, 'nome_produto': <django_filters.filters.CharFilter object>, 'numero_cronograma': <django_filters.filters.CharFilter object>, 'status': <django_filters.filters.MultipleChoiceFilter object>}
- declared_filters = {'data_cadastro': <django_filters.filters.DateFilter object>, 'nome_fornecedor': <django_filters.filters.CharFilter object>, 'nome_produto': <django_filters.filters.CharFilter object>, 'numero_cronograma': <django_filters.filters.CharFilter object>, 'status': <django_filters.filters.MultipleChoiceFilter object>}
DocumentoDeRecebimentoFilter filtra por numero_cronograma,
nome_produto, nome_fornecedor (razão social da empresa),
status (múltiplo, pelos estados do workflow) e data_cadastro.
CronogramaRelatorioDocumentosFilter (usado no relatório) filtra os
cronogramas por empresa (uuid), nome_produto e
numero_cronograma.
services
- class ServiceDashboardDocumentosDeRecebimento(original_queryset, filter_class, serializer_class, request)[source]
Bases:
BaseServiceDashboard- STATUS_POR_PERFIL = {'ADMINISTRADOR_CODAE_GABINETE': ['ENVIADO_PARA_ANALISE', 'APROVADO', 'ENVIADO_PARA_CORRECAO'], 'COORDENADOR_CODAE_DILOG_LOGISTICA': ['ENVIADO_PARA_ANALISE', 'APROVADO', 'ENVIADO_PARA_CORRECAO'], 'DILOG_CRONOGRAMA': ['ENVIADO_PARA_ANALISE', 'APROVADO', 'ENVIADO_PARA_CORRECAO'], 'DILOG_DIRETORIA': ['ENVIADO_PARA_ANALISE', 'APROVADO', 'ENVIADO_PARA_CORRECAO'], 'DILOG_QUALIDADE': ['ENVIADO_PARA_ANALISE', 'APROVADO', 'ENVIADO_PARA_CORRECAO']}
ServiceDashboardDocumentosDeRecebimento (herda BaseServiceDashboard)
monta o painel de documentos de recebimento: para cada perfil autorizado
(DILOG_QUALIDADE, COORDENADOR_CODAE_DILOG_LOGISTICA,
DILOG_CRONOGRAMA, ADMINISTRADOR_CODAE_GABINETE e
DILOG_DIRETORIA), define os status exibidos (ENVIADO_PARA_ANALISE,
APROVADO e ENVIADO_PARA_CORRECAO).
helpers
cria_tipos_de_documentos: cria osTipoDeDocumentoDeRecebimentoe seusArquivoDoTipoDeDocumentoa partir do payload (arquivos_do_tipo_de_documentoem base64, convertidos paraContentFile).cria_datas_e_prazos_doc_recebimento: cria asDataDeFabricaoEPrazode um documento.
relatorio_documentos_recebimento_excel
- gera_relatorio_documentos_recebimento_xlsx(queryset, totalizadores)[source]
Gera o arquivo Excel do Relatório Documentos de Recebimento.
- Parameters:
queryset – QuerySet de Cronograma com documentos_de_recebimento pré-carregados (select_related + prefetch_related).
totalizadores – Dict com os totalizadores dos cards.
- Returns:
Conteúdo do arquivo .xlsx.
- Return type:
bytes
Geração do Excel do Relatório de Documentos de Recebimento
(gera_relatorio_documentos_recebimento_xlsx). O relatório tem 20
colunas (cronograma, produto, empresa, pregão, processo SEI, laudo,
status, laboratório, datas de fabricação/validade, lotes, datas,
unidade, quantidades e saldos do laudo, observações e solicitação de
correção), com sanitização contra injeção de fórmulas e formatação
numérica das quantidades/saldos.
serializers
- class ArquivoDoTipoDeDocumentoLookupSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id', 'uuid', 'tipo_de_documento')
- model
alias of
ArquivoDoTipoDeDocumento
- class DataDeFabricacaoEPrazoLookupSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id', 'documento_recebimento')
- model
alias of
DataDeFabricaoEPrazo
- class DocRecebimentoDetalharCodaeSerializer(*args, **kwargs)[source]
Bases:
DocRecebimentoDetalharSerializer- class Meta[source]
Bases:
Meta- fields = ('uuid', 'numero_cronograma', 'pregao_chamada_publica', 'nome_produto', 'numero_laudo', 'status', 'criado_em', 'tipos_de_documentos', 'correcao_solicitada', 'logs', 'programa_leve_leite', 'fornecedor', 'numero_sei', 'laboratorio', 'quantidade_laudo', 'unidade_medida', 'saldo_laudo', 'numero_lote_laudo', 'data_final_lote', 'datas_fabricacao_e_prazos', 'correcao_solicitada')
- class DocRecebimentoDetalharSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('uuid', 'numero_cronograma', 'pregao_chamada_publica', 'nome_produto', 'numero_laudo', 'status', 'criado_em', 'tipos_de_documentos', 'correcao_solicitada', 'logs', 'programa_leve_leite')
- model
alias of
DocumentoDeRecebimento
- class DocRecebimentoFichaDeRecebimentoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('uuid', 'numero_laudo', 'numero_lote_laudo', 'datas_fabricacao', 'datas_validade', 'saldo_laudo', 'quantidade_recebida')
- model
alias of
DocumentoDeRecebimento
- class DocumentoDeRecebimentoDetalheRelatorioSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('uuid', 'numero_laudo', 'nome_laboratorio', 'numero_lote_laudo', 'data_final_lote', 'unidade_medida', 'quantidade_laudo', 'saldo_inicial_laudo', 'saldo_atual', 'datas_fabricacao_e_prazos', 'status_documento')
- model
alias of
DocumentoDeRecebimento
- class DocumentoDeRecebimentoParaAjusteSaldoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('uuid', 'numero_laudo', 'unidade_medida', 'quantidade_laudo', 'saldo_atual')
- model
alias of
DocumentoDeRecebimento
- class DocumentoDeRecebimentoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('uuid', 'numero_cronograma', 'numero_laudo', 'pregao_chamada_publica', 'nome_produto', 'programa_leve_leite', 'status', 'criado_em')
- model
alias of
DocumentoDeRecebimento
- class PainelDocumentoDeRecebimentoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('uuid', 'numero_cronograma', 'nome_produto', 'nome_empresa', 'status', 'log_mais_recente', 'programa_leve_leite')
- model
alias of
DocumentoDeRecebimento
- class TipoDocumentoDeRecebimentoLookupSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id', 'documento_recebimento')
- model
alias of
TipoDeDocumentoDeRecebimento
Serializadores de saída:
calcular_saldo_laudo: função que calcula o saldo do laudo (quantidade_laudo− total recebido em fichas assinadas − ajustes de saldo).DocRecebimentoFichaDeRecebimentoSerializer: dados do documento na ficha de recebimento (datas de fabricação/validade, quantidade recebida e saldo do laudo).DocumentoDeRecebimentoSerializer: linha da listagem (cronograma, pregão, produto,programa_leve_leite, status e data de cadastro).PainelDocumentoDeRecebimentoSerializer: linha do dashboard (produto, empresa, status, log mais recente).ArquivoDoTipoDeDocumentoLookupSerializer/TipoDocumentoDeRecebimentoLookupSerializer: arquivos e tipos com seus arquivos aninhados.DocRecebimentoDetalharSerializer: detalhe para o fornecedor (tipos de documento, logs, correção solicitada).DocRecebimentoDetalharCodaeSerializer: detalhe para a CODAE (com laboratório, unidade de medida, datas de fabricação/prazos, número SEI, fornecedor e saldo do laudo).DocumentoDeRecebimentoDetalheRelatorioSerializer: linha do relatório (laboratório, unidade, quantidades, saldos, datas e status).CronogramaRelatorioDocumentosSerializer: cronograma do relatório com os documentos aninhados.DocumentoDeRecebimentoParaAjusteSaldoSerializer: dados para o ajuste de saldo do laudo (unidade, quantidade e saldo atual).
serializer_create
- class DataDeFabricaoEPrazoAnalisarRascunhoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('data_fabricacao', 'data_validade', 'prazo_maximo_recebimento', 'justificativa')
- model
alias of
DataDeFabricaoEPrazo
- class DataDeFabricaoEPrazoAnalisarSerializer(*args, **kwargs)[source]
- class DocumentoDeRecebimentoAnalisarRascunhoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('laboratorio', 'quantidade_laudo', 'unidade_medida', 'numero_lote_laudo', 'data_final_lote', 'datas_fabricacao_e_prazos')
- model
alias of
DocumentoDeRecebimento
- class DocumentoDeRecebimentoAnalisarSerializer(*args, **kwargs)[source]
Bases:
CamposObrigatoriosMixin,DocumentoDeRecebimentoAnalisarRascunhoSerializer
- class DocumentoDeRecebimentoAtualizacaoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('tipos_de_documentos',)
- model
alias of
DocumentoDeRecebimento
- class DocumentoDeRecebimentoCorrecaoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('tipos_de_documentos',)
- model
alias of
DocumentoDeRecebimento
- class DocumentoDeRecebimentoCreateSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id',)
- model
alias of
DocumentoDeRecebimento
- class TipoDeDocumentoDeRecebimentoCorrecaoSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- fields = ('tipo_documento', 'descricao_documento', 'arquivos_do_tipo_de_documento')
- model
alias of
TipoDeDocumentoDeRecebimento
- class TipoDeDocumentoDeRecebimentoCreateSerializer(*args, **kwargs)[source]
Bases:
ModelSerializer- class Meta[source]
Bases:
object- exclude = ('id', 'documento_recebimento')
- model
alias of
TipoDeDocumentoDeRecebimento
Serializadores de entrada:
TipoDeDocumentoDeRecebimentoCreateSerializer: tipo do documento comarquivos_do_tipo_de_documento(JSON, write-only); quando o tipo éLAUDO, exigearquivoenomeem cada arquivo.DocumentoDeRecebimentoCreateSerializer: criação pelo fornecedor —cronograma(uuid) enumero_laudoobrigatórios; cria os tipos de documento (helper) e chamainicia_fluxo(o documento vai paraENVIADO_PARA_ANALISE).DataDeFabricaoEPrazoAnalisarRascunhoSerializer: dados de fabricação/prazo em rascunho (todos opcionais).DataDeFabricaoEPrazoAnalisarSerializer: versão da análise final —data_fabricacao,data_validadeeprazo_maximo_recebimentoobrigatórios; quando o prazo éOUTRO, exigejustificativa.DocumentoDeRecebimentoAnalisarRascunhoSerializer: análise em rascunho (laboratório, unidade, quantidade, lote, data final e datas/prazos) — não altera o status.DocumentoDeRecebimentoAnalisarSerializer(herdaCamposObrigatóriosMixin): análise final da CODAE. O campocorrecao_solicitadaé opcional; quando preenchido, todos os demais campos tornam-se opcionais e o documento é enviado para correção (qualidade_solicita_correcao); caso contrário, é aprovado (qualidade_aprova_analise).TipoDeDocumentoDeRecebimentoCorrecaoSerializer: tipo de documento na correção —OUTROSexigedescricao_documento; todo arquivo exigearquivoenome.DocumentoDeRecebimentoCorrecaoSerializer: correção do fornecedor — exige ao menos um tipoLAUDO; apaga os tipos antigos (com seus arquivos), recria os novos e chamafornecedor_realiza_correcao.DocumentoDeRecebimentoAtualizacaoSerializer: atualização de documento aprovado pelo fornecedor — recria os tipos (exceto oLAUDO) e chamafornecedor_atualiza.