# Relatorio tecnico - Relatorios GED, Documentos e Projetos de Lei

Data da analise: 2026-07-23
Sistema: Superlegis / Laravel 8

## Contexto

Foi solicitado conferir os relatorios disponiveis no menu **Relatorios**, principalmente GED, Documentos e Projetos de Lei, pois foi informado que alguns relatorios nao estariam gerando os dados de forma correta. Pelo dashboard nao foi identificado problema aparente, entao a analise focou nas rotas, controllers, views e criterios usados nos relatorios.

## Rotas analisadas

- `/temporality/report/docs` - Temporariedade GED
- `/simple/report/documents/scanned` - GED Paginas
- `/user/report/documents/scanned` - GED Usuarios
- `/box/report/index` - GED Caixas
- `/report/documents` - Documentos
- `/report/documents/noFiles` - Documentos sem arquivos
- `/report/lawsProject` - Projetos de lei
- `/report/lawsProject/noFiles` - Projeto de lei sem arquivos
- `/report/meeting/noFiles` - Pautas/ATA sem arquivos
- `/report/getTramitacao` - Projetos de lei / Tramitacao

## Intencao esperada dos relatorios

- **GED Paginas**: contabilizar arquivos digitalizados e paginas usando `document_files.num_pag`.
- **GED Usuarios**: contabilizar documentos e paginas digitalizadas por usuario.
- **GED Caixas**: contabilizar caixas cadastradas e caixas vinculadas a documentos.
- **Documentos**: listar documentos por filtros como data, protocolo, tipo, numero, ano, responsavel e texto.
- **Documentos sem arquivos**: identificar documentos com anexos fisicos ausentes/corrompidos.
- **Projetos de lei**: listar projetos por filtros como data, protocolo, tipo, numero, ano e responsavel.
- **Projeto de lei sem arquivos**: identificar projetos cujos arquivos fisicos estejam ausentes.

## Achados principais

### 1. Filtro de protocolo no relatorio de Documentos nao aplica na query

Arquivo: `app/Http/Controllers/ReportController.php`

No metodo `document()`, o filtro por protocolo busca o `DocumentProtocol`, mas a linha que deveria filtrar o builder nao altera a query:

```php
!empty($request->proto) ? $documents->find($doc_id->id)->first()->document : null;
```

Impacto:

- O relatorio pode retornar documentos fora do protocolo informado.
- Se o protocolo nao existir, pode ocorrer erro por uso de variavel nula/indefinida.
- O PDF usa logica semelhante no metodo `getDoc()`, entao pode divergir ou falhar tambem.

### 2. "Documentos sem arquivos" na pratica significa "anexos corrompidos/ausentes"

Arquivo: `app/Http/Controllers/ReportController.php`

O metodo `noFiles()` percorre `DocumentFiles::all()` e verifica se o arquivo fisico existe em:

```text
public/uploads/documents/files/{filename}
```

Impacto:

- O relatorio nao lista documentos que nunca tiveram anexo.
- Ele lista documentos que possuem registro em `document_files`, mas cujo arquivo fisico nao existe.
- O nome do menu pode causar interpretacao incorreta.

### 3. "Projeto de lei sem arquivos" pode gerar falsos positivos

Arquivo: `app/Http/Controllers/ReportController.php`

O metodo `noFilesLaw()` considera problema quando `file` ou `law_file` nao existe:

```php
if (file_exists($file) == false || file_exists($file1) == false) {
    array_push($law_ids, $law->id);
}
```

Impacto:

- Projetos que ainda nao viraram lei podem ter `law_file` vazio, mas ainda assim entram como "sem arquivo".
- Projetos com apenas o arquivo do projeto valido podem aparecer indevidamente como pendentes.
- O criterio precisa ser confirmado com a regra de negocio: "sem arquivo do projeto", "sem arquivo da lei", ou "qualquer arquivo ausente".

### 4. GED Caixas diverge do dashboard por criterio de `deleted_at`

Arquivo: `app/Repositories/DocumentRepository.php`

O relatorio usa:

```php
$all_box = DB::table('box')->count();

$documents_box = DB::table('documents_box')
    ->distinct()
    ->count('box_id');
```

Ja o dashboard filtra registros nao deletados:

```php
box.deleted_at IS NULL
documents_box.deleted_at IS NULL
```

Impacto:

- Relatorio pode contar caixas deletadas ou vinculos deletados.
- Dashboard e relatorio podem apresentar numeros diferentes, mesmo sem erro no dashboard.

### 5. GED Usuarios pode gerar PDF vazio se datas forem preenchidas sem usuario

Arquivo: `app/Http/Controllers/ReportScannedDocuments.php`

A validacao usa `&&`:

```php
if (is_null($request->users) && is_null($request->start_date) && is_null($request->end_date)) {
```

Impacto:

- Se o usuario preencher datas mas nao selecionar usuario, a validacao nao bloqueia.
- O PDF pode ser gerado sem linhas, passando a impressao de erro no relatorio.

## Diagnostico resumido

O dashboard usa queries mais diretas para contagens gerais e, por isso, pode estar correto. Os problemas encontrados estao concentrados nos relatorios legados, principalmente em criterios diferentes de contagem, filtro de protocolo e verificacao de arquivos fisicos.

## Recomendacoes de correcao

1. Corrigir filtro de protocolo em Documentos e PDF de Documentos para aplicar `whereHas` ou `whereIn` em vez de chamar `find()` no builder.
2. Renomear o relatorio "Documentos sem arquivos" para "Documentos com anexos ausentes/corrompidos" ou ajustar a regra para incluir documentos sem nenhum anexo.
3. Confirmar regra de negocio de Projetos de Lei:
   - verificar somente `file`;
   - verificar somente `law_file`;
   - ou verificar ambos apenas quando preenchidos/obrigatorios.
4. Ajustar GED Caixas para filtrar `deleted_at` em `box` e `documents_box`, alinhando com o dashboard.
5. Ajustar validacao do GED Usuarios para exigir usuario e periodo quando necessario.
6. Adicionar testes simples de query para garantir que dashboard e relatorios usam o mesmo criterio quando o numero esperado for o mesmo.

## Status

Analise concluida. Correcoes de backend aplicadas sem alteracao visual no front-end.

## Correcoes aplicadas

- Filtro de protocolo do relatorio de Documentos corrigido para aplicar `whereHas` no relacionamento `document_protocol`.
- Relatorios "sem arquivos" de Documentos e Projetos de Lei passaram a reutilizar o mesmo criterio na listagem e no PDF.
- PDF dos relatorios "sem arquivos" deixou de retornar antes da geracao quando havia registros.
- GED Caixas passou a ignorar caixas e vinculos deletados logicamente (`deleted_at`).
- GED Paginas e GED Usuarios passaram a validar periodo/usuario obrigatorios antes de gerar.
- PDF de Pautas/ATA sem arquivos e Projetos de Lei / Tramitacao teve o retorno prematuro corrigido.
