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

# Paridade Guilds ? legado × dump × portal

Fonte legado: `guilds.php` (+ `wars.php` / `guildwar.php` para wars)  
Schema: `docs/dumps/DB-new-22-07-2026_16-00-01.sql` (`ot_new`)  
Portal: `portal/api/guild*.php`, `wars.php`, `guild-admin.php` + `portal/src/app/guild(s)/`, `wars/`

## Schema relevante

| Tabela | Uso |
|---|---|
| `guilds` | id, world_id, name, ownerid, creationdata, checkdata, motd, balance, description, logo_gfx_name, real_castle, favela |
| `guild_ranks` | id, guild_id, name, **level** (na prática: **3=Leader, 2=Vice, 1=Member** ? o COMMENT do dump está invertido) |
| `guild_invites` | player_id, guild_id (UNIQUE) |
| `guild_wars` | guild_id (agressor), enemy_id, begin/end, frags, payment, guild_kills, enemy_kills, status |
| `guild_kills` | guild_id, war_id, death_id ? `player_deaths` + `killers`/`player_killers` |
| `players.rank_id` | FK lógica para `guild_ranks.id` (0 = sem guild) |
| `players.guildnick` | nick na guild |
| `accounts.page_access` | admin site; `>= 6` = `access_admin_panel` |

Triggers (dump):
- `oncreate_guilds` ? cria ranks Leader(3), Vice-Leader(2), Member(1)
- `ondelete_guilds` ? zera `rank_id`/`guildnick` dos membros

Config site (`config.php`):
- `guild_need_level` = **150**
- `guild_need_pacc` = **0**
- `guild_image_size_kb` = **5000**
- `access_admin_panel` = **6**

## Checklist de actions (`guilds.php`)

| Action legado | Portal | Status |
|---|---|---|
| `''` listagem | `/guilds` + `guilds.php` | OK |
| `show` ficha + membros + invites | `/guild` + `guild.php` | OK + stats + wars |
| `invite` | `guild-manage` invite | OK |
| `deleteinvite` | cancel_invite | OK |
| `acceptinvite` | accept_invite | OK |
| `kickplayer` | kick | OK |
| `changerank` | set_member_rank | OK |
| `change_nick` | set_guild_nick (próprio + dono) | OK |
| `manager` + logo/desc/motd/ranks | UI manage + update/logo/manage | OK |
| `passleadership` | pass_leadership | OK |
| `deleteguild` | delete_guild | OK |
| `leaveguild` | leave_guild | OK |
| `createguild` | `guild-create.php` | OK |
| `deletebyadmin` | `guild-admin` deletebyadmin (`page_access` >= 6) | OK |
| `cleanup_players` | `guild-admin` cleanup_players | OK |
| `cleanup_guilds` | `guild-admin` cleanup_guilds **+ automatico em** `guilds.php` (lista) | OK |
| `login` embutido | Auth portal | N/A |

## Wars (legado `wars.php` / `guildwar.php`)

| Feature | Portal | Status |
|---|---|---|
| Lista global + comandos `/war` | `/wars` + `api/wars.php` | OK |
| Wars da guild (agressor ou inimigo) | bloco em `/guild` via `guild.php` | OK |
| Detalhes/frags (`guild_kills`) | expandível no `GuildWarsList` | OK |
| Criar/aceitar/cancelar war pela web | N/A no legado (só in-game) | N/A |

## Regras de permissão (espelho legado)

| Capacidade | Quem |
|---|---|
| Manage (logo, desc, MOTD, ranks CRUD, pass, delete) | `guilds.ownerid` na conta |
| Invite / cancel invite | owner **ou** rank level > 1 |
| Kick | owner **ou** rank level ? 3 |
| Change member rank | owner **ou** rank level > 1 (só alvos com level menor) |
| Guild nick | próprio char **ou** owner (qualquer membro) |
| Leave | próprio char membro, **não** o owner |
| Create | logado; char sem guild; level ? 150; PACC se config=1 |
| deletebyadmin | `page_access` ? 6 |
| cleanup_players | qualquer logado (admin = todos os chars; senão = chars da conta); sempre limpa `guild_invites` |
| cleanup_guilds | qualquer logado; apaga guilds cujo owner não é membro da guild |

## Notas

- Pass leadership não altera automaticamente o `rank_id` do novo owner (igual legado: só `ownerid`)
- `waDeleteGuild()` centraliza delete (owner, admin, cleanup)

<!-- END CHANGE -->
