Skip to content

Commit db02299

Browse files
fix(chargebee): Handle addon ids per billing period (#7108)
1 parent 3e3be2e commit db02299

File tree

3 files changed

+37
-18
lines changed

3 files changed

+37
-18
lines changed

api/organisations/chargebee/chargebee.py

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
from organisations.chargebee.constants import (
3232
ADDITIONAL_API_SCALE_UP_ADDON_ID,
3333
ADDITIONAL_API_START_UP_ADDON_ID,
34-
ADDITIONAL_SEAT_ADDON_ID,
3534
)
3635
from organisations.chargebee.metadata import ChargebeeObjMetadata
3736
from organisations.subscriptions.constants import CHARGEBEE
@@ -212,13 +211,11 @@ def add_single_seat(subscription_id: str) -> None:
212211
subscription = chargebee_client.Subscription.retrieve(
213212
subscription_id
214213
).subscription
214+
addon_id = _get_additional_seat_addon_id(subscription)
215+
215216
addons = subscription.addons or []
216217
current_seats = next(
217-
(
218-
addon.quantity
219-
for addon in addons
220-
if addon.id == ADDITIONAL_SEAT_ADDON_ID
221-
),
218+
(addon.quantity for addon in addons if addon.id == addon_id),
222219
0,
223220
)
224221

@@ -227,7 +224,7 @@ def add_single_seat(subscription_id: str) -> None:
227224
SubscriptionOps.UpdateParams(
228225
addons=[
229226
SubscriptionOps.UpdateAddonParams(
230-
id=ADDITIONAL_SEAT_ADDON_ID,
227+
id=_get_additional_seat_addon_id(subscription),
231228
quantity=current_seats + 1,
232229
)
233230
],
@@ -254,6 +251,19 @@ def add_single_seat(subscription_id: str) -> None:
254251
raise UpgradeSeatsError(msg) from e
255252

256253

254+
def _get_additional_seat_addon_id(subscription: SubscriptionOps) -> str:
255+
addon_id_prefix = "additional-team-members-scale-up-v2"
256+
addon_suffixes_by_billing_period = {1: "monthly", 6: "semiannual", 12: "annual"}
257+
suffix = addon_suffixes_by_billing_period.get(subscription.billing_period)
258+
if not suffix:
259+
logger.warning(
260+
"Unexpected billing period for subscription ID %s",
261+
subscription.id,
262+
)
263+
suffix = "monthly"
264+
return "-".join([addon_id_prefix, suffix])
265+
266+
257267
def add_100k_api_calls_start_up(
258268
subscription_id: str, count: int = 1, invoice_immediately: bool = False
259269
) -> None:
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
ADDITIONAL_SEAT_ADDON_ID = "additional-team-members-scale-up-v2"
2-
31
ADDITIONAL_API_START_UP_ADDON_ID = "additional-api-start-up-monthly"
42
ADDITIONAL_API_SCALE_UP_ADDON_ID = "additional-api-scale-up-monthly"

api/tests/unit/organisations/chargebee/test_unit_chargebee_chargebee.py

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
)
3636
from organisations.chargebee.constants import (
3737
ADDITIONAL_API_SCALE_UP_ADDON_ID,
38-
ADDITIONAL_SEAT_ADDON_ID,
3938
)
4039
from organisations.chargebee.metadata import ChargebeeObjMetadata
4140
from organisations.subscriptions.exceptions import (
@@ -514,7 +513,7 @@ def test_get_subscription_metadata_from_id__addons_is_none__returns_plan_metadat
514513
def test_add_single_seat__existing_addon__increments_quantity(mocker) -> None: # type: ignore[no-untyped-def]
515514
# Given
516515
plan_id = "plan-id"
517-
addon_id = ADDITIONAL_SEAT_ADDON_ID
516+
addon_id = "additional-team-members-scale-up-v2-monthly"
518517
subscription_id = "subscription-id"
519518
addon_quantity = 1
520519

@@ -523,6 +522,7 @@ def test_add_single_seat__existing_addon__increments_quantity(mocker) -> None:
523522
id=subscription_id,
524523
plan_id=plan_id,
525524
addons=[mocker.MagicMock(id=addon_id, quantity=addon_quantity)],
525+
billing_period=1,
526526
)
527527
mocked_chargebee = mocker.patch(
528528
"organisations.chargebee.chargebee.chargebee_client", autospec=True
@@ -542,7 +542,7 @@ def test_add_single_seat__existing_addon__increments_quantity(mocker) -> None:
542542
SubscriptionOps.UpdateParams(
543543
addons=[
544544
SubscriptionOps.UpdateAddonParams(
545-
id=ADDITIONAL_SEAT_ADDON_ID, quantity=addon_quantity + 1
545+
id=addon_id, quantity=addon_quantity + 1
546546
)
547547
],
548548
prorate=True,
@@ -551,8 +551,19 @@ def test_add_single_seat__existing_addon__increments_quantity(mocker) -> None:
551551
)
552552

553553

554-
def test_add_single_seat__no_existing_addon__creates_addon_with_quantity_one( # type: ignore[no-untyped-def]
555-
mocker,
554+
@pytest.mark.parametrize(
555+
"billing_period,expected_add_on_id",
556+
(
557+
(1, "additional-team-members-scale-up-v2-monthly"),
558+
(6, "additional-team-members-scale-up-v2-semiannual"),
559+
(12, "additional-team-members-scale-up-v2-annual"),
560+
# unexpected or missing billing period should default to monthly
561+
(None, "additional-team-members-scale-up-v2-monthly"),
562+
(7, "additional-team-members-scale-up-v2-monthly"),
563+
),
564+
)
565+
def test_add_single_seat__no_existing_addon__creates_addon_with_quantity_one(
566+
mocker: MockerFixture, billing_period: int, expected_add_on_id: str
556567
) -> None:
557568
# Given
558569
subscription_id = "subscription-id"
@@ -562,6 +573,7 @@ def test_add_single_seat__no_existing_addon__creates_addon_with_quantity_one( #
562573
id=subscription_id,
563574
plan_id="plan_id",
564575
addons=[],
576+
billing_period=billing_period,
565577
)
566578
mocked_chargebee = mocker.patch(
567579
"organisations.chargebee.chargebee.chargebee_client", autospec=True
@@ -580,9 +592,7 @@ def test_add_single_seat__no_existing_addon__creates_addon_with_quantity_one( #
580592
subscription_id,
581593
SubscriptionOps.UpdateParams(
582594
addons=[
583-
SubscriptionOps.UpdateAddonParams(
584-
id=ADDITIONAL_SEAT_ADDON_ID, quantity=1
585-
)
595+
SubscriptionOps.UpdateAddonParams(id=expected_add_on_id, quantity=1)
586596
],
587597
prorate=True,
588598
invoice_immediately=True,
@@ -616,6 +626,7 @@ def test_add_single_seat__api_error__raises_upgrade_seats_error( # type: ignore
616626
id=subscription_id,
617627
plan_id="plan-id",
618628
addons=[],
629+
billing_period=1,
619630
)
620631

621632
# tie that subscription object to the mocked chargebee object
@@ -633,7 +644,7 @@ def test_add_single_seat__api_error__raises_upgrade_seats_error( # type: ignore
633644
SubscriptionOps.UpdateParams(
634645
addons=[
635646
SubscriptionOps.UpdateAddonParams(
636-
id=ADDITIONAL_SEAT_ADDON_ID, quantity=1
647+
id="additional-team-members-scale-up-v2-monthly", quantity=1
637648
)
638649
],
639650
prorate=True,

0 commit comments

Comments
 (0)