From a735c063abea8f506db1edc05c807e1d8eb7bca1 Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Sun, 8 Mar 2026 22:13:32 +0100 Subject: [PATCH] Add trial rollout date fallback --- apps/api/src/__tests__/helpers/billing.test.ts | 16 ++++++++++++++++ apps/api/src/helpers/billing.ts | 13 +++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/apps/api/src/__tests__/helpers/billing.test.ts b/apps/api/src/__tests__/helpers/billing.test.ts index fc2f934..c43a874 100644 --- a/apps/api/src/__tests__/helpers/billing.test.ts +++ b/apps/api/src/__tests__/helpers/billing.test.ts @@ -3,9 +3,25 @@ import { getBillableMemberCount, getOrganizationOwner, getTrialWindow, + parseTrialRolloutDate, } from "../../helpers/billing.js"; describe("billing helpers", () => { + it("falls back to default rollout date when env value is missing", () => { + const rolloutAt = parseTrialRolloutDate(undefined); + expect(rolloutAt?.toISOString()).toBe("2026-03-08T00:00:00.000Z"); + }); + + it("falls back to default rollout date when env value is invalid", () => { + const rolloutAt = parseTrialRolloutDate("not-a-date"); + expect(rolloutAt?.toISOString()).toBe("2026-03-08T00:00:00.000Z"); + }); + + it("uses configured rollout date when env value is valid", () => { + const rolloutAt = parseTrialRolloutDate("2026-03-10T00:00:00.000Z"); + expect(rolloutAt?.toISOString()).toBe("2026-03-10T00:00:00.000Z"); + }); + it("returns the earliest organization member as billing owner", () => { const owner = getOrganizationOwner([ { diff --git a/apps/api/src/helpers/billing.ts b/apps/api/src/helpers/billing.ts index 5bcaf63..0e043d4 100644 --- a/apps/api/src/helpers/billing.ts +++ b/apps/api/src/helpers/billing.ts @@ -55,6 +55,7 @@ export type OrganizationBillingState = { const ACTIVE_BILLING_STATUSES = ["active", "trialing", "past_due"]; const DEFAULT_BILLING_TRIAL_DAYS = 14; +const DEFAULT_BILLING_TRIAL_ROLLOUT_AT = "2026-03-08T00:00:00.000Z"; const parseTrialDays = () => { const parsed = Number.parseInt(process.env.BILLING_TRIAL_DAYS ?? "", 10); @@ -65,15 +66,19 @@ const parseTrialDays = () => { return parsed; }; -const parseTrialRolloutDate = () => { - const raw = process.env.BILLING_TRIAL_ROLLOUT_AT; +export const parseTrialRolloutDate = ( + rawInput: string | null | undefined = process.env.BILLING_TRIAL_ROLLOUT_AT +) => { + const raw = rawInput?.trim(); + const fallback = new Date(DEFAULT_BILLING_TRIAL_ROLLOUT_AT); + if (!raw) { - return null; + return fallback; } const parsed = new Date(raw); if (Number.isNaN(parsed.getTime())) { - return null; + return fallback; } return parsed;