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": "Mostrar",
"hide": "Ocultar",
"categoryNotEmpty": "La categoría tiene foros; bórralos primero.",
"backToPanel": "← Volver al panel"
"backToPanel": "← Volver al panel",
"managePromo": "Gestionar códigos de promoción",
"promo": "Códigos de promoción",
"createPromo": "Crear código",
"promoCode": "Código",
"promoPd": "PD",
"promoPv": "PV",
"promoMaxUses": "Usos máx.",
"promoExpires": "Caduca (opcional)",
"promoActive": "Activo",
"promoUses": "Usos",
"promoRedemptions": "Canjes",
"noPromo": "No hay códigos de promoción.",
"promoDuplicate": "Ya existe un código con ese texto.",
"promoEmptyError": "Escribe el código y al menos PD o PV (con usos máx. ≥ 1)."
},
"Vote": {
"title": "Votar por nosotros",