Files
NovaWoW/sql/battlepay_sumup.sql
Inna 0fef9ac35b Integra Battlepay con SumUp (órdenes battlepay_orders)
- pagos_sumup.py: crear_checkout_battlepay(reference,...) y obtener_checkout()
- battlepay_view: lista las órdenes PENDING de la cuenta de juego
- battlepay_pay_view: crea checkout SumUp para una orden concreta (checkout_reference=reference)
- sumup_webhook: marca la orden PAID (valida estado contra la API de SumUp si falta)
- plantillas account/battlepay.html y partials/pago_sumup.html
- sql/battlepay_sumup.sql (tablas battlepay_orders/battlepay_price) y docs actualizados

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 16:48:16 +00:00

47 lines
2.7 KiB
SQL

-- ───────────────────────────────────────────────────────────────────────────
-- Battlepay nativo → pasarela SumUp (NovaWeb)
-- Se aplica sobre la base de datos `auth` (LoginDatabase).
--
-- Flujo:
-- 1) El jugador pulsa "Comprar" en la tienda nativa del cliente.
-- 2) El worldserver (SendMakePurchase) busca el producto en `battlepay_price`.
-- Si tiene precio en €, crea una orden PENDING aquí y NO exige puntos.
-- 3) El cliente abre /login/sso → /es/checkout (NovaWeb) y paga con SumUp.
-- 4) NovaWeb marca la orden PAID (creditPaymentIfPaid).
-- 5) El worldserver (BattlepayManager::Update) ve la orden PAID del jugador
-- conectado y la entrega con ProcessDelivery → la marca DELIVERED.
-- ───────────────────────────────────────────────────────────────────────────
-- Órdenes de compra (las escribe el worldserver, las lee/actualiza NovaWeb).
CREATE TABLE IF NOT EXISTS `battlepay_orders` (
`id` INT NOT NULL AUTO_INCREMENT,
`reference` VARCHAR(64) NOT NULL,
`account_id` INT NOT NULL, -- auth.account.id (cuenta de juego)
`product_id` INT NOT NULL, -- Battlepay ProductID nativo
`product_name` VARCHAR(120) NOT NULL DEFAULT '',
`price_eur` DECIMAL(10,2) NOT NULL DEFAULT 0,
`status` VARCHAR(16) NOT NULL DEFAULT 'PENDING', -- PENDING | PAID | DELIVERED
`created_at` INT NOT NULL,
`paid_at` INT NULL,
`delivered_at` INT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uk_reference` (`reference`),
KEY `idx_account_status` (`account_id`, `status`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Mapa producto nativo → precio real en €. Si un ProductID NO está aquí (o
-- enabled=0), el worldserver usa el flujo clásico de puntos para ese producto.
CREATE TABLE IF NOT EXISTS `battlepay_price` (
`product_id` INT NOT NULL,
`product_name` VARCHAR(120) NOT NULL DEFAULT '',
`price_eur` DECIMAL(10,2) NOT NULL DEFAULT 0,
`enabled` TINYINT(1) NOT NULL DEFAULT 1,
PRIMARY KEY (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- Ejemplo (ajusta product_id al de tu tienda nativa):
INSERT INTO `battlepay_price` (`product_id`, `product_name`, `price_eur`, `enabled`)
VALUES (54811, 'Corcel Celestial', 5.00, 1)
ON DUPLICATE KEY UPDATE `product_name`=VALUES(`product_name`), `price_eur`=VALUES(`price_eur`);