import { JsonApiDataInterface, JsonApiService } from "../../../core/jsonapi"; import { StripeCustomerRepository } from "../../stripe-customer/repositories/stripe-customer.repository"; import { StripeCustomerApiService } from "../../stripe-customer/services/stripe-customer-api.service"; import { StripePriceRepository } from "../../stripe-price/repositories/stripe-price.repository"; import { StripePaymentService } from "../../stripe/services/stripe.payment.service"; import { StripeSubscriptionStatus } from "../entities/stripe-subscription.entity"; import { StripeSubscriptionRepository } from "../repositories/stripe-subscription.repository"; import { StripeSubscriptionApiService } from "./stripe-subscription-api.service"; export interface CreateSubscriptionResult { data: JsonApiDataInterface; clientSecret: string | null; paymentIntentId: string | null; requiresAction: boolean; } /** * StripeSubscriptionAdminService * * Manages subscription lifecycle for billing customers, coordinating between Stripe and the local database. * Provides comprehensive subscription management including creation, cancellation, pausing, resuming, * plan changes, and proration previews. * * Key Features: * - Create subscriptions with optional trials and custom quantities * - Cancel subscriptions (immediately or at period end) * - Pause and resume subscriptions * - Change subscription plans with automatic proration * - Preview proration amounts before plan changes * - Sync subscription data from Stripe webhooks * - Filter subscriptions by status (active, canceled, past_due, etc.) * * All operations update both Stripe and the local Neo4j database to maintain consistency. */ export declare class StripeSubscriptionAdminService { private readonly subscriptionRepository; private readonly stripeCustomerRepository; private readonly stripePriceRepository; private readonly stripeSubscriptionApiService; private readonly stripeCustomerApiService; private readonly stripePaymentService; private readonly jsonApiService; constructor(subscriptionRepository: StripeSubscriptionRepository, stripeCustomerRepository: StripeCustomerRepository, stripePriceRepository: StripePriceRepository, stripeSubscriptionApiService: StripeSubscriptionApiService, stripeCustomerApiService: StripeCustomerApiService, stripePaymentService: StripePaymentService, jsonApiService: JsonApiService); /** * List subscriptions for a company * * @param params - Parameters * @param params.companyId - Company identifier * @param params.query - JSON:API query parameters for pagination * @param params.status - Optional filter by subscription status * @returns JSON:API formatted list of subscriptions * @throws {HttpException} NOT_FOUND if billing customer not found * * @example * ```typescript * const subscriptions = await subscriptionService.listSubscriptions({ * companyId: 'company_123', * query: { page: { number: 1, size: 10 } }, * status: 'active' * }); * ``` */ listSubscriptions(params: { companyId: string; query: any; status?: StripeSubscriptionStatus; }): Promise; /** * Get a single subscription by ID * * @param params - Parameters * @param params.id - Subscription ID * @param params.companyId - Company identifier * @returns JSON:API formatted subscription data * @throws {HttpException} NOT_FOUND if subscription not found * @throws {HttpException} FORBIDDEN if subscription doesn't belong to company */ getSubscription(params: { id: string; companyId: string; }): Promise; /** * Create a new subscription * * @param params - Subscription parameters * @param params.companyId - Company identifier * @param params.priceId - Price ID to subscribe to * @param params.paymentMethodId - Optional payment method ID * @param params.trialPeriodDays - Optional trial period in days (ignored if trialEnd is set) * @param params.trialEnd - Optional Unix timestamp for trial end (takes precedence over trialPeriodDays) * @param params.quantity - Optional quantity (default: 1) * @returns JSON:API formatted subscription data * @throws {HttpException} NOT_FOUND if customer or price not found * @throws {HttpException} PAYMENT_REQUIRED (402) if no payment methods exist * * @example * ```typescript * const subscription = await subscriptionService.createSubscription({ * companyId: 'company_123', * priceId: 'price_456', * paymentMethodId: 'pm_789', * trialPeriodDays: 14 * }); * ``` */ createSubscription(params: { companyId: string; priceId: string; paymentMethodId?: string; trialPeriodDays?: number; trialEnd?: number; quantity?: number; promotionCode?: string; }): Promise; /** * Cancel a subscription * * @param params - Parameters * @param params.id - Subscription ID * @param params.companyId - Company identifier * @param params.cancelImmediately - If true, cancel immediately; if false, cancel at period end * @returns JSON:API formatted updated subscription data * @throws {HttpException} NOT_FOUND if subscription not found * @throws {HttpException} FORBIDDEN if subscription doesn't belong to company * * @example * ```typescript * // Cancel at end of billing period * const subscription = await subscriptionService.cancelSubscription({ * id: 'sub_123', * companyId: 'company_123', * cancelImmediately: false * }); * ``` */ cancelSubscription(params: { id: string; companyId: string; cancelImmediately?: boolean; }): Promise; /** * Pause a subscription * * @param params - Parameters * @param params.id - Subscription ID * @param params.companyId - Company identifier * @param params.resumeAt - Optional date to automatically resume * @returns JSON:API formatted updated subscription data * @throws {HttpException} NOT_FOUND if subscription not found * @throws {HttpException} FORBIDDEN if subscription doesn't belong to company */ pauseSubscription(params: { id: string; companyId: string; resumeAt?: Date; }): Promise; /** * Resume a paused subscription * * @param params - Parameters * @param params.id - Subscription ID * @param params.companyId - Company identifier * @returns JSON:API formatted updated subscription data * @throws {HttpException} NOT_FOUND if subscription not found * @throws {HttpException} FORBIDDEN if subscription doesn't belong to company */ resumeSubscription(params: { id: string; companyId: string; }): Promise; /** * Change subscription plan * * Updates the subscription to a new price with automatic proration. * * @param params - Parameters * @param params.id - Subscription ID * @param params.companyId - Company identifier * @param params.newPriceId - New price ID to switch to * @returns JSON:API formatted updated subscription data * @throws {HttpException} NOT_FOUND if subscription or price not found * @throws {HttpException} FORBIDDEN if subscription doesn't belong to company * * @example * ```typescript * const subscription = await subscriptionService.changePlan({ * id: 'sub_123', * companyId: 'company_123', * newPriceId: 'price_premium' * }); * ``` */ changePlan(params: { id: string; companyId: string; newPriceId: string; promotionCode?: string; }): Promise; /** * Preview proration for plan change * * Calculates the proration amount for changing to a new price without actually making the change. * * @param params - Parameters * @param params.id - Subscription ID * @param params.companyId - Company identifier * @param params.newPriceId - New price ID to preview * @returns Proration preview with amounts and line items * @throws {HttpException} NOT_FOUND if subscription or price not found * @throws {HttpException} FORBIDDEN if subscription doesn't belong to company * * @example * ```typescript * const preview = await subscriptionService.previewProration({ * id: 'sub_123', * companyId: 'company_123', * newPriceId: 'price_premium' * }); * console.info(`Proration amount: ${preview.amountDue}`); * ``` */ previewProration(params: { id: string; companyId: string; newPriceId: string; }): Promise; /** * Sync subscription data from Stripe to local database * * Fetches the latest subscription data from Stripe and updates the local database record. * Used primarily by webhook handlers to keep subscription data in sync. * * @param params - Parameters * @param params.stripeSubscriptionId - Stripe subscription ID to sync * @returns Promise that resolves when sync is complete * * @example * ```typescript * // Called from webhook handler * await subscriptionService.syncSubscriptionFromStripe({ * stripeSubscriptionId: 'sub_1234567890' * }); * ``` */ syncSubscriptionFromStripe(params: { stripeSubscriptionId: string; }): Promise; /** * Create a one-time purchase using PaymentIntent flow * * Unlike recurring subscriptions, one-time purchases: * - Use PaymentIntent API instead of Subscription API * - Don't block or get blocked by existing subscriptions * - Store as StripeSubscription record with PaymentIntent ID * * @param params - Purchase parameters * @returns CreateSubscriptionResult with purchase data */ private createOneTimePurchase; } //# sourceMappingURL=stripe-subscription-admin.service.d.ts.map