Skip to content

Melhorias de transparência (PNTP): correções de relatórios e novas funcionalidades#3842

Open
joaohortsenado wants to merge 9 commits into
3.1.xfrom
feat/melhorias-pntp-oficio-017
Open

Melhorias de transparência (PNTP): correções de relatórios e novas funcionalidades#3842
joaohortsenado wants to merge 9 commits into
3.1.xfrom
feat/melhorias-pntp-oficio-017

Conversation

@joaohortsenado

@joaohortsenado joaohortsenado commented Jun 23, 2026

Copy link
Copy Markdown
Contributor

Descrição

Conjunto de correções e melhorias voltadas à transparência legislativa. São 7 mudanças independentes, cada uma em seu commit:

  • fix(sessao): o resumo da Sessão Plenária (HTML e PDF) ordenava as votações nominais por order_by('-materia'), divergindo da ordem das Matérias da Ordem do Dia (numero_ordem). Passa a ordenar por numero_ordem no Expediente e na Ordem do Dia.
  • fix(relatorios): o relatório "Imprimir Tramitação" exibia apenas o primeiro autor; passa a listar todos os autores/co-autores da matéria.
  • feat(uploads): o validador restringe_tipos_de_arquivo_txt (usado em Pauta/Ata/Anexo) passa a aceitar formatos editáveis de planilha e CSV (.csv, .xls, .xlsx, .ods). Sem migração (validador referenciado por nome).
  • feat(comissoes): lista de Reuniões de Comissão ganha filtro de pesquisa (número, nome, tema e período de data) e a coluna "Pauta da Reunião" ao lado de "Ata da Reunião".
  • feat(sessao): a pesquisa pública de sessões passa a exibir os links de Pauta, Ata e Anexo da Sessão juntos, e ganha um link "Votações Nominais" que aponta para o resumo da sessão (onde os votos nominais já são exibidos).
  • feat(base): faixa no topo de todas as páginas com "Informações foram atualizadas em DD/MM/AAAA" (apenas data, sem horário), oculta na impressão e em iframes. Em telas de detalhe mostra a data_ultima_atualizacao da entidade; nas demais (pesquisa/listagem) mostra a data atual. O campo é adicionado a Parlamentar, Comissao, DocumentoAdministrativo e AudienciaPublica (Norma/Materia/Sessao/DocumentoAcessorio já o possuíam).
  • feat(audiencia): o autor da Audiência Pública deixa de ser restrito a Parlamentar e passa a usar o Autor polimórfico do SAPL (Parlamentar, Comissão, Bancada, etc.). Inclui migração que preserva os autores já cadastrados.

Issue Relacionada

Não há issue vinculada. As mudanças derivam de uma solicitação de adequação ao PNTP (Programa Nacional de Transparência Pública).

Motivação e Contexto

Critérios de transparência do PNTP vinham sendo reprovados por limitações do SAPL: ausência de indicação de atualidade, impossibilidade de baixar pautas em formato editável, ordenação incorreta de votações nominais nos relatórios, relatório de tramitação omitindo co-autores, dificuldade de localizar reuniões de comissão e restrição de autoria em audiências públicas. Estas mudanças endereçam esses pontos.

Como Isso Foi Testado?

Ambiente de desenvolvimento com o código local servido via docker-compose-dev sobre PostgreSQL, comparando o comportamento da imagem publicada (baseline) com o código alterado. Para cada item foram capturadas telas ANTES e DEPOIS (anexadas abaixo). Além disso:

  • Item "uploads": o validador real (libmagic) foi exercido com amostras .csv/.xls/.xlsx/.ods — rejeitadas antes, aceitas depois.
  • Item "audiencia": teste em nível ORM confirmando a criação de Audiência Pública com autor do tipo Comissão.
  • manage.py check: sem problemas.

Observação: a suíte pytest não foi executada porque pytest-django não consta nas dependências do projeto (lacuna pré-existente, embora pytest.ini use --reuse-db).

Capturas de Tela

Item 1 — Faixa "Informações foram atualizadas em DD/MM/AAAA"

ANTES (sem faixa) x DEPOIS (com faixa):

Tela de detalhe (mostra a data de última atualização da entidade) x tela de listagem/pesquisa (mostra a data atual):

Item 2 — Upload de formatos editáveis (validador ANTES x DEPOIS)

Item 3 — Ordem das Votações Nominais no resumo (ANTES x DEPOIS)

Item 4 — "Imprimir Tramitação" com todos os autores (ANTES x DEPOIS)

Item 5 — Reuniões de Comissão: filtro + coluna Pauta (ANTES x DEPOIS + filtro em ação)

Item 6 — Pauta/Ata/Anexo juntos na busca pública + link "Votações Nominais"

ANTES (só "Ata da Sessão") x DEPOIS (Ata, Pauta, Anexo da Sessão e link "Votações Nominais" para o resumo):

Item 7 — Audiência Pública: autor de qualquer tipo (ANTES x DEPOIS)

Tipos de Mudanças

  • Bug fix (alteração que corrige uma issue e não altera funcionalidades já existentes)
  • Nova feature (alteração que adiciona uma funcionalidade e não altera funcionalidades já existentes)
  • Alteração disruptiva (Breaking change)

Nota: o item de Audiência Pública altera o schema (parlamentar_autorautor). A migração preserva os dados existentes; código que dependa diretamente do campo parlamentar_autor precisa ser ajustado para autor.

Checklist:

  • Eu li o documento de Contribuição (CONTRIBUTING).
  • Meu código segue o estilo de código deste projeto.
  • Minha alteração requer uma alteração na documentação.
  • Eu atualizei a documentação de acordo.
  • Eu adicionei testes para cobrir minhas mudanças.
  • Todos os testes novos e existentes passaram.

O resumo da Sessão Plenária (HTML e PDF) ordenava as votações nominais por
order_by('-materia'), divergindo da ordem das Matérias da Ordem do Dia, que
seguem numero_ordem. Passa a ordenar por numero_ordem nas listas de
Expediente e de Ordem do Dia, tanto no resumo HTML quanto no gerador de PDF.
O relatório "Imprimir Tramitação" exibia apenas o primeiro autor
(autores.first()). Passa a exibir todos os autores/co-autores da matéria,
ajustando a view (autores.all()) e o template (rótulo Autor/Autores e
junção dos nomes).
Amplia TIPOS_TEXTO_PERMITIDOS (validador restringe_tipos_de_arquivo_txt),
usado nos campos de Pauta/Ata/Anexo, para aceitar formatos editáveis de
planilha e CSV: .csv, .xls, .xlsx e .ods (e variantes de MIME). Não requer
migração, pois o validador é referenciado nas migrations apenas pelo nome.
…niões

Adiciona ReuniaoFilterSet (número, nome, tema e período de data) à listagem
de Reuniões de Comissão, permitindo localizar reuniões sem navegar página a
página. Inclui a coluna 'Pauta da Reunião' ao lado de 'Ata da Reunião'.
…na busca

Renomeia o verbose_name do campo upload_anexo de SessaoPlenaria de 'Anexo da
Sessão' para 'Votações Nominais' (com migração) e passa a exibir os links de
Pauta da Sessão e Votações Nominais ao lado da Ata na pesquisa pública de
sessões plenárias.
Adiciona uma faixa no topo do layout com 'Informações atualizadas em
DD/MM/AAAA' (data corrente, sem horário), oculta na impressão e em iframes.
@joaohortsenado joaohortsenado self-assigned this Jun 24, 2026
@joaohortsenado joaohortsenado force-pushed the feat/melhorias-pntp-oficio-017 branch from 03b69f4 to 3d952f6 Compare June 24, 2026 01:37
@joaohortsenado joaohortsenado marked this pull request as ready for review June 24, 2026 13:25

@eribeiro eribeiro left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adicionei algumas sugestões de mudanças, mas LGTM

Comment thread sapl/crud/base.py
# Mensagem de atualidade (PNTP): data de última atualização da entidade,
# quando o modelo possuir o campo. Consumido pelo banner em base.html.
context['data_atualizacao_conteudo'] = getattr(
self.object, 'data_ultima_atualizacao', None)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uma ideia: o getattr retornar now() como valor default ao invés de None. Assim, no base.html a gente poderia simplicar o snippet abaixo:

{% if data_atualizacao_conteudo %}{{ data_atualizacao_conteudo|date:"d/m/Y" }}{% else %}{% now "d/m/Y" %}{% endif %}

para

{% if data_atualizacao_conteudo %}{{ data_atualizacao_conteudo|date:"d/m/Y" }}{% endif %}

Comment thread sapl/audiencia/models.py
Comment on lines +88 to +90
data_ultima_atualizacao = models.DateTimeField(
blank=True, null=True, auto_now=True,
verbose_name=_('Data da Última Atualização'))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Então, a gente tem um problema de inconsistência de nomes que poderiamos (ou não) tentar resolver nesse PR. Temos os seguintes casos:

  1. Models com os campos data_ultima_atualizacao e ultima_atualizacao

Neste caso eu acho que deveriamos remover o ultima_atualizacao e deixar somente data_ultima_atualizacao.

  1. Models com somente o campo ultima_atualizacao

Nestes a gente só renomeia pra data_ultima_atualizacao

O problema: a gente precisa percorrer onde ultima_atualizacao é utilizado removendo linhas assim: materia.ultima_edicao = tz.localize(datetime.now()), pois data_ultima_atualizacao tem auto_now=True. E naqueles que for só renomear, se certificar de incluir auto_now=True,

─$ grep -rn 'ultima' sapl/*/models.py | grep -v 'data'                    
sapl/materia/models.py:306:    ultima_edicao = models.DateTimeField(
sapl/materia/models.py:1066:    ultima_edicao = models.DateTimeField(
sapl/materia/models.py:1344:    ultima_edicao = models.DateTimeField(
sapl/norma/models.py:223:    ultima_edicao = models.DateTimeField(
sapl/parlamentares/models.py:303:            return ultima_filiacao.partido.sigla
sapl/protocoloadm/models.py:242:    ultima_edicao = models.DateTimeField(
sapl/protocoloadm/models.py:461:    ultima_edicao = models.DateTimeField(```

Substitui o campo parlamentar_autor (FK direta a Parlamentar) pelo Autor
polimórfico do SAPL em AudienciaPublica, permitindo Parlamentar, Comissão,
Bancada e demais tipos. Atualiza o formulário, o layout e a validação de
autoria do requerimento. A migração preserva os autores já cadastrados.
…ntidade

Em telas de detalhe (CrudDetailView), a faixa do topo passa a exibir a data
de última atualização do registro (campo data_ultima_atualizacao); nas demais
telas (pesquisa/listagem) exibe a data atual. Adiciona data_ultima_atualizacao
(auto_now) a Parlamentar, Comissao, DocumentoAdministrativo e AudienciaPublica.
…nais

Desfaz o rename de upload_anexo (volta a 'Anexo da Sessão' e remove a migração
de verbose_name) e adiciona, na pesquisa pública de sessões, um link
'Votações Nominais' que aponta para o resumo da sessão.
@joaohortsenado joaohortsenado force-pushed the feat/melhorias-pntp-oficio-017 branch from 83d8946 to fd3d093 Compare July 3, 2026 15:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants