import { MockPaymentProvider } from "./mock-provider"; // Абстракция платёжного провайдера биллинга. // Подключение реального провайдера (ЮKassa/CloudPayments) = новый класс, // реализующий PaymentProvider, + case в getPaymentProvider(). Роуты и сервис не меняются. export type PaymentStatus = 'pending' | 'succeeded' | 'canceled'; export interface CreatePaymentParams { organizationId: number; amount: number; // в основной валюте (рубли, не копейки) currency: string; idempotencyKey: string; description?: string; returnUrl?: string; metadata?: Record; } export interface PaymentCreated { externalId: string; confirmationUrl?: string; status: PaymentStatus; } export interface WebhookVerification { valid: boolean; externalId?: string; status?: PaymentStatus; idempotencyKey?: string; error?: string; } export interface PaymentStatusInfo { externalId: string; status: PaymentStatus; } export interface PaymentProvider { name: string; createPayment(params: CreatePaymentParams): Promise; verifyWebhook(headers: Record, body: unknown): WebhookVerification; getPaymentStatus(externalId: string): Promise; } export function getPaymentProviderName(): string { return (process.env.PAYMENT_PROVIDER || 'mock').trim().toLowerCase(); } export function getPaymentProvider(name: string = getPaymentProviderName()): PaymentProvider { switch (name) { case 'mock': return new MockPaymentProvider(); default: throw new Error(`Неизвестный платёжный провайдер: ${name}`); } }