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; }