<!-- BEGIN CHANGE: contexto de paridade Account (legado -> schema -> portal) -->

# Paridade Account ? legado × dump × portal

Fontes legado:
- `accountmanagement.php` (actions)
- `createaccount.php`
- `lostaccount.php`
- `namelocks.php` (`subtopic=namelock`)
- confirmacoes de e-mail (`confirmacao` / `confirmacaoo` / `confirma`) ? fluxo donate/legado; detalhar quando fechar donate

Schema: `docs/dumps/DB-new-22-07-2026_16-00-01.sql`  
Portal: `portal/api/{login,register,me,account-manage,lost-account,namelock}.php` + páginas `/account`, `/login`, `/create-account`, `/lost-account`, `/namelock`

## Schema relevante

### `accounts`
| Coluna | Uso |
|---|---|
| `name`, `password`, `salt` | Login SHA1 (`sha1(salt+pass)` ou `sha1(pass)` se salt vazio) |
| `email`, `email_new`, `email_new_time` | E-mail + pedido de troca (espera `email_days_to_change` dias) |
| `email_code`, `next_email` | Lost Account (código + rate limit) |
| `key` | Recovery key (`0` / vazio = sem RK) |
| `rlname`, `location` | Info pública |
| `page_access` | ACL site (`>= 6` admin panel) |
| `premium_points`, `backup_points`, `premdays`, `lastday`, `vip_time` | Pontos / premium |
| `created`, `blocked`, `warnings` | Meta |

### `players` (conta)
| Coluna | Uso |
|---|---|
| `account_id`, `deleted` | Soft-delete de char |
| `comment` | Comentário no perfil |
| `old_name`, `nick_verify` | Proposta de nick / namelock |
| `online` | Bloqueia delete se online |
| look*/level/vocation/promotion | Listagem |

### `bans`
- `type = 2` = namelock; `value` = player id; `active = 1`

### Config (`config.php`)
- `email_days_to_change` = 2
- `email_lai_sec_interval` = 180
- `max_players_per_account` = 100
- `generate_reckey` / `generate_new_reckey` / preço PP
- `send_emails` + SMTP (mail_lib)

## Checklist `accountmanagement.php`

| Action | Portal | Status |
|---|---|---|
| `''` / `manage` overview | `/account` + `me.php` | nesta rodada (expandido) |
| `logout` | Auth client | OK |
| `changepassword` | `account-manage` | nesta rodada |
| `changeemail` (request/accept/cancel) | `account-manage` | nesta rodada |
| `changeinfo` (rlname/location) | `account-manage` | nesta rodada |
| `registeraccount` (1ª RK) | `account-manage` | nesta rodada |
| `newreckey` (RK paga com PP) | `account-manage` | nesta rodada |
| `createcharacter` | `account-manage` (+ já em register) | nesta rodada |
| `deletecharacter` / `undelete` | `account-manage` | nesta rodada |
| `changecomment` | `account-manage` | nesta rodada |
| `newnick` (proposta namelock) | `account-manage` | nesta rodada |
| `playerinvite` / `invitefriendsend` | ? | PENDENTE (baixo uso) |

## Checklist create / lost / namelock

| Fluxo | Portal | Status |
|---|---|---|
| `createaccount` | `/create-account` + `register.php` | OK (gaps menores ok) |
| `lostaccount` e-mail code | `/lost-account` + `lost-account.php` | nesta rodada |
| `lostaccount` recovery key | idem | nesta rodada |
| `namelock` admin accept/reject | `/namelock` + `namelock.php` | nesta rodada (`page_access` > 0 como legado) |

## Fora desta rodada (ainda Account-adjacente)

- Páginas `confirmacao*` ligadas a **donate** ? fechar com `parity-donate.md` (ÚLTIMO)
- E-mail opcional ao trocar senha / gerar RK (tentar via `mail_lib`; falha não bloqueia ação se legado também tolera)

## Regras espelho

- Senha: alfanumérico, len típica legado (`check_password`)
- Delete char: senha da conta + char offline + soft `deleted=1`
- RK: `key` vazio/`0`/`'0'` = sem registro; gerar 20 chars `[A-Z0-9]` sem O
- Troca e-mail: grava `email_new` + `email_new_time = now + days*86400`; aceitar só após; cancelar zera
- Namelock player: set `old_name` = proposta; admin accept troca `name`?`old_name`, `nick_verify=1`, desativa ban type 2

<!-- END CHANGE -->
