# Licitações Antigas — Modelagem de Dados

> Verificado por `\d` no PostgreSQL `prefeituras_v5` (somente leitura) e pelas
> migrations de `v6/database/migrations/`.

---

## 1. Tabelas

### 1.1 `biddings_legacys` — núcleo do acervo

Origem: `v6/database/migrations/2018_11_21_121507_create_biddings_legacys_table.php`

| Coluna | Tipo | Null | Default | Observação |
|---|---|---|---|---|
| `id` | `integer` (serial) | not null | `biddings_legacys_id_seq` | PK, `increments('id')` |
| `tipo_modalidade` | `integer` | not null | — | ID do item em `biddings_legacys_modalities` (sem FK) |
| `ids_secretarias` | `character varying(191)` | not null | — | ID do item em `biddings_legacys_jurisdictional` (sem FK) |
| `numero` | `character varying(191)` | not null | — | Número do edital/processo |
| `cnpj` | `character varying(191)` | not null | — | CNPJ da empresa/processo |
| `titulo` | `character varying(250)` | not null | — | Título do aviso |
| `data` | `date` | not null | — | Data do edital; base dos filtros de ano e da ordenação |
| `informacoes` | `text` | not null | — | Corpo HTML do aviso; renderizado com `{!! !!}` |
| `created_at` | `timestamp(0)` | null | — | Laravel timestamps |
| `updated_at` | `timestamp(0)` | null | — | Laravel timestamps |

Índices: apenas `biddings_legacys_pkey` (btree em `id`). **Nenhum índice
secundário** em `data`, `tipo_modalidade` ou `ids_secretarias`, embora as
queries filtrem por esses campos.

Observações de modelagem (divergência entre migration e model):
- A migration **não cria** a coluna `arquivo`, mas `BiddingsLegacys::$fillable`
  a declara (`v6/app/Http/Model/Prefecture/BiddingsLegacys.php:20`).
- Não há coluna `deleted_at` (soft delete): registros legados somem por `DELETE` físico.

### 1.2 `archives_biddings_legacy` — anexos

Origem: `v6/database/migrations/2018_11_21_121854_create_archives_biddings_legacy_table.php`

| Coluna | Tipo | Null | Default | Observação |
|---|---|---|---|---|
| `id` | `integer` (serial) | not null | `archives_biddings_legacy_id_seq` | PK |
| `name` | `character varying(250)` | not null | — | Nome do arquivo dentro de `storage/licitacoes_old/{biddings_legacys_id}/` |
| `biddings_legacys_id` | `integer` | not null | — | Sem FK declarada na migration |
| `created_at` | `timestamp(0)` | null | — | Laravel timestamps |
| `updated_at` | `timestamp(0)` | null | — | Laravel timestamps |

Índices: apenas PK. Sem FK física — a integridade é garantida só pela aplicação.

Observação: o model `ArchivesBiddingsLegacys` declara `title` no `$fillable`,
mas **a coluna não existe**; a view usa `$archive->title or $archive->name`,
logo o fallback para `name` é sempre o caminho real.

### 1.3 `biddings_legacys_modalities` — catálogo de modalidades

- Model: `v6/app/Http/Model/Prefecture/ModalitiesBiddingsLegacys.php`
- Colunas inferidas do model: `id` (PK), `name` (`$fillable`), timestamps.
- **Não existe migration que a crie** e **a tabela não existe** na base
  `prefeituras_v5` (verificado com `\d`).
- Usada em `BiddingOldController.php:54` via `ModalitiesBiddingsLegacys::pluck('name','id')`.

### 1.4 `biddings_legacys_jurisdictional` — catálogo de secretarias

- Model: `v6/app/Http/Model/Prefecture/JurisdictionalBiddingsLegacys.php`
- Colunas inferidas do model: `id` (PK), `title` (`$fillable`), timestamps.
- **Não existe migration que a crie** e **a tabela não existe** na base
  `prefeituras_v5`.
- Usada em `BiddingOldController.php:55` via `JurisdictionalBiddingsLegacys::pluck('title','id')`.

### 1.5 Ausência de integridade referencial

Nenhuma das colunas `tipo_modalidade`, `ids_secretarias` e
`biddings_legacys_id` possui FK. O "vínculo" com os catálogos é lógico e
baseado em IDs soltos — o que torna os dois `pluck()` do controller frágeis.

## 2. Relations Eloquent

| Model | Relação | Definição | Tipo |
|---|---|---|---|
| `BiddingsLegacys` | `archives()` | `$this->hasMany(ArchivesBiddingsLegacys::class, 'biddings_legacys_id', 'id')` | hasMany |
| `BiddingsLegacys` | — | `getDataAttribute($value)` retorna `Carbon::parse($value)->format('d-m-Y')` | accessor |
| `ArchivesBiddingsLegacys` | — | sem relações declaradas | — |
| `ModalitiesBiddingsLegacys` | — | sem relações declaradas | — |
| `JurisdictionalBiddingsLegacys` | — | sem relações declaradas | — |

Não há `belongsTo` para os catálogos: o controller filtra por ID cru.

## 3. Dados observados na base

| Consulta | Resultado |
|---|---|
| `select count(*) from biddings_legacys` | 0 |
| `select min(data), max(data) from biddings_legacys` | NULL / NULL |
| `\d biddings_legacys` | tabela existe, 10 colunas, só PK |
| `\d archives_biddings_legacy` | tabela existe, 5 colunas, só PK |
| `\d biddings_legacys_modalities` | "Did not find any relation" |
| `\d biddings_legacys_jurisdictional` | "Did not find any relation" |

Consequência prática: na base de referência a listagem **não funciona**
(`pluck` sobre tabelas inexistentes → `QueryException`), e o filtro de anos
devolve lista vazia.

## 4. Views SQL

O módulo **não possui** view SQL própria. A única view do domínio de licitações é
`licitacao`, criada em `v6/database/migrations/2023_04_06_100010_create_view_to_licitacao.php`,
que lê **apenas** a tabela `biddings` (módulo novo) e as tabelas
`bidding_modalities`, `bidding_types`, `statuses`. As licitações legadas
**não** aparecem nessa view — mais um indício de que os dois acervos são
totalmente independentes.

## 5. Migrations

| Migration | Data | Efeito |
|---|---|---|
| `v6/database/migrations/2018_11_21_121507_create_biddings_legacys_table.php` | 2018-11-21 | Cria `biddings_legacys`. |
| `v6/database/migrations/2018_11_21_121854_create_archives_biddings_legacy_table.php` | 2018-11-21 | Cria `archives_biddings_legacy`. |

Não há migration posterior que altere essas tabelas (nem para criar as
tabelas de catálogo). Em `v5` as duas migrations são **byte a byte idênticas**
(diff vazio).

## 6. Seeds

Nenhum seed para dados legados. As migrations do módulo `licitacoes`
(`BiddingModalityTableSeeder`, `BiddingTypeTableSeeder`, `NewBiddingModalities`
em `v6/database/seeds/`) populam apenas as tabelas do módulo **novo**.

## 7. Armazenamento de arquivos

O caminho de download é construído na view como
`/storage/licitacoes_old/{biddings_legacys_id}/{name}`
(`v6/resources/views/portal/layouts/modelo1/licitacao/licitacao-antiga/show.blade.php`).
Esse diretório **não existe** no repositório (`v6/storage/app/public/` contém
apenas `content`, `css`, `formularios`, `img`, `manual-usuario`), ou seja,
os arquivos legados não estão versionados: dependem de carga manual no
servidor.
