0fef9ac35b
- 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>
47 lines
2.7 KiB
SQL
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`);
|