web-next: herramientas de PD (transferir, comercio, códigos de promoción)

- /transfer-d-points: transferir PD a la cuenta dueña de un personaje
  (requiere token de seguridad; movimiento atómico con FOR UPDATE).
- /trade-points: comercio PD<->oro mediante códigos de 1 solo uso
  (contraseña + token + Turnstile; oro al creador por SOAP; expira 1h;
  lock de 5s tras canjear; rollback total si falla la entrega).
- /promo-code: canje de códigos por PD/PV (sensibles a mayúsculas/minúsculas,
  usos limitados, 1 canje por cuenta).
- /admin/promo: panel para crear / editar / activar / desactivar / borrar
  códigos de promoción.
- Tablas nuevas (sql/): home_tradecode, home_promocode, home_promoredemption.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 09:27:11 +00:00
parent 22ae0ee278
commit 66d056c04b
25 changed files with 1711 additions and 2 deletions
+15 -1
View File
@@ -482,7 +482,21 @@
"show": "Show",
"hide": "Hide",
"categoryNotEmpty": "Category has forums; delete them first.",
"backToPanel": "← Back to panel"
"backToPanel": "← Back to panel",
"managePromo": "Manage promo codes",
"promo": "Promo codes",
"createPromo": "Create code",
"promoCode": "Code",
"promoPd": "PD",
"promoPv": "PV",
"promoMaxUses": "Max uses",
"promoExpires": "Expires (optional)",
"promoActive": "Active",
"promoUses": "Uses",
"promoRedemptions": "Redemptions",
"noPromo": "No promo codes.",
"promoDuplicate": "A code with that text already exists.",
"promoEmptyError": "Enter the code and at least PD or PV (with max uses ≥ 1)."
},
"Vote": {
"title": "Vote for us",