# Banco `lab2_bd` — Core / Global do framework f19

Banco principal da plataforma f19. Hospeda toda a infra **core** compartilhada entre projetos: identidade, multi-tenancy, projetos, framework dinâmico (form/product builders), faturamento, metadados geográficos, segurança e auditoria.

Apps específicas (z-api, etc.) têm bancos **separados** (`lab2_<app>`) que apenas referenciam `id_project` da `tb_project` daqui — sem FK formal (MySQL não suporta FK cross-db).

## Conexão

```
host : 129.121.54.153
db   : lab2_bd
user : lab2_user
pass : 1Milhao@2026*
```

Configuração no projeto: `cliki/config.php` define `$vHost`, `$vBdName`, etc. Em XAMPP local, `$vIpHost = '129.121.54.153'` força conexão remota (não usa o MySQL local).

## Mapa das 33 tabelas

Agrupadas por responsabilidade:

### 🔐 Identidade & Acesso (3)
| Tabela | Função |
|---|---|
| [`tb_user`](#tb_user) | Usuários do sistema — adm, vendedor, cliente |
| [`tb_user_detail`](#tabelas-_detail-extensao-flexivel) | Extensão dinâmica de `tb_user` |
| [`tb_access`](#tb_access) | Níveis de acesso (admin, vendedor, cliente etc.) |

### 🏢 Tenancy & Projetos (4)
| Tabela | Função |
|---|---|
| [`tb_company`](#tb_company) | Empresas / tenants (dados fiscais, contato, branding) |
| `tb_company_detail` | Extensão dinâmica de `tb_company` |
| [`tb_project`](#tb_project) | Projetos — instâncias de site/app, com paleta/domínio/logos |
| [`tb_project_api`](#tb_project_api) | Junction project ↔ api (com credenciais por projeto) |

### 📦 Catálogo de Recursos (2)
| Tabela | Função |
|---|---|
| [`tb_app`](#tb_app) | Apps instaláveis (z-api, …) — guarda credenciais do banco do app |
| [`tb_api`](#tb_api) | APIs externas catalogadas (OpenAI, Z-API, WhatsApp, …) |

### 🧩 Framework dinâmico — Form Builder (2)
| Tabela | Função |
|---|---|
| [`tb_form`](#tb_form) | Formulários cadastrados (target = `user` \| `company` \| `product`) |
| [`tb_form_field`](#tb_form_field) | Campos disponíveis pra montar forms (text, select, file, …) |

### 🛒 Framework dinâmico — Product Builder (5)
| Tabela | Função |
|---|---|
| `tb_product_category` | Categorias globais de produtos |
| `tb_product_model` | Modelos de produto (template) |
| `tb_product_model_category` | Junction model ↔ category |
| `tb_product_model_detail` | Detalhes extensíveis do model |
| `tb_product_model_file` | Arquivos anexos ao model |

### 💰 Comercial — Orçamentos, Faturas, Assinaturas (8)
| Tabela | Função |
|---|---|
| `tb_project_product_category` | Categorias de produto **dentro** de um projeto |
| `tb_project_product_model` | Models de produto vinculados ao projeto |
| `tb_project_product_item` | Items concretos do projeto (instâncias do model) |
| `tb_project_product_item_detail` | Detalhes extensíveis dos items |
| [`tb_project_budget`](#tb_project_budget) | Orçamentos (status: em_andamento\|finalizada\|cancelada\|fechada) |
| `tb_project_budget_item` | Linhas do orçamento |
| `tb_project_budget_model` | Templates de orçamento |
| [`tb_project_invoice`](#tb_project_invoice) | Faturas (status: aberto\|vencida\|cancelada\|paga) |
| [`tb_project_signature`](#tb_project_signature) | Assinaturas recorrentes (status: aberto\|ativa\|inativa\|cancelada) |

### 🌎 Metadados Geográficos (5)
| Tabela | Linhas | Notas |
|---|---|---|
| `tb_metadata_country` | 1 | Apenas BR populado |
| `tb_metadata_region` | 5 | Norte, Nordeste, Sul, Sudeste, Centro-Oeste |
| `tb_metadata_state` | 27 | UFs do Brasil |
| `tb_metadata_city` | 4.409 | Cidades do Brasil |
| `tb_metadata_neighborhood` | 14.320 | Bairros |

> Usado para autocomplete de endereço, geo-targeting e filtros em campos de cadastro.

### 🛡️ Segurança & Auditoria (3)
| Tabela | Função |
|---|---|
| [`tb_block_ip`](#tb_block_ip) | IPs / providers / countries bloqueados (acesso ao painel) |
| [`tb_log_query`](#tb_log_query) | Log de TODA query que faz write (INSERT/UPDATE/DELETE) |
| [`tb_workflow`](#tb_workflow) | Tarefas/atividades dos usuários (mini-kanban global) |

---

## Detalhamento das tabelas principais

### `tb_user`

Usuário do sistema. Pode ser admin global, dono de empresa, vendedor, cliente.

| Campo | Tipo | Notas |
|---|---|---|
| `id_user` | INT PK AUTO | |
| `user_name` | VARCHAR(150) NOT NULL | |
| `user_cpf` | VARCHAR(14) NOT NULL | com máscara `000.000.000-00` |
| `user_email` | VARCHAR(150) NOT NULL | |
| `user_whatsapp` | VARCHAR(20) NOT NULL | |
| `user_password` | VARCHAR(255) NOT NULL | hash (`password_hash`) |
| `id_access` | INT NOT NULL | FK → `tb_access` |
| `id_project` | INT NULL | projeto-padrão (se aplicável) |
| `user_zipcode` / `_address` / `_number` / `_complement` / `_neighborhood` / `_city` / `_state` / `_country` | VARCHAR | endereço |
| `user_ip_register` / `user_ip_access` | VARCHAR(45) | rastreabilidade |
| `user_terms` | TINYINT(1) | aceitou termos |
| `user_status` | TINYINT(1) | 0/1 |
| `user_created` / `_updated` | DATETIME | auto |

### `tb_access`

Níveis de acesso. Referenciado por `tb_user.id_access`.

| Campo | Tipo |
|---|---|
| `id_access` | INT PK AUTO |
| `access_name` | VARCHAR(50) |
| `access_description` | VARCHAR(200) |
| `access_status` | TINYINT(1) |
| `access_created` | DATETIME |

### `tb_company`

Empresa / tenant. Dados fiscais + branding + redes sociais (29 colunas).

Campos-chave:
- **Fiscal**: `company_razao_social`, `company_nome_fantasia`, `company_cnpj` (BIGINT — apenas dígitos)
- **Endereço**: `company_country`, `_zipcode`, `_address`, `_number`, `_complement`, `_neighborhood`, `_city`, `_state`
- **Contato**: `company_phone`, `_phone2`, `_whatsapp`, `_email`
- **Branding**: `company_name`, `_about` (TEXT), `_slogan`
- **Social** (todas VARCHAR(255)): `_facebook`, `_instagram`, `_tiktok`, `_spotify`, `_youtube`, `_twitter`, `_linkedin`

### `tb_project`

Instância de site/app — cada projeto tem sua URL, paleta, logos, flags de capabilities.

| Campo | Tipo | Notas |
|---|---|---|
| `id_project` | INT PK AUTO | |
| `id_company` | INT NOT NULL | FK → `tb_company` |
| `project_name` | VARCHAR(100) | |
| `project_folder` | VARCHAR(100) | nome da pasta no XAMPP/cPanel |
| `project_domain` | VARCHAR(100) | ex: `cliki.com.br` |
| `project_subdomains` | TEXT | JSON array `["adm.cliki.com.br","api.cliki.com.br"]` |
| `project_logo_1` / `_logo_2` / `_logo_icon` / `_favicon` / `_icon_apple` | VARCHAR(255) | caminhos relativos a `content/uploads/` |
| `project_color_1` … `_color_5` | VARCHAR(20) | paleta — viram `var(--color-1..5)` no `cliki/css.php` global |
| **Identidade pública** | | **`alter_tb_project_add_public_info.sql` — 2026-05-14** |
| `project_slogan` | VARCHAR(255) | frase de marca |
| `project_about` | TEXT | descrição |
| **Endereço** | | |
| `project_country` / `_zipcode` / `_address` / `_number` / `_complement` / `_neighborhood` / `_city` / `_state` | VARCHAR | endereço público do site |
| **Contato** | | |
| `project_phone` / `_phone2` / `_whatsapp` / `_email` | VARCHAR | contatos públicos |
| **Redes sociais** | | |
| `project_facebook` / `_instagram` / `_tiktok` / `_spotify` / `_youtube` / `_twitter` / `_linkedin` | VARCHAR(255) | URLs |
| **Flags / status** | | |
| `project_active` | TINYINT(1) | `'true'/'false'` (mantido string por compat) |
| `project_device_mob` | TINYINT(1) | detecção mobile |
| `project_bd` | TINYINT(1) | usa banco próprio |
| `project_api` | TINYINT(1) | expõe API REST |
| `project_status` | TINYINT(1) | |
| `project_created` / `_updated` | DATETIME | |

> **Identidade pública vive no PROJETO, não na empresa.** Uma empresa pode ter vários projetos com slogan/endereço/contato/redes próprios (ex: empresa #8 tem Cliki **e** Luasa, cada um com `project_email` distinto). Fiscais (`company_razao_social`, `company_cnpj`, `company_nome_fantasia`) ficam em `tb_company`.

> `config_on.php` carrega o projeto pelo `$vProjetoId` em `cliki/config.php` e popula `$vColor1..5`, `$vLogo1..2`, `$vFavicon`. Sobrescreve `$vEmpresaEmail`, `$vEmpresaTelefone`, `$vEmpresaInstagram` etc. com os do projeto quando preenchidos (mantém compat com sections já em produção que usam essas vars).

### `tb_app`

Registry de apps instaláveis. Quando um app tem banco próprio (`lab2_zapi`, etc.), credenciais ficam aqui.

| Campo | Tipo |
|---|---|
| `id_app` | INT UNSIGNED PK AUTO |
| `app_name` | VARCHAR(120) |
| `app_source` | VARCHAR(60) — slug (`zapi`, `meta-ads`, …) |
| `app_description` | TEXT |
| `app_path` | VARCHAR(255) |
| `app_db_name` / `_db_user` / `_db_pass` / `_db_ip` / `_db_host` | VARCHAR | credenciais do banco do app |
| `app_status` | TINYINT(1) |
| `app_created` / `_updated` | DATETIME |

### `tb_api`

Catálogo de APIs externas (template global). Credenciais por projeto ficam em `tb_project_api`.

| Campo | Tipo |
|---|---|
| `id_api` | INT PK AUTO |
| `api_name` | VARCHAR(100) — ex: "OpenAI", "Z-API", "WhatsApp Business" |
| `api_request` | VARCHAR(255) — endpoint base |
| `api_source` | VARCHAR(255) — URL do site/docs |
| `api_version` | VARCHAR(50) |
| `api_status` | TINYINT(1) |
| `api_created` / `_updated` | DATETIME |

### `tb_project_api`

Junction project ↔ api, **com credenciais por projeto** (PK composta).

| Campo | Tipo |
|---|---|
| `id_project` | INT NOT NULL (PK) |
| `id_api` | INT NOT NULL (PK) |
| `project_api_model` | VARCHAR(100) — ex: `gpt-3.5-turbo-1106` |
| `project_api_key` | VARCHAR(500) — chave longa (sk-proj-…) |
| `project_api_token` | VARCHAR(255) — token curto (instância Z-API etc.) |
| `project_api_client_token` | VARCHAR(255) — client-token (Z-API segundo token) |
| `project_api_status` | TINYINT(1) |
| `project_api_created` / `_updated` | DATETIME |

> **Segredos**: `project_api_key`, `project_api_token`, `project_api_client_token` são redactados no `logQuery` (write como `__redacted__`).

### `tb_form`

Form builder — formulários dinâmicos. `form_target` define onde o form se aplica.

| Campo | Tipo |
|---|---|
| `id_form` | INT PK AUTO |
| `form_category` | VARCHAR(100) |
| `form_name` | VARCHAR(150) |
| `form_description` | TEXT |
| `form_target` | ENUM `'user'` / `'company'` / `'product'` |
| `form_fields` | TEXT — JSON com lista de `id_form_field` |
| `form_status` | TINYINT(1) |
| `form_created` / `_updated` | DATETIME |

### `tb_form_field`

Catálogo de campos disponíveis pra montar forms.

| Campo | Tipo |
|---|---|
| `id_form_field` | INT PK AUTO |
| `form_field_name` | VARCHAR(100) |
| `form_field_label` | VARCHAR(150) |
| `form_field_placeholder` | VARCHAR(200) |
| `form_field_type` | ENUM `'text'`,`'select'`,`'textarea'`,`'number'`,`'file'` |
| `form_field_mask` | VARCHAR(50) — máscara JS (CPF, CNPJ, telefone…) |
| `form_field_options` | TEXT — JSON pra select |
| `form_field_required` | TINYINT(1) |
| `form_field_status` | TINYINT(1) |
| `form_field_created` / `_updated` | DATETIME |

### `tb_project_budget`

Orçamentos enviados a clientes — multi-payload (HTML longtext) + tracking.

| Campo | Tipo |
|---|---|
| `id_project_budget` | INT PK AUTO |
| `id_user_create` | INT — criador |
| `id_user_assigned` | INT — vendedor responsável |
| `id_company_assigned` | INT — empresa cliente |
| `id_company` / `id_project` | INT NOT NULL |
| `id_project_budget_model` | INT — template de origem |
| `project_budget_name` | VARCHAR(180) |
| `project_budget_value` | DECIMAL(12,2) — total |
| `project_budget_entrada` | DECIMAL(12,2) |
| `project_budget_installments` | TINYINT — número de parcelas |
| `project_budget_installment_value` | DECIMAL(12,2) |
| `project_budget_payment_format` | TEXT — JSON com forma de pgto |
| `project_budget_html` | LONGTEXT — render do orçamento |
| `project_budget_status` | ENUM `em_andamento` / `finalizada` / `cancelada` / `fechada` |
| `project_budget_sent_at` / `_viewed_at` | DATETIME — tracking de envio/abertura |
| `project_budget_created` / `_updated` | DATETIME |

### `tb_project_invoice`

Faturas (cobranças).

| Campo | Tipo |
|---|---|
| `id_project_invoice` | INT PK AUTO |
| `id_project` | INT NOT NULL |
| `id_product_model` / `id_project_product_item` | INT |
| `id_user` | INT — pagador |
| `id_company` | INT |
| `project_invoice_due` | DATE |
| `project_invoice_amount` | DECIMAL(12,2) |
| `project_invoice_status` | ENUM `aberto` / `vencida` / `cancelada` / `paga` |
| `project_invoice_created` / `_updated` | DATETIME |

### `tb_project_signature`

Assinaturas recorrentes (mensalidades).

| Campo | Tipo |
|---|---|
| `id_project_signature` | INT PK AUTO |
| `id_project` | INT NOT NULL |
| `id_product_model` / `id_project_product_item` | INT |
| `id_user` / `id_company` | INT |
| `project_signature_next_invoice` | DATE |
| `project_signature_amount` | DECIMAL(12,2) |
| `project_signature_status` | ENUM `aberto` / `ativa` / `inativa` / `cancelada` |
| `project_signature_created` / `_updated` | DATETIME |

### `tb_block_ip`

Bloqueio de acesso por IP / provider / country (controle de painel adm).

| Campo | Tipo |
|---|---|
| `id_block_ip` | INT PK AUTO |
| `block_ip_type` | ENUM `'ip'` / `'provider'` / `'country'` |
| `block_ip_value` | VARCHAR(255) — IP exato, ASN ou código de país |
| `block_ip_name` | VARCHAR(120) — apelido |
| `block_ip_observation` | TEXT — motivo |
| `block_ip_status` | TINYINT(1) |
| `block_ip_created` / `_updated` | DATETIME |

> Consultado em todo bootstrap via `acessoBloqueado()` em `cliki/global.php`. Cache de 5 min em sessão.

### `tb_log_query`

Auditoria de TODAS as queries de escrita. **Regra**: toda função PHP que faz `INSERT/UPDATE/DELETE` chama `logQuery($sql, $params)` após o `execute()`.

| Campo | Tipo |
|---|---|
| `id_log_query` | INT PK AUTO |
| `log_query_query` | MEDIUMTEXT — SQL com `?` ou named params |
| `log_query_ip` | VARCHAR(45) |
| `log_query_origin` | VARCHAR(255) — script/handler |
| `log_query_domain` | VARCHAR(120) |
| `log_query_created` | DATETIME |

> Segredos (api_key, token, password) devem ser redactados antes do log — convenção do framework. Conexão **dedicada** (`_logQueryConn`) pra não poluir `lastInsertId` da conexão principal.

### `tb_workflow`

Mini-kanban de tarefas. Cada tarefa concreta pedida no chat → linha aqui.

| Campo | Tipo |
|---|---|
| `id_workflow` | INT PK AUTO |
| `id_user` | INT NOT NULL — criador |
| `workflow_category` | VARCHAR(60) — slug normalizado (lowercase, sem acento) |
| `workflow_subcategory` | VARCHAR(60) |
| `workflow_name` | VARCHAR(180) |
| `workflow_description` | TEXT |
| `workflow_status` | ENUM `pendente` / `em_andamento` / `em_espera` / `concluido` / `cancelado` |
| `workflow_created` / `_updated` | DATETIME |

> Painel `?page=workflow` no adm agrupa por categoria, ordena por status (FIELD: em_andamento → pendente → em_espera → concluido → cancelado).

## Tabelas `_detail` (extensão flexível)

Padrão `tb_<base>_detail` = key-value store para campos extras não-modelados em colunas fixas:
- `tb_user_detail`, `tb_company_detail`, `tb_product_model_detail`, `tb_project_product_item_detail`

Estrutura típica:
- `id_<base>_detail` PK
- `id_<base>` FK
- `<base>_detail_key` VARCHAR
- `<base>_detail_value` TEXT
- `<base>_detail_status` / `_created` / `_updated`

> Útil quando um form (via Form Builder) adiciona campos novos que ainda não viraram colunas formais.

## Convenções de naming (framework f19)

- **Tabelas** singular: `tb_<nome>` (`tb_user`, não `tb_users`).
- **PK auto-increment**: `id_<tabela>` (`id_user`, `id_project`).
- **FKs**: mesmo nome da PK na tabela referenciada (`id_company` em `tb_project`).
- **Campos**: `<tabela>_<campo>` em inglês quando possível (`user_email`, `project_color_1`).
- Exceções históricas (`project_budget_entrada` em pt-BR): tolerar; novos campos sempre em inglês.
- **Datas auto**: `<tabela>_created` / `_updated` com `DEFAULT CURRENT_TIMESTAMP [ON UPDATE]`.
- **Soft-flag**: `<tabela>_status` TINYINT(1) DEFAULT 1.
- **ENUMs**: lowercase com `_` (`em_andamento`, não `Em Andamento`).
- **Junction**: `tb_<a>_<b>` com PK composta.
- **Self-ref**: sufixo `_parent` no FK.

## Relacionamentos chave

```
tb_company  1──N  tb_project
tb_project  1──N  tb_user (via id_project default)
tb_project  N──N  tb_api  (via tb_project_api — credenciais por projeto)
tb_project  1──N  tb_project_budget
tb_project  1──N  tb_project_invoice
tb_project  1──N  tb_project_signature
tb_user     1──N  tb_workflow
tb_access   1──N  tb_user
```

## Padrão de extensão (apps separados)

Apps com banco próprio (ex: `lab2_zapi`) **não** têm FK formal pra `tb_project`:
- MySQL não suporta FK cross-database.
- Cada tabela do app que precise vincular ao projeto inclui `id_project INT NOT NULL` documentado como "referência lógica a `tb_project` (lab2_bd)".
- A integridade é mantida via aplicação (PHP valida `id_project` antes de inserir).

Lista de apps registrados está em `tb_app`. Cada um tem suas próprias credenciais (`app_db_*`).

## Aplicar / atualizar schema

SQLs core ficam em `cliki/sql/` (raíz). Apps em `cliki/sql/apps/<app>/`.

- **Tabela nova**: criar `tb_<nome>.sql` com `CREATE TABLE IF NOT EXISTS` (idempotente, pode re-rodar).
- **Alteração**: criar `alter_<tabela>_<motivo>.sql` separado. **Não editar** o `tb_*.sql` original — o histórico de mudanças mora nos `alter_*.sql`.

Convenção atualizada (ao adicionar uma coluna):

```sql
-- alter_tb_user_add_id_access.sql
ALTER TABLE tb_user ADD COLUMN id_access INT(11) NOT NULL DEFAULT 1 AFTER user_password;
```

## Volume atual (snapshot)

| Tipo | Tabelas | Linhas |
|---|---|---|
| Identidade | 3 | ~8 |
| Tenancy | 4 | ~13 |
| Catálogo | 2 | ~5 |
| Form Builder | 2 | ~17 |
| Product Builder | 5 | ~52 |
| Comercial | 8 | ~21 |
| Metadados Geo | 5 | ~18.762 |
| Segurança / Workflow | 3 | ~256 |
| **TOTAL** | **33** | **~19.130** |

> Mais de 99% das linhas estão nos metadados geográficos.

## Bancos relacionados

| Banco | Função | Doc |
|---|---|---|
| `lab2_bd` | Core / global | este arquivo |
| `lab2_zapi` | App WhatsApp (Z-API): contatos, grupos, regras de bloqueio | [readme_lab2_zapi.md](readme_lab2_zapi.md) |

## Subdomínios irmãos (no projeto f19)

Além do `global.w19.com.br/` (onde mora este banco e o core PHP), o projeto f19 tem:

| Subdomínio | Função | Doc |
|---|---|---|
| `global.w19.com.br` | Core PHP: `cliki/php/fn_*`, schemas SQL, readmes | este projeto |
| `adm.w19.com.br` | Painel administrativo (CRUD de projetos/empresas/users/workflow) | (no próprio diretório) |
| `api.w19.com.br` | **APIs reutilizáveis** consumidas por outros projetos (auth, security, z-api, payment, job) | [api.w19.com.br/README.md](../../../api.w19.com.br/README.md) |
| `lib.w19.com.br` | **Libs estáticas compartilhadas** (Litho HTML template e futuras) — single source of truth. Consumidores via `$vUrlLibLitho` / `$vUrlLibShared` | — |
| `log.w19.com.br` | **Logs agregados** de todos os projetos (`<projeto>/<api>/<subpastas>`) | [log.w19.com.br/README.md](../../../log.w19.com.br/README.md) |
| `w19.com.br` | Site público do projeto principal | — |

**Regra:** lógica de API compartilhada → `api.w19.com.br`. Logs → `log.w19.com.br`. Específico de um projeto → fica nele. Funções genéricas de PHP (mobile-detect, fn_user, etc.) → `global.w19.com.br/cliki/php/` via `ROOT_CORE`.

## Mapping `id_project` → domínio (subprojetos)

Convenção: `tb_project.id_project` é o **slug runtime** referenciado pelo `config.php` de cada subprojeto. Um `id_company` pode emprestar pra vários `id_project`.

| id_project | id_company | Nome | Path local | Domínio prod | Modelo Cliki |
|---:|---:|---|---|---|---|
| 1 | 1 | f19 | `f19/` | w19.com.br + irmãos | Complexo |
| 5 | 7 | hub2med | `hub2med/` | hub2med.com (e plataox.com.br em dev) | Complexo (api/app/zapi) |
| 6 | 8 | luasa | `luasa/` (futuro) | luasa.com.br (a confirmar) | a definir |
| 7 | 8 | cliki | `cliki/cliki.com.br/` | cliki.com.br | Simples (sem app/api) |
| 9 | 8 | now (Now Rent a Car) | `now/nowrentcar.com/` | nowrentcar.com (hoje em subpasta `site.w19.com.br/nowrentcar.com/`) | Simples |
| 10 | 11 | locafacil | `locafacil/locafacil.imb.br/` | locafacil.imb.br | Complexo (adm próprio) |

**Convenção de subpasta intermediária:** sites simples sem DNS próprio cadastrado em prod ficam em `site.w19.com.br/<dominio>/` (multitenant temporário). Ver workflow #226 (Andre, 2026-05-21).

**Modelo Cliki Simples:** sem banco/api próprios; consome `lab2_bd` + `api.w19.com.br`. Só tema + global/cliki + (opcional) adm.
**Modelo Cliki Complexo:** banco próprio (`lab2_app_<nome>`) + app subdomínio + admins customizados.

## Histórico de versões

| Data | Versão | Mudança |
|---|---|---|
| 2026-05-21 | 1.2 | Andre (#226): adicionado mapping `id_project → domínio` (6 subprojetos: f19, hub2med, luasa, cliki, now, locafacil) + convenção subpasta `site.w19.com.br/<dominio>/` |
| 2026-05-14 | 1.1 | `tb_project` ganhou 21 colunas públicas (slogan/about + endereço + contato + redes sociais). Migração copiou dados atuais de `tb_company`. Motivo: 1 empresa pode ter N projetos com identidades públicas distintas |
| 2026-05-12 | 1.0 | Documentação inicial — 33 tabelas mapeadas |
