50 lines
1.5 KiB
TypeScript
50 lines
1.5 KiB
TypeScript
import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm';
|
|
|
|
export const SubscriptionStatus = {
|
|
TRIALING: 'trialing',
|
|
ACTIVE: 'active',
|
|
PAST_DUE: 'past_due',
|
|
CANCELLED: 'cancelled',
|
|
EXPIRED: 'expired',
|
|
} as const;
|
|
export type SubscriptionStatus = typeof SubscriptionStatus[keyof typeof SubscriptionStatus];
|
|
|
|
@Entity({ name: 'billing_subscriptions', schema: 'public' })
|
|
export class Subscription {
|
|
@PrimaryGeneratedColumn('uuid')
|
|
id!: string;
|
|
|
|
@Column({ name: 'tenant_id', type: 'uuid' })
|
|
tenantId!: string;
|
|
|
|
@Column({ name: 'plan_id', type: 'uuid' })
|
|
planId!: string;
|
|
|
|
@Column({ type: 'varchar', length: 20, default: 'trialing' })
|
|
status!: SubscriptionStatus;
|
|
|
|
@Column({ name: 'current_period_start', type: 'timestamptz' })
|
|
currentPeriodStart!: Date;
|
|
|
|
@Column({ name: 'current_period_end', type: 'timestamptz' })
|
|
currentPeriodEnd!: Date;
|
|
|
|
@Column({ name: 'trial_ends_at', type: 'timestamptz', nullable: true })
|
|
trialEndsAt?: Date;
|
|
|
|
@Column({ name: 'cancelled_at', type: 'timestamptz', nullable: true })
|
|
cancelledAt?: Date;
|
|
|
|
@Column({ name: 'cancel_at_period_end', type: 'boolean', default: false })
|
|
cancelAtPeriodEnd!: boolean;
|
|
|
|
@Column({ name: 'next_plan_id', type: 'uuid', nullable: true })
|
|
nextPlanId?: string; // for scheduled downgrades
|
|
|
|
@CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
|
|
createdAt!: Date;
|
|
|
|
@UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
|
|
updatedAt!: Date;
|
|
}
|