Brunei clubs on TPS need a manual bank transfer payment method. Users book a court, see the club's bank details, transfer manually, and await admin confirmation within 1 hour or the booking auto-cancels.
New club_bank_transfer_details table. New bank_transfer_expires_at column on bookings. New system_payment_methods record.
confirm-pay-booking-v2 updated. Two new functions: admin-confirm-bank-transfer and auto-cancel-bank-transfer.
New BankTransferPaymentMethod class. New BankTransferDetailsScreen with 1h countdown and copy-to-clipboard. Feature flagged.
pg_cron schedule every 5 min — queries pending bank_transfer bookings past expiry and auto-cancels with push notification to user.
paymentType: "bank_transfer" — no Stripe PaymentIntent needed. Booking status set to "pending", bank_transfer_expires_at = NOW() + 1hadmin-confirm-bank-transfer → booking status → "confirmed", payment_details success=true, existing post-confirmation flow triggered-- New table: one row per club CREATE TABLE club_bank_transfer_details ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), club_id uuid REFERENCES clubs(id), bank_name text NOT NULL, account_number text NOT NULL, account_holder text NOT NULL, instructions text, created_at timestamptz DEFAULT now() ); -- New column on bookings ALTER TABLE bookings ADD COLUMN bank_transfer_expires_at timestamptz; -- New system payment method INSERT INTO system_payment_methods (code, name) VALUES ('bank_transfer', 'Bank Transfer');
paymentType: "bank_transfer" in request body (no paymentMethodId required)handleBankTransferPayment() in bookingRepository.ts"pending", bank_transfer_expires_at = NOW() + 1hclub_bank_transfer_details in response"bank_transfer", success=falsebookingId"confirmed", payment_details success → true, clears bank_transfer_expires_atprocess-new-confirmed-booking for post-confirmation flow (match creation, notifications)"cancelled" or already "confirmed""pending" AND type="bank_transfer" AND bank_transfer_expires_at < NOW()"cancelled", sends push notification to user"confirmed" bookings — query filters on "pending" onlySELECT cron.schedule( 'auto-cancel-bank-transfer', '*/5 * * * *', $$SELECT net.http_post( url:='https://<project-ref>.functions.supabase.co/auto-cancel-bank-transfer', headers:='{"Content-Type": "application/json"}'::jsonb, body:='{}'::jsonb ) AS request_id;$$ );
BankTransferPaymentMethod in payment_methods_response.dart — analogous to PromptPaymentMethodBankTransferDetailsScreen — shows bank name, account number (copyable), account holder, total amount, 1h countdown, booking IDbooking_detail_controller.dart — when BankTransferPaymentMethod selected, calls confirmPayBooking with paymentType: "bank_transfer" (no paymentMethodId) → navigates to BankTransferDetailsScreentps-XXX-brunei-bank-transfer gates option in getUserPaymentMethods() — off by default globally