Files
hotelsync/backend/migrations/065_payment_gateways.sql
HotelSync 6859817bdf feat: centralized payment gateways + booking widget API
Backend:
- Migration 065: hotel_payment_gateways table (migrates YooKassa from deposit_settings)
- online_bookings table for widget submissions
- Routes: CRUD /api/hotels/:slug/payment-gateways
- Public widget API: /api/widget/:slug/{config,availability,bookings}
- yookassa.ts: add createCharge() for immediate capture

Frontend:
- PaymentSettingsPage: add 'Онлайн-оплата' section with gateway CRUD and module toggles
- DepositSettingsPage: replace YooKassa fields with link to centralized settings
- BookingWidgetPage: connect to real API, show gateway status, real booking submit
- api.ts: add PaymentGateway types, paymentGateways and widget API methods

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-06 20:37:06 +03:00

53 lines
2.1 KiB
SQL

-- Centralized payment gateways (replaces per-module YooKassa config)
CREATE TABLE IF NOT EXISTS hotel_payment_gateways (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotel_id UUID NOT NULL REFERENCES hotels(id) ON DELETE CASCADE,
provider TEXT NOT NULL DEFAULT 'yookassa', -- yookassa | stripe | tinkoff
label TEXT NOT NULL DEFAULT 'ЮКасса',
shop_id TEXT,
secret_key TEXT,
currency TEXT NOT NULL DEFAULT 'RUB',
is_active BOOLEAN NOT NULL DEFAULT true,
-- Which modules use this gateway (JSON array)
modules JSONB NOT NULL DEFAULT '["deposit","booking-widget","room-service"]'::jsonb,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- Migrate existing YooKassa credentials from hotel_deposit_settings
INSERT INTO hotel_payment_gateways (hotel_id, provider, label, shop_id, secret_key, currency, modules)
SELECT
hotel_id,
'yookassa',
'ЮКасса',
yookassa_shop_id,
yookassa_secret_key,
'RUB',
'["deposit","booking-widget","room-service"]'::jsonb
FROM hotel_deposit_settings
WHERE yookassa_shop_id IS NOT NULL
ON CONFLICT DO NOTHING;
-- Online bookings table (from widget)
CREATE TABLE IF NOT EXISTS online_bookings (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
hotel_id UUID NOT NULL REFERENCES hotels(id) ON DELETE CASCADE,
room_id UUID REFERENCES rooms(id) ON DELETE SET NULL,
guest_name TEXT NOT NULL,
guest_email TEXT,
guest_phone TEXT,
check_in DATE NOT NULL,
check_out DATE NOT NULL,
adults INTEGER NOT NULL DEFAULT 1,
children INTEGER NOT NULL DEFAULT 0,
total_amount NUMERIC(12,2) NOT NULL DEFAULT 0,
notes TEXT,
services JSONB DEFAULT '[]'::jsonb,
status TEXT NOT NULL DEFAULT 'pending', -- pending | paid | confirmed | cancelled
payment_method TEXT DEFAULT 'none', -- none | yookassa
yookassa_payment_id TEXT,
yookassa_confirmation_url TEXT,
yookassa_status TEXT,
booking_id UUID REFERENCES bookings(id) ON DELETE SET NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);