stripe: Separate activation of free trial for remote realm/server.

Add a separate setting to only enable free trial for remote
realm / server.
This commit is contained in:
Aman Agrawal 2023-12-10 04:13:00 +00:00 committed by Tim Abbott
parent ccd60bc7e2
commit ce56e19d1c
3 changed files with 18 additions and 7 deletions

View File

@ -1813,10 +1813,16 @@ class BillingSession(ABC):
free_trial_end_date = None free_trial_end_date = None
# Don't show free trial for remote servers on legacy plan. # Don't show free trial for remote servers on legacy plan.
if remote_server_legacy_plan_end_date is None: if remote_server_legacy_plan_end_date is None:
free_trial_days = get_free_trial_days() is_self_hosted_billing = not isinstance(self, RealmBillingSession)
free_trial_days = get_free_trial_days(is_self_hosted_billing)
if free_trial_days is not None: if free_trial_days is not None:
_, _, free_trial_end, _ = compute_plan_parameters( _, _, free_trial_end, _ = compute_plan_parameters(
tier, False, CustomerPlan.BILLING_SCHEDULE_ANNUAL, None, True tier,
False,
CustomerPlan.BILLING_SCHEDULE_ANNUAL,
None,
True,
is_self_hosted_billing=is_self_hosted_billing,
) )
free_trial_end_date = ( free_trial_end_date = (
f"{free_trial_end:%B} {free_trial_end.day}, {free_trial_end.year}" f"{free_trial_end:%B} {free_trial_end.day}, {free_trial_end.year}"
@ -3600,6 +3606,7 @@ def compute_plan_parameters(
discount: Optional[Decimal], discount: Optional[Decimal],
free_trial: bool = False, free_trial: bool = False,
billing_cycle_anchor: Optional[datetime] = None, billing_cycle_anchor: Optional[datetime] = None,
is_self_hosted_billing: bool = False,
) -> Tuple[datetime, datetime, datetime, int]: ) -> Tuple[datetime, datetime, datetime, int]:
# Everything in Stripe is stored as timestamps with 1 second resolution, # Everything in Stripe is stored as timestamps with 1 second resolution,
# so standardize on 1 second resolution. # so standardize on 1 second resolution.
@ -3621,13 +3628,16 @@ def compute_plan_parameters(
next_invoice_date = add_months(billing_cycle_anchor, 1) next_invoice_date = add_months(billing_cycle_anchor, 1)
if free_trial: if free_trial:
period_end = billing_cycle_anchor + timedelta( period_end = billing_cycle_anchor + timedelta(
days=assert_is_not_none(get_free_trial_days()) days=assert_is_not_none(get_free_trial_days(is_self_hosted_billing))
) )
next_invoice_date = period_end next_invoice_date = period_end
return billing_cycle_anchor, next_invoice_date, period_end, price_per_license return billing_cycle_anchor, next_invoice_date, period_end, price_per_license
def get_free_trial_days() -> Optional[int]: def get_free_trial_days(is_self_hosted_billing: bool = False) -> Optional[int]:
if is_self_hosted_billing:
return settings.SELF_HOSTING_FREE_TRIAL_DAYS
return settings.CLOUD_FREE_TRIAL_DAYS return settings.CLOUD_FREE_TRIAL_DAYS

View File

@ -90,7 +90,7 @@ def plans_view(request: HttpRequest) -> HttpResponse:
context = PlansPageContext( context = PlansPageContext(
is_cloud_realm=True, is_cloud_realm=True,
sponsorship_url=reverse("sponsorship_request"), sponsorship_url=reverse("sponsorship_request"),
free_trial_days=get_free_trial_days(), free_trial_days=get_free_trial_days(False),
is_sponsored=realm is not None and realm.plan_type == Realm.PLAN_TYPE_STANDARD_FREE, is_sponsored=realm is not None and realm.plan_type == Realm.PLAN_TYPE_STANDARD_FREE,
) )
if is_subdomain_root_or_alias(request): if is_subdomain_root_or_alias(request):
@ -137,7 +137,7 @@ def remote_realm_plans_page(
sponsorship_url=reverse( sponsorship_url=reverse(
"remote_realm_sponsorship_page", args=(billing_session.remote_realm.uuid,) "remote_realm_sponsorship_page", args=(billing_session.remote_realm.uuid,)
), ),
free_trial_days=get_free_trial_days(), free_trial_days=get_free_trial_days(True),
billing_base_url=billing_session.billing_base_url, billing_base_url=billing_session.billing_base_url,
is_sponsored=billing_session.is_sponsored(), is_sponsored=billing_session.is_sponsored(),
) )
@ -172,7 +172,7 @@ def remote_server_plans_page(
sponsorship_url=reverse( sponsorship_url=reverse(
"remote_server_sponsorship_page", args=(billing_session.remote_server.uuid,) "remote_server_sponsorship_page", args=(billing_session.remote_server.uuid,)
), ),
free_trial_days=get_free_trial_days(), free_trial_days=get_free_trial_days(True),
billing_base_url=billing_session.billing_base_url, billing_base_url=billing_session.billing_base_url,
is_sponsored=billing_session.is_sponsored(), is_sponsored=billing_session.is_sponsored(),
) )

View File

@ -547,6 +547,7 @@ ARCHIVED_DATA_VACUUMING_DELAY_DAYS = 30
BILLING_ENABLED = False BILLING_ENABLED = False
CLOUD_FREE_TRIAL_DAYS: Optional[int] = int(get_secret("cloud_free_trial_days", "0")) CLOUD_FREE_TRIAL_DAYS: Optional[int] = int(get_secret("cloud_free_trial_days", "0"))
SELF_HOSTING_FREE_TRIAL_DAYS: Optional[int] = int(get_secret("self_hosting_free_trial_days", "0"))
# Custom message (supports HTML) to be shown in the navbar of landing pages. Used mainly for # Custom message (supports HTML) to be shown in the navbar of landing pages. Used mainly for
# making announcements. # making announcements.