Skip to content

Commit a4aaf29

Browse files
authored
Update Codex ChatGPT Business subscription pricing (#126)
1 parent ba82f2c commit a4aaf29

2 files changed

Lines changed: 42 additions & 2 deletions

File tree

CopilotMonitor/CopilotMonitor/Models/SubscriptionSettings.swift

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ struct ProviderSubscriptionPresets {
105105
static let codex: [SubscriptionPreset] = [
106106
SubscriptionPreset(name: "Go", cost: 8),
107107
SubscriptionPreset(name: "Plus", cost: 20),
108-
SubscriptionPreset(name: "Team", cost: 30),
108+
SubscriptionPreset(name: "Business", cost: 25),
109109
SubscriptionPreset(name: "Pro", cost: 200)
110110
]
111111

@@ -228,7 +228,12 @@ final class SubscriptionSettingsManager {
228228
let plan = try? JSONDecoder().decode(SubscriptionPlan.self, from: data) else {
229229
return .none
230230
}
231-
return plan
231+
let normalizedPlan = normalizeLegacyPlan(plan, forKey: key)
232+
if normalizedPlan != plan {
233+
NSLog("Migrated legacy ChatGPT Team subscription preset to Business for key '%@'", fullKey)
234+
setPlan(normalizedPlan, forKey: key)
235+
}
236+
return normalizedPlan
232237
}
233238

234239
func getPlan(for provider: ProviderIdentifier, accountId: String? = nil) -> SubscriptionPlan {
@@ -284,4 +289,19 @@ final class SubscriptionSettingsManager {
284289
}
285290
return false
286291
}
292+
293+
private func normalizeLegacyPlan(_ plan: SubscriptionPlan, forKey key: String) -> SubscriptionPlan {
294+
let isCodexSubscription = key == ProviderIdentifier.codex.rawValue
295+
|| key.hasPrefix("\(ProviderIdentifier.codex.rawValue).")
296+
guard isCodexSubscription else {
297+
return plan
298+
}
299+
300+
guard case .preset(let name, _) = plan,
301+
name.caseInsensitiveCompare("Team") == .orderedSame else {
302+
return plan
303+
}
304+
305+
return .preset("Business", 25)
306+
}
287307
}

CopilotMonitor/CopilotMonitorTests/ProviderUsageTests.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,26 @@ final class ProviderUsageTests: XCTestCase {
211211
XCTAssertTrue(output.contains("1%,1%"))
212212
}
213213

214+
func testCodexSubscriptionPresetsUseBusinessMonthlyPrice() {
215+
let presets = ProviderSubscriptionPresets.presets(for: .codex)
216+
217+
XCTAssertTrue(presets.contains { $0.name == "Business" && $0.cost == 25 })
218+
XCTAssertFalse(presets.contains { $0.name == "Team" })
219+
}
220+
221+
func testSubscriptionSettingsMigratesLegacyCodexTeamPreset() {
222+
let manager = SubscriptionSettingsManager.shared
223+
let key = "codex.subscription-settings-migration-test"
224+
defer { manager.removePlan(forKey: key) }
225+
226+
manager.setPlan(.preset("Team", 30), forKey: key)
227+
228+
let migratedPlan = manager.getPlan(forKey: key)
229+
230+
XCTAssertEqual(migratedPlan, .preset("Business", 25))
231+
XCTAssertEqual(manager.getPlan(forKey: key), .preset("Business", 25))
232+
}
233+
214234
func testTableFormatterShowsGeminiPercentOnlyForGeminiAccounts() {
215235
let geminiAccounts = [
216236
GeminiAccountQuota(

0 commit comments

Comments
 (0)