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 para ENVIADO_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-relatorio e exportar-excel.

  • Ações detail=True: analise-documentos-rascunho, analise-documentos, corrigir-documentos, atualizar-documentos e download-laudo-assinado.

viewsets

class DocumentoDeRecebimentoModelViewSet(**kwargs)[source]

Bases: ViewSetActionPermissionMixin, ModelViewSet

codae_analisa_documentos(request, uuid)[source]
codae_analisa_documentos_rascunho(request, uuid)[source]
dashboard(request)[source]
download_laudo_assinado(request, uuid)[source]
exportar_excel(request, *args, **kwargs)[source]
filter_backends = (<class 'django_filters.rest_framework.backends.DjangoFilterBackend'>,)
filterset_class

alias of DocumentoDeRecebimentoFilter

fornecedor_realiza_atualizacao(request, uuid)[source]
fornecedor_realiza_correcao(request, uuid)[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_relatorio(request, *args, **kwargs)[source]
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; create e delete restritos a UsuarioEhFornecedor.

  • Queryset dinâmico: usuários fornecedores veem apenas documentos de cronogramas da própria empresa (cronograma__empresa = vinculo_atual.instituicao).

  • Serializador dinâmico: listDocumentoDeRecebimentoSerializer; retrieveDocRecebimentoDetalharSerializer (fornecedor) ou DocRecebimentoDetalharCodaeSerializer (CODAE); demais ações → DocumentoDeRecebimentoCreateSerializer.

Ações:

  • dashboard (GET): painel por status via ServiceDashboardDocumentosDeRecebimento.

  • codae_analisa_documentos_rascunho (PATCH analise-documentos-rascunho, UsuarioEhDilogQualidade): salva a análise em rascunho (dados do laudo/laboratório/datas) sem alterar o status.

  • codae_analisa_documentos (PATCH analise-documentos, UsuarioEhDilogQualidade): análise final — se houver correcao_solicitada o documento vai para ENVIADO_PARA_CORRECAO (qualidade_solicita_correcao), senão é aprovado (qualidade_aprova_analise).

  • fornecedor_realiza_correcao (PATCH corrigir-documentos, UsuarioEhFornecedor): recria os tipos de documento (exigindo ao menos um LAUDO) e chama fornecedor_realiza_correcao (volta para ENVIADO_PARA_ANALISE).

  • fornecedor_realiza_atualizacao (PATCH atualizar-documentos, UsuarioEhFornecedor): atualiza os tipos de documento de um documento APROVADO (preservando o LAUDO) e chama fornecedor_atualiza (volta para ENVIADO_PARA_ANALISE).

  • download_laudo_assinado (GET download-laudo-assinado): retorna o PDF do laudo assinado; retorna 401 se o documento não estiver APROVADO.

  • lista_relatorio (GET listagem-relatorio, PermissaoParaRelatorioDocumentosDeRecebimento): relatório por cronograma com os documentos (filtros CronogramaRelatorioDocumentosFilter e status_documento) e totalizadores (recebidos, pendentes de aprovação, enviados para correção, aprovados).

  • exportar_excel (GET exportar-excel, PermissaoParaRelatorioDocumentosDeRecebimento): gera e baixa o relatorio_documentos_recebimento.xlsx com 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_datas_e_prazos_doc_recebimento(datas_e_prazos, doc_recebimento)[source]
cria_tipos_de_documentos(tipos_de_documentos, documento_de_recebimento=None)[source]
  • cria_tipos_de_documentos: cria os TipoDeDocumentoDeRecebimento e seus ArquivoDoTipoDeDocumento a partir do payload (arquivos_do_tipo_de_documento em base64, convertidos para ContentFile).

  • cria_datas_e_prazos_doc_recebimento: cria as DataDeFabricaoEPrazo de 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 CronogramaRelatorioDocumentosSerializer(*args, **kwargs)[source]

Bases: Serializer

get_documentos(obj)[source]
get_numero_pregao_chamada_publica(obj)[source]
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')
get_fornecedor(obj)[source]
get_numero_sei(obj)[source]
get_saldo_laudo(obj)[source]
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

get_criado_em(obj)[source]
get_nome_produto(obj)[source]
get_numero_cronograma(obj)[source]
get_pregao_chamada_publica(obj)[source]
get_programa_leve_leite(obj)[source]
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

get_datas_fabricacao(obj)[source]
get_datas_validade(obj)[source]
get_quantidade_recebida(obj)[source]
get_saldo_laudo(obj)[source]
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

get_saldo_atual(obj)[source]
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

get_saldo_atual(obj)[source]
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

get_criado_em(obj)[source]
get_nome_produto(obj)[source]
get_numero_cronograma(obj)[source]
get_pregao_chamada_publica(obj)[source]
get_programa_leve_leite(obj)[source]
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

get_log_mais_recente(obj)[source]
get_nome_empresa(obj)[source]
get_nome_produto(obj)[source]
get_programa_leve_leite(obj)[source]
class TipoDocumentoDeRecebimentoLookupSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

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

alias of TipoDeDocumentoDeRecebimento

calcular_saldo_laudo(documento_recebimento)[source]

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]

Bases: DataDeFabricaoEPrazoAnalisarRascunhoSerializer

class Meta[source]

Bases: Meta

extra_kwargs = {'data_fabricacao': {'allow_null': False, 'required': True}, 'data_validade': {'allow_null': False, 'required': True}, 'prazo_maximo_recebimento': {'allow_blank': False, 'required': True}}
validate(attrs)[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

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

Bases: CamposObrigatoriosMixin, DocumentoDeRecebimentoAnalisarRascunhoSerializer

class Meta[source]

Bases: Meta

fields = ('laboratorio', 'quantidade_laudo', 'unidade_medida', 'numero_lote_laudo', 'data_final_lote', 'datas_fabricacao_e_prazos', 'correcao_solicitada')
update(instance, validated_data)[source]
class DocumentoDeRecebimentoAtualizacaoSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('tipos_de_documentos',)
model

alias of DocumentoDeRecebimento

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

Bases: ModelSerializer

class Meta[source]

Bases: object

fields = ('tipos_de_documentos',)
model

alias of DocumentoDeRecebimento

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

Bases: ModelSerializer

class Meta[source]

Bases: object

exclude = ('id',)
model

alias of DocumentoDeRecebimento

create(validated_data)[source]

Cria o documento de recebimento para o cronograma informado, cria os tipos de documento (helper) e inicia o fluxo (o documento passa para ENVIADO_PARA_ANALISE).

validate_cronograma(value)[source]
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

validate(attrs)[source]
class TipoDeDocumentoDeRecebimentoCreateSerializer(*args, **kwargs)[source]

Bases: ModelSerializer

class Meta[source]

Bases: object

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

alias of TipoDeDocumentoDeRecebimento

validate(attrs)[source]

Serializadores de entrada:

  • TipoDeDocumentoDeRecebimentoCreateSerializer: tipo do documento com arquivos_do_tipo_de_documento (JSON, write-only); quando o tipo é LAUDO, exige arquivo e nome em cada arquivo.

  • DocumentoDeRecebimentoCreateSerializer: criação pelo fornecedor — cronograma (uuid) e numero_laudo obrigatórios; cria os tipos de documento (helper) e chama inicia_fluxo (o documento vai para ENVIADO_PARA_ANALISE).

  • DataDeFabricaoEPrazoAnalisarRascunhoSerializer: dados de fabricação/prazo em rascunho (todos opcionais).

  • DataDeFabricaoEPrazoAnalisarSerializer: versão da análise final — data_fabricacao, data_validade e prazo_maximo_recebimento obrigatórios; quando o prazo é OUTRO, exige justificativa.

  • DocumentoDeRecebimentoAnalisarRascunhoSerializer: análise em rascunho (laboratório, unidade, quantidade, lote, data final e datas/prazos) — não altera o status.

  • DocumentoDeRecebimentoAnalisarSerializer (herda CamposObrigatóriosMixin): análise final da CODAE. O campo correcao_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 — OUTROS exige descricao_documento; todo arquivo exige arquivo e nome.

  • DocumentoDeRecebimentoCorrecaoSerializer: correção do fornecedor — exige ao menos um tipo LAUDO; apaga os tipos antigos (com seus arquivos), recria os novos e chama fornecedor_realiza_correcao.

  • DocumentoDeRecebimentoAtualizacaoSerializer: atualização de documento aprovado pelo fornecedor — recria os tipos (exceto o LAUDO) e chama fornecedor_atualiza.