# Licitações Antigas — Resumo Executivo

> **Versão analisada:** `v6` (e `v5` para o comparativo)
> **Slug do módulo:** `licitacoes-antigas` — tabela `modulos`, `id = 20`, nome "Licitações Antigas"
> **Natureza:** Portal (público) — **sem rotas próprias no CMS**
> **Estado:** migrado v5 -> v6 com **uma única alteração funcional** (ordenação da listagem)

---

## 1. Objetivo

O módulo publica, em modo somente leitura, o acervo histórico de licitações
registradas até 2018 — o período em que a prefeitura publicava editais em
formato de aviso de licitação (arquivo/HTML), antes da adoção do sistema
estruturado de licitações (tabelas `biddings`, `bidding_modalities`,
`bidding_types`, `statuses`) que serve o módulo irmão `licitacoes` (`modulos.id = 21`).

Serve ao cidadão que precisa consultar um edital antigo, e ao servidor público
que precisa comprovar a publicação de um procedimento anterior ao sistema
atual. Não existe, no CMS, nenhuma tela de cadastro ou edição desses
registros: a carga é feita diretamente no banco.

## 2. Efeito / Impacto

| Faixa | Efeito |
|---|---|
| Cidadão | Acesso público a avisos de licitação antigos via `/licitacoes-ate-2018`, com busca por texto e filtros de modalidade, secretaria e ano. |
| Prefeitura (CMS) | Nenhuma gestão: o módulo só aparece como item do cadastro de módulos (`modulos.id = 20`), sem `menu_orders` associado. |
| Transparência e legalidade | Preserva o histórico de publicações; conteúdo é renderizado como HTML bruto vindo do banco. |
| Operação técnica | Tabelas legadas e tabelas de apoio (`biddings_legacys_modalities`, `biddings_legacys_jurisdictional`) que **não são criadas por migration** — ver `08-GAPS-E-DIVIDAS.md`. |

## 3. Comportamento

- **Listagem** (`GET/POST /licitacoes-ate-2018`): pagina 10 registros por página,
  ordenados por `data` decrescente (`v6/app/Http/Controllers/Portal/BiddingOldController.php:46-47`).
- **Filtros** (todos opcionais, combináveis por query string):
  - `tipo_modalidade` — igualdade exata com `biddings_legacys.tipo_modalidade`;
  - `ids_secretarias` — igualdade exata com `biddings_legacys.ids_secretarias`;
  - `ano` — `whereYear('data', ...)`;
  - `informacoes` — busca textual insensível a acentos/maiúsculas via `whereRaw` com `translate()` + `ilike`.
- **Ano disponível**: lista de anos distintos extraída por `DB::select` direto de `biddings_legacys`
  (`BiddingOldController.php:57`).
- **Detalhe** (`GET /licitacoes-ate-2018/{id}`): mostra título, data formatada em
  português, corpo HTML do aviso e a lista de arquivos para download.
- **Inexistente**: devolve a view `admin.errors.conteudo-nao-encontrado` (`BiddingOldController.php:94-96`).
- **Sem recorte temporal no código**: o rótulo "até 2018" é apenas de navegação;
  **não existe filtro por ano limite 2018** nem constraint no controller/repositório.
  A separação é exclusivamente por tabela (`biddings_legacys` vs `biddings`).

## 4. Como o Usuário Interage

- **Cidadão**: a partir de `/licitacoes` (módulo novo) há o botão
  "Ir para licitações até 2018"
  (`v6/resources/views/portal/layouts/default/pages/statics/licitacoes/list.blade.php:13`);
  nas telas do módulo novo (modelos 1..6) há o botão inverso
  "Ir para Licitações após 2018" (`.../licitacao/licitacao-antiga/index.blade.php`).
- Na listagem antiga: formulário de filtros com Modalidade, Secretarias, Ano e
  Pesquisa livre, botões "Consultar" e "Limpar campos" (JavaScript inline `toCleanFields()`).
- No detalhe: título, data por extenso, texto do aviso, cartão
  "Arquivos para Download" e link "Voltar".
- **Operador (CMS)**: nenhuma tela. Só o toggle de status do módulo na tela
  "Módulos" (`v6/resources/views/admin/modulos/form.blade.php:85`).

## 5. Detalhes e Particularidades Técnicas

- Camadas: `Route` (v6/routes/web.php) -> `Portal\BiddingOldController` -> model
  Eloquent `App\Http\Model\Prefecture\BiddingsLegacys` (injeção pelo construtor) ->
  `view('portal.layouts.' . $this->getTemplateActived() . '.licitacao.licitacao-antiga.*')`.
- **Sem repository, sem Form Request, sem Policy, sem API Resource**: consulta
  direta aos models, sem camada de serviço.
- O controller estende `App\Http\Controllers\Admin\Controller` (herança cruzada
  portal/CMS) para reusar `getTemplateActived()`
  (`v6/app/Http/Controllers/Admin/Controller.php:39-49`), que lê
  `configurations.key = 'layout'`.
- Dependências: `laravelcollective/html` (`Form::open/select`), `intl`
  (`transliterator_transliterate`), `laravel/framework` (Eloquent, paginate).
- Helpers do portal usados nas views: `translateMonth()`
  (`v6/app/Helpers/functions.php:93`) e `file_exist()`
  (`v6/app/Helpers/functions.php:267`).

## 6. Estrutura de Dados

| Tabela | Papel | Registros no banco `prefeituras_v5` |
|---|---|---|
| `biddings_legacys` | Licitação legada (aviso) | 0 linhas |
| `archives_biddings_legacy` | Arquivos anexos ao aviso | 0 linhas |
| `biddings_legacys_modalities` | Catálogo de modalidades (model `ModalitiesBiddingsLegacys`) | **tabela inexistente** |
| `biddings_legacys_jurisdictional` | Catálogo de secretarias (model `JurisdictionalBiddingsLegacys`) | **tabela inexistente** |

Colunas de `biddings_legacys`: `id`, `tipo_modalidade` (int, not null),
`ids_secretarias` (varchar 191), `numero` (varchar 191), `cnpj` (varchar 191),
`titulo` (varchar 250), `data` (date), `informacoes` (text), `created_at`, `updated_at`.
Detalhes em `02-MODELAGEM.md`.

## 7. Como Testar

- Manual: abrir `/licitacoes-ate-2018` com o layout ativo (`configurations.layout = 'modelo1'`)
  e aplicar cada filtro; abrir um detalhe e verificar a lista de arquivos.
- Automatizado: não há teste legado para este módulo
  (`v6/tests/Feature/` só cobre widgets do Dashboard). Casos propostos em `07-TESTES.md`.
- Ambiente: com `biddings_legacys` vazia, a listagem exibe
  "Nenhuma informação encontrada!"; com as tabelas de apoio ausentes, a
  listagem **quebra** (ver `08-GAPS-E-DIVIDAS.md`).

## 8. Migração para Laravel Moderno

Reconstruir como um módulo de **arquivo histórico imutável**: model `LegacyBidding`
com `casts` para `data`, um `LegacyBiddingArchive`, e um controller `Portal\LegacyBiddingController`
com `index`/`show`. Filtros devem virar um `FormRequest` com regras (`tipo_modalidade` integer
existindo no catálogo, `ano` integer entre 1900 e 2018, `informacoes` string max 255).
A busca textual deve usar um índice `unaccent`/`ILIKE` no Postgres em vez do
`translate()` hardcoded. A lista de anos deve sair de uma query Eloquent
(`selectRaw('EXTRACT(YEAR FROM data)')`) e não de `DB::select` cru. Como o módulo é
somente leitura, basta `Policy` de leitura pública e cache de listagem por página.

## 9. Resumo Geral

"Licitações Antigas" é o arquivo histórico de avisos de licitação do portal
municipal, alimentado por carga direta no banco e servido somente para consulta.
Ele vive em tabelas próprias (`biddings_legacys`, `archives_biddings_legacy`),
sem qualquer relação com o modelo relacional de licitações adotado a partir de
2018 (`biddings` e tabelas auxiliares). Não há tela de gestão no CMS: o módulo
aparece apenas como chave habilitável no cadastro de módulos. O portal
expõe duas rotas — listagem paginada com quatro filtros e detalhe do aviso com
download de anexos. A separação entre "antigas" e "novas" é puramente tabular:
nenhum código impõe o corte em 2018. O acervo está vazio na base de
referência e duas tabelas de apoio usadas pelos filtros não existem na base,
o que torna a listagem atual instável — item detalhado em `08-GAPS-E-DIVIDAS.md`.

---

## Índice do dossiê

| Arquivo | Conteúdo |
|---|---|
| `00-RESUMO.md` | Este documento |
| `01-ARQUITETURA.md` | Camadas, classes e o diagrama de fluxo |
| `02-MODELAGEM.md` | Estrutura de dados detalhada |
| `03-ROTAS-E-CONTROLADORES.md` | Rotas, controllers, requests, resources |
| `04-VIEWS-E-UX.md` | Telas, componentes, JS, assets |
| `05-REGRAS-E-PORTABILIDADE.md` | Particularidades e armadilhas |
| `06-MIGRACAO-MODERNA.md` | Plano de reconstrução em Laravel moderno |
| `07-TESTES.md` | Estratégia e casos de teste |
| `08-GAPS-E-DIVIDAS.md` | Pendências, riscos, comparativo v5 vs v6 |
