it0/packages/services/billing-service/src/domain/entities/subscription.entity.ts

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