send-gift: rediseño al original — es la tienda, pero regalando
El original lo dice en su propio texto ("los objetos disponibles son los mismos
de la tienda") y lo confirma su JS, que usa #store-list y .store-add-button: el
regalo NO tiene catálogo propio, es la tienda con el correo a otro personaje.
Nosotros teníamos una tabla aparte (home_item) con 8 objetos y precios en euros.
Ahora send-gift monta StoreBrowser en modo `gift`: mismo catálogo (3068 ítems,
PD/PV), mismo carrito con cantidades y las cuatro formas de pago. Antes NO tenía
Stripe: solo SumUp, PD y PV.
Dos pasos, como el original: primero #char-select-div (personaje de origen,
destino, confirmación y token) y solo al pulsar "Mostrar Regalos" aparece el
catálogo. Se borran SendGiftForm, /api/gift/checkout y lib/gift (ya no los usa
nadie); la tabla home_item se queda en la BD, sin usar.
Tres cosas que el usuario pidió y que estaban mal:
- El formulario va con `noValidate`: los avisos los damos nosotros en rojo
(#show-gif-response), no el navegador.
- "Mostrar Regalos" ahora valida contra el SERVIDOR (que el personaje de origen
sea tuyo, que el destino exista y que el token sea correcto). Antes elegías
objetos para descubrir al final que el destino no existía.
- BUG REAL: el nombre del destino distinguía mayúsculas. `characters.name` es
`utf8mb4_bin`, así que "innakh" NO encontraba a "Innakh" (comprobado: 0
resultados; con COLLATE, 1). `findCharacterByName` busca sin distinguir y
devuelve el nombre CANÓNICO, que es el que va al comando SOAP.
La validación vive en lib/gift-check y la usan las dos rutas: /api/gift/check (el
botón) y /api/gift/send, que revalida porque el cliente puede saltarse el paso 1.
También se quita del texto "El pago se realiza mediante SumUp": el original no lo
dice y además ya era falso con cuatro formas de pago.
Verificado: innakh / INNAKH / InNaKh resuelven a "Innakh"; token malo y destino
inexistente salen en rojo sin pasar al catálogo. Con 500 PD de saldo de prueba,
2 copias de un ítem de 200 pasan el cobro (deliveryFailed por el worldserver
caído, con su reembolso) y 3 dan insufficientPd: el servidor cobra por copias.
Datos de prueba borrados.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,8 +1,7 @@
|
||||
import { executeSoapCommand } from './soap'
|
||||
import { creditDPoints } from './dpoints'
|
||||
import { sendGiftByMail } from './gift'
|
||||
import { renameGuildBySoap, GUILD_RENAME_EUR } from './guild'
|
||||
import { fulfillStoreOrder } from './store'
|
||||
import { fulfillStoreOrder, giftMail } from './store'
|
||||
import { checkFactionChangeEligibility } from './change-faction'
|
||||
import { checkTransferEligibility } from './transfer-character'
|
||||
import {
|
||||
@@ -125,21 +124,14 @@ export const PAID_SERVICES: Record<string, PaidServiceConfig> = {
|
||||
extraFields: ['destination_account'],
|
||||
precheck: ({ accountId, email, character, body }) => checkTransferEligibility(accountId, email, character, body),
|
||||
},
|
||||
// Enviar regalo: al pagar por SumUp, envía por correo los ítems del carrito al
|
||||
// personaje destino (a un amigo). `sender` = personaje de origen; `items` = JSON
|
||||
// [{ i: item_id, q: cantidad }] que guardó el checkout en metadata.
|
||||
// Enviar regalo: es una compra de la tienda cuyo correo va a OTRO personaje y
|
||||
// dice quién lo manda. El carrito se guarda en home_store_order (order_ref) y
|
||||
// se entrega igual que la tienda, con su reembolso parcial si falla a medias.
|
||||
// `sender` = personaje de origen, para redactar el correo.
|
||||
'send-gift': {
|
||||
price: (m) => Promise.resolve(Number(m.amount)),
|
||||
productName: (c) => `Regalo para ${c}`,
|
||||
fulfill: (c, m) => {
|
||||
let items: { i: number; q: number }[] = []
|
||||
try {
|
||||
items = JSON.parse(m.items || '[]')
|
||||
} catch {
|
||||
return Promise.resolve(false)
|
||||
}
|
||||
return sendGiftByMail(c, m.sender || '', items)
|
||||
},
|
||||
fulfill: (c, m) => fulfillStoreOrder(c, m.order_ref || '', giftMail(m.sender || '')),
|
||||
extraFields: [],
|
||||
},
|
||||
// Renombrar hermandad (1000 PD = 10 €): al pagar, aplica `.guild rename`.
|
||||
|
||||
Reference in New Issue
Block a user