Files
geo/server/migrations/20260529170000_refund_terminal_media_supply_orders.up.sql
T

89 lines
2.4 KiB
SQL
Raw Normal View History

WITH terminal_orders AS (
SELECT id,
tenant_id,
user_id,
wallet_debit_cents,
title,
error_message
FROM media_supply_orders
WHERE supplier = 'meijiequan'
AND status IN ('queued', 'submitting')
AND wallet_debited_at IS NOT NULL
AND wallet_refunded_at IS NULL
AND wallet_debit_cents > 0
AND deleted_at IS NULL
AND (
error_message ILIKE 'failed to refresh supplier price%'
OR error_message ILIKE 'meijiequan create order failed:%'
OR error_message ILIKE 'supplier cost increased above locked sell price%'
)
),
wallet_snapshot AS (
SELECT o.*,
w.balance_cents AS balance_before,
SUM(o.wallet_debit_cents) OVER (
PARTITION BY o.tenant_id, o.user_id
ORDER BY o.id
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS running_refund
FROM terminal_orders o
JOIN media_supply_user_wallets w
ON w.tenant_id = o.tenant_id
AND w.user_id = o.user_id
),
refund_totals AS (
SELECT tenant_id,
user_id,
SUM(wallet_debit_cents) AS total_refund
FROM terminal_orders
GROUP BY tenant_id, user_id
),
updated_wallets AS (
UPDATE media_supply_user_wallets w
SET balance_cents = w.balance_cents + rt.total_refund,
updated_at = NOW()
FROM refund_totals rt
WHERE w.tenant_id = rt.tenant_id
AND w.user_id = rt.user_id
RETURNING w.tenant_id, w.user_id
),
updated_orders AS (
UPDATE media_supply_orders o
SET status = 'failed',
wallet_refunded_at = NOW(),
next_attempt_at = NOW(),
updated_at = NOW()
FROM terminal_orders t
WHERE o.id = t.id
RETURNING o.id
),
updated_items AS (
UPDATE media_supply_order_items i
SET status = 'failed',
updated_at = NOW()
FROM terminal_orders t
WHERE i.order_id = t.id
AND i.status IN ('queued', 'submitting')
RETURNING i.id
)
INSERT INTO media_supply_wallet_ledgers (
tenant_id,
user_id,
order_id,
delta_cents,
balance_after_cents,
reason,
note,
created_by
)
SELECT ws.tenant_id,
ws.user_id,
ws.id,
ws.wallet_debit_cents,
ws.balance_before + ws.running_refund,
'order_refund',
COALESCE(NULLIF(ws.error_message, ''), ws.title),
ws.user_id
FROM wallet_snapshot ws
JOIN updated_orders uo ON uo.id = ws.id;