From e192aef23d09feaf499ce8aa710ce67b8fcee93d Mon Sep 17 00:00:00 2001 From: Aman Agrawal Date: Wed, 20 Dec 2023 06:24:21 +0000 Subject: [PATCH] billing: Apply a flat discount for self hosted plans. --- corporate/lib/stripe.py | 93 +++++- .../0031_customer_flat_discount_and_more.py | 22 ++ corporate/models.py | 5 + ...ponsorship_billing--Customer.create.1.json | Bin 795 -> 809 bytes ...ponsorship_billing--Customer.modify.1.json | Bin 820 -> 834 bytes ...nsorship_billing--Customer.retrieve.1.json | Bin 1917 -> 1931 bytes ...nsorship_billing--Customer.retrieve.2.json | Bin 1917 -> 1931 bytes ...nsorship_billing--Customer.retrieve.3.json | Bin 1917 -> 1931 bytes ...nsorship_billing--Customer.retrieve.4.json | Bin 1917 -> 1931 bytes ...nsorship_billing--Customer.retrieve.5.json | Bin 1919 -> 1933 bytes ...non_sponsorship_billing--Event.list.1.json | Bin 1695 -> 1709 bytes ...non_sponsorship_billing--Event.list.2.json | Bin 12793 -> 12919 bytes ...non_sponsorship_billing--Event.list.3.json | Bin 21704 -> 27470 bytes ...non_sponsorship_billing--Event.list.4.json | Bin 16102 -> 19948 bytes ...non_sponsorship_billing--Event.list.5.json | Bin 8103 -> 10026 bytes ...sponsorship_billing--Invoice.create.1.json | Bin 5614 -> 7137 bytes ...p_billing--Invoice.finalize_invoice.1.json | Bin 5949 -> 7472 bytes ...sorship_billing--InvoiceItem.create.1.json | Bin 1116 -> 1121 bytes ...sorship_billing--InvoiceItem.create.2.json | Bin 1093 -> 1094 bytes ...sorship_billing--InvoiceItem.create.3.json | Bin 0 -> 1123 bytes ...rship_billing--PaymentIntent.create.1.json | Bin 6037 -> 6104 bytes ...sorship_billing--SetupIntent.create.1.json | Bin 930 -> 930 bytes ...onsorship_billing--SetupIntent.list.1.json | Bin 1116 -> 1116 bytes ...rship_billing--SetupIntent.retrieve.1.json | Bin 930 -> 930 bytes ...ip_billing--checkout.Session.create.1.json | Bin 2379 -> 2382 bytes ...ship_billing--checkout.Session.list.1.json | Bin 2769 -> 2772 bytes ...pgrade_legacy_plan--Customer.modify.1.json | Bin 834 -> 834 bytes ...rade_legacy_plan--Customer.retrieve.1.json | Bin 1931 -> 1931 bytes ...rade_legacy_plan--Customer.retrieve.2.json | Bin 1931 -> 1931 bytes ...rade_legacy_plan--Customer.retrieve.3.json | Bin 1931 -> 1931 bytes ...rade_legacy_plan--Customer.retrieve.4.json | Bin 1931 -> 1931 bytes ...rade_legacy_plan--Customer.retrieve.5.json | Bin 1931 -> 1931 bytes ...rade_legacy_plan--Customer.retrieve.6.json | Bin 1931 -> 1931 bytes ...ade_legacy_plan--SetupIntent.create.1.json | Bin 930 -> 930 bytes ...grade_legacy_plan--SetupIntent.list.1.json | Bin 1116 -> 1116 bytes ...e_legacy_plan--SetupIntent.retrieve.1.json | Bin 930 -> 930 bytes ...egacy_plan--checkout.Session.create.1.json | Bin 2382 -> 2382 bytes ..._legacy_plan--checkout.Session.list.1.json | Bin 2772 -> 2772 bytes ...r_to_business_plan--Customer.create.1.json | Bin 0 -> 795 bytes ...r_to_business_plan--Customer.modify.1.json | Bin 0 -> 820 bytes ...to_business_plan--Customer.retrieve.1.json | Bin 0 -> 1917 bytes ...to_business_plan--Customer.retrieve.2.json | Bin 0 -> 1917 bytes ...to_business_plan--Customer.retrieve.3.json | Bin 0 -> 1917 bytes ...to_business_plan--Customer.retrieve.4.json | Bin 0 -> 1917 bytes ...to_business_plan--Customer.retrieve.5.json | Bin 0 -> 1919 bytes ...to_business_plan--Customer.retrieve.6.json | Bin 0 -> 1919 bytes ...e_user_to_business_plan--Event.list.1.json | Bin 0 -> 1695 bytes ...e_user_to_business_plan--Event.list.2.json | Bin 0 -> 12910 bytes ...e_user_to_business_plan--Event.list.3.json | Bin 0 -> 27456 bytes ...e_user_to_business_plan--Event.list.4.json | Bin 0 -> 19948 bytes ...e_user_to_business_plan--Event.list.5.json | Bin 0 -> 10026 bytes ...e_user_to_business_plan--Event.list.6.json | Bin 0 -> 81 bytes ...er_to_business_plan--Invoice.create.1.json | Bin 0 -> 7137 bytes ...ness_plan--Invoice.finalize_invoice.1.json | Bin 0 -> 7472 bytes ...user_to_business_plan--Invoice.list.1.json | Bin 0 -> 83 bytes ...o_business_plan--InvoiceItem.create.1.json | Bin 0 -> 1121 bytes ...o_business_plan--InvoiceItem.create.2.json | Bin 0 -> 1094 bytes ...o_business_plan--InvoiceItem.create.3.json | Bin 0 -> 1123 bytes ...business_plan--PaymentIntent.create.1.json | Bin 0 -> 6098 bytes ...o_business_plan--SetupIntent.create.1.json | Bin 0 -> 930 bytes ..._to_business_plan--SetupIntent.list.1.json | Bin 0 -> 1116 bytes ...business_plan--SetupIntent.retrieve.1.json | Bin 0 -> 930 bytes ...iness_plan--checkout.Session.create.1.json | Bin 0 -> 2379 bytes ...usiness_plan--checkout.Session.list.1.json | Bin 0 -> 2769 bytes ...monthly_basic_plan--Customer.create.1.json | Bin 0 -> 795 bytes ...monthly_basic_plan--Customer.modify.1.json | Bin 0 -> 820 bytes ...nthly_basic_plan--Customer.retrieve.1.json | Bin 0 -> 1917 bytes ...nthly_basic_plan--Customer.retrieve.2.json | Bin 0 -> 1917 bytes ...nthly_basic_plan--Customer.retrieve.3.json | Bin 0 -> 1917 bytes ...nthly_basic_plan--Customer.retrieve.4.json | Bin 0 -> 1917 bytes ...nthly_basic_plan--Customer.retrieve.5.json | Bin 0 -> 1919 bytes ...nthly_basic_plan--Customer.retrieve.6.json | Bin 0 -> 1919 bytes ...r_to_monthly_basic_plan--Event.list.1.json | Bin 0 -> 1695 bytes ...r_to_monthly_basic_plan--Event.list.2.json | Bin 0 -> 12857 bytes ...r_to_monthly_basic_plan--Event.list.3.json | Bin 0 -> 16887 bytes ...r_to_monthly_basic_plan--Event.list.4.json | Bin 0 -> 20475 bytes ...r_to_monthly_basic_plan--Event.list.5.json | Bin 0 -> 19898 bytes ...r_to_monthly_basic_plan--Event.list.6.json | Bin 0 -> 81 bytes ..._monthly_basic_plan--Invoice.create.1.json | Bin 0 -> 7108 bytes ...asic_plan--Invoice.finalize_invoice.1.json | Bin 0 -> 7443 bytes ...to_monthly_basic_plan--Invoice.list.1.json | Bin 0 -> 83 bytes ...thly_basic_plan--InvoiceItem.create.1.json | Bin 0 -> 1111 bytes ...thly_basic_plan--InvoiceItem.create.2.json | Bin 0 -> 1085 bytes ...thly_basic_plan--InvoiceItem.create.3.json | Bin 0 -> 1117 bytes ...ly_basic_plan--PaymentIntent.create.1.json | Bin 0 -> 6065 bytes ...thly_basic_plan--SetupIntent.create.1.json | Bin 0 -> 930 bytes ...onthly_basic_plan--SetupIntent.list.1.json | Bin 0 -> 1116 bytes ...ly_basic_plan--SetupIntent.retrieve.1.json | Bin 0 -> 930 bytes ...basic_plan--checkout.Session.create.1.json | Bin 0 -> 2379 bytes ...y_basic_plan--checkout.Session.list.1.json | Bin 0 -> 2769 bytes corporate/tests/test_stripe.py | 293 ++++++++++++++++-- templates/corporate/billing.html | 49 +-- templates/corporate/upgrade.html | 19 +- web/src/billing/page_params.ts | 2 + web/src/billing/upgrade.ts | 11 +- 95 files changed, 439 insertions(+), 55 deletions(-) create mode 100644 corporate/migrations/0031_customer_flat_discount_and_more.py create mode 100644 corporate/tests/stripe_fixtures/non_sponsorship_billing--InvoiceItem.create.3.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.modify.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.2.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.3.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.4.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.5.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.6.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.2.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.3.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.4.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.5.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.6.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Invoice.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Invoice.finalize_invoice.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Invoice.list.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--InvoiceItem.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--InvoiceItem.create.2.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--InvoiceItem.create.3.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--PaymentIntent.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--SetupIntent.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--SetupIntent.list.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--SetupIntent.retrieve.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--checkout.Session.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--checkout.Session.list.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.modify.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.2.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.3.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.4.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.5.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.6.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.2.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.3.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.4.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.5.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.6.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Invoice.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Invoice.finalize_invoice.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Invoice.list.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--InvoiceItem.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--InvoiceItem.create.2.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--InvoiceItem.create.3.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--PaymentIntent.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.list.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.retrieve.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--checkout.Session.create.1.json create mode 100644 corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--checkout.Session.list.1.json diff --git a/corporate/lib/stripe.py b/corporate/lib/stripe.py index 65c17eed6b..4cbb191e3d 100644 --- a/corporate/lib/stripe.py +++ b/corporate/lib/stripe.py @@ -588,6 +588,8 @@ class UpgradePageParams(TypedDict): seat_count: int billing_base_url: str tier: int + flat_discount: int + flat_discounted_months: int class UpgradePageSessionTypeSpecificContext(TypedDict): @@ -706,9 +708,11 @@ class BillingSession(ABC): def get_data_for_stripe_payment_intent( self, + customer: Customer, price_per_license: int, licenses: int, plan_tier: int, + billing_schedule: int, email: str, ) -> StripePaymentIntentData: if hasattr(self, "support_session") and self.support_session: # nocoverage @@ -721,6 +725,12 @@ class BillingSession(ABC): plan_name = CustomerPlan.name_from_tier(plan_tier) description = f"Upgrade to {plan_name}, ${price_per_license/100} x {licenses}" + if customer.flat_discounted_months > 0: + num_months = 12 if billing_schedule == CustomerPlan.BILLING_SCHEDULE_ANNUAL else 1 + flat_discounted_months = min(customer.flat_discounted_months, num_months) + amount -= customer.flat_discount * flat_discounted_months + description += f" - ${customer.flat_discount/100} x {flat_discounted_months}" + return StripePaymentIntentData( amount=amount, description=description, @@ -917,7 +927,12 @@ class BillingSession(ABC): customer = self.get_customer() assert customer is not None and customer.stripe_customer_id is not None payment_intent_data = self.get_data_for_stripe_payment_intent( - price_per_license, licenses, metadata["plan_tier"], self.get_email() + customer, + price_per_license, + licenses, + metadata["plan_tier"], + metadata["billing_schedule"], + self.get_email(), ) # Ensure customers have a default payment method set. stripe_customer = stripe_get_customer(customer.stripe_customer_id) @@ -1021,14 +1036,18 @@ class BillingSession(ABC): plan.save(update_fields=["discount", "price_per_license"]) def attach_discount_to_customer(self, new_discount: Decimal) -> str: + # Remove flat discount if giving customer a percentage discount. customer = self.get_customer() old_discount = None if customer is not None: old_discount = customer.default_discount customer.default_discount = new_discount - customer.save(update_fields=["default_discount"]) + customer.flat_discounted_months = 0 + customer.save(update_fields=["default_discount", "flat_discounted_months"]) else: - customer = self.update_or_create_customer(defaults={"default_discount": new_discount}) + customer = self.update_or_create_customer( + defaults={"default_discount": new_discount, "flat_discounted_months": 0} + ) plan = get_current_plan_by_customer(customer) if plan is not None: self.apply_discount_to_plan(plan, new_discount) @@ -1305,6 +1324,21 @@ class BillingSession(ABC): unit_amount=price_per_license, ) + if customer.flat_discounted_months > 0: + num_months = 12 if billing_schedule == CustomerPlan.BILLING_SCHEDULE_ANNUAL else 1 + flat_discounted_months = min(customer.flat_discounted_months, num_months) + discount = customer.flat_discount * flat_discounted_months + customer.flat_discounted_months -= flat_discounted_months + customer.save(update_fields=["flat_discounted_months"]) + + stripe.InvoiceItem.create( + currency="usd", + customer=customer.stripe_customer_id, + description=f"${customer.flat_discount}/month new customer discount", + # Negative value to apply discount. + amount=(-1 * discount), + ) + if charge_automatically: collection_method = "charge_automatically" days_until_due = None @@ -1717,18 +1751,23 @@ class BillingSession(ABC): billing_frequency = CustomerPlan.BILLING_SCHEDULES[plan.billing_schedule] if switch_to_annual_at_end_of_cycle: + num_months_next_cycle = 12 annual_price_per_license = get_price_per_license( plan.tier, CustomerPlan.BILLING_SCHEDULE_ANNUAL, customer.default_discount ) renewal_cents = annual_price_per_license * licenses_at_next_renewal price_per_license = format_money(annual_price_per_license / 12) elif switch_to_monthly_at_end_of_cycle: + num_months_next_cycle = 1 monthly_price_per_license = get_price_per_license( plan.tier, CustomerPlan.BILLING_SCHEDULE_MONTHLY, customer.default_discount ) renewal_cents = monthly_price_per_license * licenses_at_next_renewal price_per_license = format_money(monthly_price_per_license) else: + num_months_next_cycle = ( + 12 if plan.billing_schedule == CustomerPlan.BILLING_SCHEDULE_ANNUAL else 1 + ) renewal_cents = self.get_customer_plan_renewal_amount(plan, now, last_ledger_entry) if plan.price_per_license is None: @@ -1738,6 +1777,14 @@ class BillingSession(ABC): else: price_per_license = format_money(plan.price_per_license) + # TODO: Do this calculation in `invoice_plan` too. + pre_discount_renewal_cents = renewal_cents + flat_discount, flat_discounted_months = self.get_flat_discount_info(plan.customer) + if flat_discounted_months > 0: + flat_discounted_months = min(flat_discounted_months, num_months_next_cycle) + discount = flat_discount * flat_discounted_months + renewal_cents = renewal_cents - discount + charge_automatically = plan.charge_automatically assert customer.stripe_customer_id is not None # for mypy stripe_customer = stripe_get_customer(customer.stripe_customer_id) @@ -1786,6 +1833,9 @@ class BillingSession(ABC): "legacy_remote_server_next_plan_name": legacy_remote_server_next_plan_name, "using_min_licenses_for_plan": using_min_licenses_for_plan, "min_licenses_for_plan": min_licenses_for_plan, + "pre_discount_renewal_cents": cents_to_dollar_string(pre_discount_renewal_cents), + "flat_discount": format_money(customer.flat_discount), + "discounted_months_left": customer.flat_discounted_months, } return context @@ -1821,12 +1871,30 @@ class BillingSession(ABC): "price_per_license", "discount_percent", "using_min_licenses_for_plan", + "min_licenses_for_plan", + "pre_discount_renewal_cents", ] for key in keys: context[key] = next_plan_context[key] return context + def get_flat_discount_info(self, customer: Optional[Customer] = None) -> Tuple[int, int]: + is_self_hosted_billing = not isinstance(self, RealmBillingSession) + flat_discount = 0 + flat_discounted_months = 0 + if is_self_hosted_billing and (customer is None or customer.flat_discounted_months > 0): + if customer is None: + temp_customer = Customer() + flat_discount = temp_customer.flat_discount + flat_discounted_months = 12 + else: + flat_discount = customer.flat_discount + flat_discounted_months = customer.flat_discounted_months + assert isinstance(flat_discount, int) + assert isinstance(flat_discounted_months, int) + return flat_discount, flat_discounted_months + def get_initial_upgrade_context( self, initial_upgrade_request: InitialUpgradeRequest ) -> Tuple[Optional[str], Optional[UpgradePageContext]]: @@ -1893,6 +1961,7 @@ class BillingSession(ABC): f"{free_trial_end:%B} {free_trial_end.day}, {free_trial_end.year}" ) + flat_discount, flat_discounted_months = self.get_flat_discount_info(customer) context: UpgradePageContext = { "customer_name": customer_specific_context["customer_name"], "default_invoice_days_until_due": DEFAULT_INVOICE_DAYS_UNTIL_DUE, @@ -1917,6 +1986,8 @@ class BillingSession(ABC): "seat_count": seat_count, "billing_base_url": self.billing_base_url, "tier": tier, + "flat_discount": flat_discount, + "flat_discounted_months": flat_discounted_months, }, "using_min_licenses_for_plan": using_min_licenses_for_plan, "min_licenses_for_plan": min_licenses_for_plan, @@ -3245,12 +3316,16 @@ class RemoteRealmBillingSession(BillingSession): remote_realm=self.remote_realm, defaults={"stripe_customer_id": stripe_customer_id}, ) - return customer else: customer, created = Customer.objects.update_or_create( remote_realm=self.remote_realm, defaults=defaults ) - return customer + + if created and not customer.default_discount: + customer.flat_discounted_months = 12 + customer.save(update_fields=["flat_discounted_months"]) + + return customer @override @transaction.atomic @@ -3634,12 +3709,16 @@ class RemoteServerBillingSession(BillingSession): remote_server=self.remote_server, defaults={"stripe_customer_id": stripe_customer_id}, ) - return customer else: customer, created = Customer.objects.update_or_create( remote_server=self.remote_server, defaults=defaults ) - return customer + + if created and not customer.default_discount: + customer.flat_discounted_months = 12 + customer.save(update_fields=["flat_discounted_months"]) + + return customer @override @transaction.atomic diff --git a/corporate/migrations/0031_customer_flat_discount_and_more.py b/corporate/migrations/0031_customer_flat_discount_and_more.py new file mode 100644 index 0000000000..719615a622 --- /dev/null +++ b/corporate/migrations/0031_customer_flat_discount_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.8 on 2023-12-19 12:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("corporate", "0030_alter_zulipsponsorshiprequest_requested_plan"), + ] + + operations = [ + migrations.AddField( + model_name="customer", + name="flat_discount", + field=models.IntegerField(default=2000), + ), + migrations.AddField( + model_name="customer", + name="flat_discounted_months", + field=models.IntegerField(default=0), + ), + ] diff --git a/corporate/models.py b/corporate/models.py index 0d9a57c0dc..b0c1381190 100644 --- a/corporate/models.py +++ b/corporate/models.py @@ -34,6 +34,11 @@ class Customer(models.Model): # they purchased. exempt_from_license_number_check = models.BooleanField(default=False) + # In cents. + flat_discount = models.IntegerField(default=2000) + # Number of months left in the flat discount period. + flat_discounted_months = models.IntegerField(default=0) + class Meta: # Enforce that at least one of these is set. constraints = [ diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.create.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.create.1.json index 856442bd13b50b6ca77eb9b8c7304e39e6b9ded5..3d6b9bc66c1463db80771fd35472d867f52ee33e 100644 GIT binary patch delta 154 zcmbQuwvuhaM%k3q+Y7-ZTj*Mv8=3)GX=awGNomQJ LX{nRrnf3qx?uIg0 delta 140 zcmZ36SEZaL?dI}M2pmo=ZqNRi&7JFa^o}d zi%XQO6qL}_E9r140D)3bYHof>DpYZ4X=VyYF|t`{x+ZC<#=4efrUtr6=1CT&sYZ#G MNhZdVbD8!40E<~JivR!s diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.modify.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.modify.1.json index 6c64e0b85938105b87156d797169f2c74ce60587..828b03f680a09fbb35f3780f83aac70045df314c 100644 GIT binary patch delta 198 zcmdnOc8G1lM%k3q+jME~ZrgkCH$s delta 166 zcmX@awuNoNM%k*;oXi5flGNgo;?$zD)FOo>6SEZaL?dI}M2pmk=T3?Fr&r{;xCSN` zpk~nwXOtpOIf&qGY9@gl>|O4wnKDC>5pV=9i>G6_=J~ mrhpV9+mfbhl9p<$YiVX`pqpf#WMP_WlxUe`Vm!HxX%7IT);Q(> diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.1.json index 50bf46243d054202ce7e0f92a2484a22be66bea5..33f1a5cc6ce49df2e29e076af25cc4fca6a1c307 100644 GIT binary patch delta 181 zcmey%*Udj+qijlQZoXb>MPhD2PO4sVey)O9a!RUcnt7tGVVe2IbIVx70z6AoTwDVa zi}DLyvWlIJEKZ4Us4tUSm7 delta 167 zcmeC?|I0UFqij`aPG*5#NosLPacWUnYLP;ciCKzyqLHy~qDAV)bIVx7{L?G)TwDVa zi}DLyvWmmJojfWmTyrLOvEGO;N=?kkjnBw0E>W^lP(n9KNry`T2$YIabMs45p^8gO nGgCl{k*!J7HAzb~*0nS2Eos diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.2.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.2.json index 50bf46243d054202ce7e0f92a2484a22be66bea5..33f1a5cc6ce49df2e29e076af25cc4fca6a1c307 100644 GIT binary patch delta 181 zcmey%*Udj+qijlQZoXb>MPhD2PO4sVey)O9a!RUcnt7tGVVe2IbIVx70z6AoTwDVa zi}DLyvWlIJEKZ4Us4tUSm7 delta 167 zcmeC?|I0UFqij`aPG*5#NosLPacWUnYLP;ciCKzyqLHy~qDAV)bIVx7{L?G)TwDVa zi}DLyvWmmJojfWmTyrLOvEGO;N=?kkjnBw0E>W^lP(n9KNry`T2$YIabMs45p^8gO nGgCl{k*!J7HAzb~*0nS2Eos diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.3.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.3.json index 50bf46243d054202ce7e0f92a2484a22be66bea5..33f1a5cc6ce49df2e29e076af25cc4fca6a1c307 100644 GIT binary patch delta 181 zcmey%*Udj+qijlQZoXb>MPhD2PO4sVey)O9a!RUcnt7tGVVe2IbIVx70z6AoTwDVa zi}DLyvWlIJEKZ4Us4tUSm7 delta 167 zcmeC?|I0UFqij`aPG*5#NosLPacWUnYLP;ciCKzyqLHy~qDAV)bIVx7{L?G)TwDVa zi}DLyvWmmJojfWmTyrLOvEGO;N=?kkjnBw0E>W^lP(n9KNry`T2$YIabMs45p^8gO nGgCl{k*!J7HAzb~*0nS2Eos diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.4.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.4.json index 50bf46243d054202ce7e0f92a2484a22be66bea5..33f1a5cc6ce49df2e29e076af25cc4fca6a1c307 100644 GIT binary patch delta 181 zcmey%*Udj+qijlQZoXb>MPhD2PO4sVey)O9a!RUcnt7tGVVe2IbIVx70z6AoTwDVa zi}DLyvWlIJEKZ4Us4tUSm7 delta 167 zcmeC?|I0UFqij`aPG*5#NosLPacWUnYLP;ciCKzyqLHy~qDAV)bIVx7{L?G)TwDVa zi}DLyvWmmJojfWmTyrLOvEGO;N=?kkjnBw0E>W^lP(n9KNry`T2$YIabMs45p^8gO nGgCl{k*!J7HAzb~*0nS2Eos diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.5.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Customer.retrieve.5.json index 81c544699c7b9e89e7c8f057696310e6debb093a..d2e9309f6a19ca83c96699efc4f1e5156306d93c 100644 GIT binary patch delta 199 zcmey**ULX)vusLgZoXb>MPhD2PO4sVey)O9a!RUcnt7tGVVe2I3(Hu<0z6AoTwDVa zi}DLyvWlIJEKRIPAw`+Es8HLDN?dhP{M1Jk`9*w5GWM^?JG%*hw3aX z%}fDlMYc3m*TmA?Lf6vV&RA~0O`m; A@&Et; delta 167 zcmeC>|IasJvussqPG*5#NosLPacWUnYLP;ciCKzyqLHy~qDAV)3(Hu<{L?G)TwDVa zi}DLyvWmmJojfWmTyrM(u-=F-N=?kkjnBw0E>W^lP(n9KNry`T2$YIabMs45p^8gO nGgCl{k*!J7HAzb~*0nSYDHphK~Ab(a(=FYS#nCMX_|SWu3?(_<`zaKMzH|T(i9ih zz{H~bLYJ&!XCsSLFJlY$$#a-y*B7T2m8BNN7nc+%St%&tHA_i{O92Te6#*?SNsWh^ zP+FRq0x|;G_EcRHOLGfdOLIdrAS=zxGBqhJ*)lCv32xBjmrMeicQ8)`yD<&n#$4~x zBoC+bvdQtROI4Cg4O0xvQqy!T4U8;wO^i*FbuCPiEOk?iEeumq49tyFEX^isu$2P< DXGv2& delta 251 zcmZ3>JD+z$I-_h=X-;N=UP)?kNpWgXS!$6&l8IT0d7_cAZlXo%<`zaKMlt{NiaZzB zz{H~bLYJ)KFmET13Jceq$#a-yXB4F-=H$j_wKOv|&`mN=vM^0GO0-NeF;<%VfJt)mG3JS2#}ptOW1MFZ zn3tICIyskhsfwwAQL=fek%exGxk<9FiJ_sHu4ST`fv$Xg<-OJa_VF=wsHV# Ct4^W- diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Event.list.2.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Event.list.2.json index 0358ea62c204452717acaace6883d5399188e5f3..97a939c624545eeecba559d37e7a53b9d466566f 100644 GIT binary patch delta 1094 zcmcIjJxmjE6i-|12NVcJidVok6$lWnxx0Ql65+h86+?pW~o_l0;1Y( zabCTsR1!`pH$q+8sc^{I4l)9Fv>J%$G-iPiS|(F5 zE)<#$*b9Z&RAix?ORwcPcWBy~Ah(VdTCfd>tKHiwq?ik^lM~VGMkUWUYa7*4m0uzp z!gUXPH-0)xx%j?!N72B(gqS6&tBCKf^u8PFZBpy{lhPg_O){M^)0^`cOpFYO6Mbq` zqn>UujN9#GB~s47%HjGLvMjE6!UYlH`NU`aRXq1PO!!|SHq_9R2mlo#&fCh(c} zWCae)*5lX~28Cc_vu$~t9GG>=-R_!`vFG0G5yW8*(?U4*N z3{OxUBn=4E`*rZZu+TJIygHL|G1+uVG8{$Joa<8wK8sW7W#Z<1U^Z89!gfSG&qS*8+Z zCPRbC4>^P<&s3J5{D6slb0?bt6GTjW@;X&MMq{9?k6ck|Voq*+Mt*ULl9hr|RcTIU zfnG^!aY=D%QCVscP>I-NJt=lpu(HYdoHl|G4W&T&_{pj0*Fd zD6^=dl;YGvuTt}r2+M5K$n2`3sGy>tz_bj%?9E5@qQSWUIZ{0Hjl5HmJb;nnKe^Q~ NjM#{gnk;D)2LOB^OgI1l diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Event.list.3.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Event.list.3.json index cfe538d1fae466d84101b6508c7b643d77c072f4..22039a294a3735d96e4f913c4110e937ba01a9da 100644 GIT binary patch delta 1861 zcmeH{U1(cn7{@s+O|mA`Y@M4OWjoCZZED}{J>Tbu-CC2Trb|E4W}Or4I3MqEO`4|7 zhh$YY6~w`)gFP253={;BL3M6NL53g>gn}{(120r4f_kG46olSPd{2^+AcBhEmFMc5 z=bSvx|NnpTdpEB$cfVlXoAR6(EheAllERs6`KeQj)7%V>#Z&26c|4UYC%K6P8J&pD zo))DC_YpGY3 zeEiW!sZh*iNuISA^df7`7tCB~vB=uFJj?NHHn&(jcPo5}adx89#i5H#MqzjC#2TJn7hb7MgWhFhSI zy9>964?1u3Wtd9Q9XHgz$-sq?AgucL)MojiW8kAEUaA;-Mt&F8k3Hex6uEH>_1ajX zX5s#5AGC$n7y+2@ez+a(tKDt+L-5X6Cw%N{fjK4Me8}Bl=&Miq55SiH9`tqv;PZYz zJTGqVc5JZSOy^d7yEo9Lyg+|>S=n&DKlrxqz*M}n5FJVC`P_0eT}YqdRdIP-h1ZWy z!Y}M>w=EG%6bVM0jX5MroQ!mZKJtccY7&n{(J>D*%tTs9OhzNr!Yh!CvE8~!cx=lAae`?hQP6Fq2`Yz7!xB_M z(0N0pyv5#Uc=)YJq7FWzgtozh!#)QM-(#G)v9&6uKgbVJRW71I=p1aLlEN;kHy%f@ zo*1Phr~V*?n9I}W@(Em#5=gP#SRy<}XrjEW@ou6L(m5<53){S65nUGyjY|2zC9akx zW&718Ap}1k-VbPawGx&~cjVIwz8-WGevQ1j2UQP=dUoDwA=DUN1!S6@ulDty#dkhF zYsORhX;(9&z+&u3w_(bXF3394h%C_nB@P*eVj)!%G5s%4ngyP!-hew3-?0|S<_1Vv z&n_*H0W+6nWz!;(t?2Y9P^w#Rhc738bfdEBTZ`~2857h|_7 zHuP5=*@i2Wr{jy{Y^_77G;g^r8Z{6kYKn?9g`P>GX3H8eY*VvIsCBmw92yKdJIV8m Yt8u=racrcdWz*B-pGR{D(y6)M0j;M|`2YX_ delta 1206 zcmd6lO-vI(6o9h`E#)B~-O5DUNS5F2tF?v#Byci=M^kQP-7E~IJdT}lIP9TQY2MFBH?vJbkjhRDJYsI5mUvowO(J8o5}Y-G-}Ov{BUe*GGwHV z$|vK-R+BpH?`B=1h(&>NIubR>jYLj0kfP}rVTlt|NhPM?mSMf#33J`EX_Kt~hCRV* zK;aAa;EG_?k!LN2U#6#6Y@y%`0|n>CvN#NDBxz5w7?wj7P<5mT-b8BCNXaelCnn-5 z=L^R&k>-0@mn6uXs#6J3nVLuxIRz=I%_T{0jhKXLDvxcXy>PQE8@~6>?Lfb{!mSPW zP?!OKLAmugaEP&gMlqn^6Hw1SxBmsq_m{vmQjw!zdjV5dbt|-x?&)r*-m!7!gw@Et zZIr$3aZi_iOvt2scb;__rlt_0YY3Y*o2`)|ji&_hgjaaoB(f=z49Xd3q91CfQp1sW zW0H<1$7y1MCRifMhFjwWq$$)1T;pzNXe e5>ZI2vZe`(`%dh5$Bu_maRU!$9N6+=__MydcA112@l*EVl~Zkid#SLqDHXcR#nVa1&D> zm+UIPknAeokWfPdBLf4Ez$~}maEsE({cLL}Hshe$dS+cClgSI!#U?9ouuXoaC&UEi zdZ;*;7MJAbrWPrr7F7&mF(XM~z4I$1$f8f2P)?w-jGriVbxemw^!BZJ9>>UtoGQQvd&OZ82Y3yef2 z%Nv~ET&LN@xVgaSKI7#3I&YYaOeb&T5T5)%_XD$`xf!w(p?r_YUit?ajlqssub~ZP zo#$4b{M$@w@?H-1$-Lq`o7Wi}VgyUQoUCcbGnq%5d$N|ueW(#&H-gzvM}paV#cCLh zH#eH`vP%Ydmgcy)1|}Be7rJB>hnSZK7-hS-Dd})cUdSmwxn8bWCCxN7#l$4lK-VzM zz);u3)X+>f(HzJ%N=i(&G&M3XF-c0EoNK4F*+brcG}4D)q^BErq^6a72OuI{ck*Z3 JFk&OV5&+-KMyCJ( delta 693 zcmaDeoAFugh5$BumlT&ULpP(qTsQx4*Mfkg?39qe?4W=s4=>|HkCfaHgL0D~R}&*2 zm+UG(mq26RtYlLIBLjm1j|^8&qhPPe{cLL}HlvDtJ)_0sLNh%exzOzQWn#pLid9NHVyO@7^ zMVX6hU}8~zp-WbAet>7Wg{h_SDN9^vm;=9Uf&Qvb<6eZq(e O*2yc?lqOI04F>@E+36$z diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Event.list.5.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Event.list.5.json index 8c9bb73ac76735799ebb1bc3b804a992871681f8..3696578a0e408c1b9990a5181567deb5817b42c6 100644 GIT binary patch delta 545 zcmZ2(zshez0GqvgNnn&=pmAhwMMP*`kYTWan`cOtTZL~(U`3#zpHHg0pIcbCiK&lE zc9ma9c9m~PsG)(8fq_S0mRoSRMd{>zwlx%+QN_NVP1nf8z`$VgMh@Z03LI>cm-7p; zB18%}jFg>Ai%arzQ;QVRauQ1vQZkE^^Gowe6w>mG6by|Na`W>_GB&U0=wRHuT(F68 z^G@#jj4(4BxkV?>72}z#FUrGYWU|>-w2qM-Y_<~Dn9DSV%C@(kWLOh%?)C-aD{o9xc-#Aax2hHMPb7sx_DZ%k$u zILKtIG+B{TWO5d#CZqA>4ICnqFK{buwi0~L2$BK0_5$~17*k8+KFkOte=q|r0(%6+ zn7mi4hS7Mll{hcEWPoRBj*DwxVo`pfOIC4;S4Np{gh_ys4%g&`obr?F<(gH}OjA=# mOi~SW4buz^bxlkS&2$sZfn1}c#AHiTBLfqYq~ytJ@{IuYMxx~a delta 371 zcmZ4Gx7>b10Gqu_ic6TGn^9n{n}4`#K|oS=N=RUKP(YN2mvN#;N^Xcjxk-?#iII;> zc9ow?ps{aOvZ;ZQfkA;shO4Jhu-D{%wlx%+QN_NV)xrP>CV%7*o~$4)j>LP%|73Cw z=i|*=1)CUw43WtN!Yq^hg)dFs&GU7#nCKfOLxaf+`3_D#D&~ZwOF>)$iT94*XmYdo z!O7;rB9j|9wL$de{hUHfo6UvqGqUMItiC8DI$2*-oEga7ykDk{k;%efvV&X=qtWKQ za=h$f{^=EEF0O%zMfrs;S;Z;Y1?FLnM){K;s4i7WF)&F^NwP4|wJ^0z)HO*mO4dzE YPD{}>O*6JgOf*eOvotW9yi%W#`i3lKkA%B89Y^#1e&+%;Mzy(!3IdwEQ9k zLnDRU{JfHk%|WadjGMD~j2I{LvGHs^!CuS=HbstKgU!gqz`#Ih@_A0t$+eutldtg4 z0vX)RrNLxmF!?D9&>DluceyMlyRuH2{EnM<@)7Q3o4eS6CcWe4*}Q_cm~pZ-=N2X- z)5#w>4>KE@n}M7LrtfjxWHg?9gVl`Dc=LPiwTwW{UiO_pGMw)ySOL&>cAy4y>%npb M0wF+cM+G!l0W5e=mjD0& delta 131 zcmaE8{!V+t6BZ^5gUQcXR6!I!tHoqv?n#s1vu@s8!DGY-WbkZ$z+TKaS(ASYlcB-n z`}~I?%GF@X*#s9({=>~X`46iWkgnMrB?Q#=hnr{e4B>T?Q}~WD>w?S`)c~sB+`y^E R2-24<7Q$$>d54%LD**8zE2#hg diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--Invoice.finalize_invoice.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--Invoice.finalize_invoice.1.json index 2c146c2ff21fc0bf2b2315a2dfa1187082b9d7a2..6774868ae2203a1861940addffca8d97087468ca 100644 GIT binary patch delta 382 zcmdn1x4~*d7mK}nNnn&=pmAhwMMP*`kYTWan`cOtTZL~(U`3#zpHHg0pIcbCiK&lE zc9ma9c9m~PsDXizfq_}JcSU-jalqu0EORI}V+m_Lv#ycJG1Ehn)=AtkdoIlnZoL?JD|NWsuZAvZs-BxCbLHVekhD|w9=C;PJVY-Z;yW(1oO zE1 zc9ow?ps{aOvWbC_fkA0jaJY}Lx9jASEORI}V+m_Lqs3%F9yKNlgUNnu7L$#og(tW2 z)KAu9-@JJ{uMs1V!LwPOvzT#mhQJmkLxah3f`=hGn029AT!j`+w&vxXY|X9(q-!?M t6b5Ru=H;1uU1Z(l#r#Jh3dJ-)R!kJ=p6tav8^l~B9>Qp}`MbC!D**HsR4xDj diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--InvoiceItem.create.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--InvoiceItem.create.1.json index 76bc062d9c7a86bd0d6d64a676260ca5e8cc2b33..c351f1fdd5acdaf9cae7a1b1411840fa231375f5 100644 GIT binary patch delta 84 zcmcb^@sLBPnoB`JDKR&{G_OR-NQ21(MI17BX2FOzvh@ X0#O^7TR@aKivp*G0T3v0)p7v9l%^iWOq!I$8L=AezhftvHigml)Y#82 z&(F@~uIqX|`Q)g7)4jfb*zI<&BxX_w;LH<8`xM8%1|#_if&@*9>dWKT&u>3{{Py8J zm+cE?)C8R0bEJH^a)f9C&V=4c@w-%rx`Wl!jTnt6=ng(~`}=P4j*hX?)tnxz&>pmn zP#9|>a`gL;9Kun!5x2UoIu?cK&K`}hxnymww0MTekJ}q2AkE!q240>s%n!f7h*5pz zK!U00oFSl>`!DPs`v*=ATNgMSNe3ZV6AUlpv(@6wqG=9AWF^#wSR?}$3z%*|Ytj8w z(HvotWY0QOa!6SfBTN7u$W1M`Ml2P1Hkm{%n{ide`Qma`_p;H9z2&Qfy+5T{oj}&B zq5jWt#yT`7r*m@+a-Br6NyfwAIruS^3CZtPUs+H_1(4R+x9#nu|EK|u`iwqrcye(D zg9l{$DnB8FsOqLPawupQd3z`IJ84Hq|1?HVbDoZOpa{8{$|sXrOPAWEqpT zGT(yf*R2UY==!Xd&FC8y`@Fd^4ebNGO7Ep-u7~Co@qv`F-kchHS~(nEm9~jnI-l?U E0#^t?6aWAK literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--PaymentIntent.create.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--PaymentIntent.create.1.json index 1b346aa07bf2e9ab1754c305c74f42bf3f1be112..797a278c88646c5ade8d315d394d0bfa5703e9af 100644 GIT binary patch delta 582 zcmbQLe?woenoB`JDKR&{G_OR-O2N?FY@$FcGl;Bfl8r9Ho@h+E{`N`2DYLj)? z`Gld$OM!HJCdfTXhLe5RWtf2$Prk@2y19Y<9HUr(XK9LyYhYqgexXZNv9pmys+X~a z`($lSsmXPmP9V>2KE&C{3}Q_7<=rBXn37l&pI=atnV(k-G_rc~7v8P@zRsSRh2`$P z>5)b5x)FwE$)09DPLa+*M&23a7Kxd8g+;#Jj)ksfsbyx)c~MC&DVAv=iDsrHUR41Z zPF?{Oeqj|w@ll4Mt|e9BrAfw{fABqJk}S+|Np*D$%q}avL?_OqD$ zO>hH7kggCiXJj%mo%~Q(oY7?RPhkTSJfWqRoSzE~UZo;nD3+wg!^2Kb8%wys6c?u^ Ymc%DR(}NPwy3Hc3ID&AqpQt+%0395)jQ{`u delta 497 zcmcbiKUH6#noB`JDKR&{G_OR-O2NWlqF^i&kSzQNBqygbDgdd?9gM%3m<$azPh$DV zs9Xvl!~Y@6C)qT z+*Av*Qj<_K(|~xV(CqS%im0TNEZz9DK#K?q1IJ=7kImZrPnjfBon18UmX^M+$U}8~zp-Wb=kAHTlQ$(3>d~s@WQEEwifJ=5jkVk}5R7AO_ zuYZASRaj&`hG%05zi&QUT L3-`?tOkRutn-evR delta 153 zcmZ3)zKDH7g{^;jMV^amU}8~zp-WbArn#HHah6*^d~s@WQEEwifQz|vWkixkfTwXv zW}1&dl5ep=Zdg`Ys%Jr}fvfk#txaOs4Vdi9Xp1HlW{?<=RvF|vc>&`hbSZBqj|vOd KoXrtTUW@=r+%=B? diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--SetupIntent.list.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--SetupIntent.list.1.json index 85762d7b116aa58fb9f0e217cce48e67eb82fe28..86512779df6b03b56fab49d7b75b9591caf3a9a7 100644 GIT binary patch delta 99 zcmcb^aff5VEZYFj(qtFcz{H~bLYJ)KLU*qK*Q%(B_~O*$qSTW30GI55^rCV{H*;5m j&?3vQz`(HV{Gce8$|S=~!zzP`*QbeLH(+x!<4q<2KuILn delta 99 zcmcb^aff5VEL;Edid+}hz{H~bLYJ&!Q*VRZ{Ls9B_~O*$qSTW302gy-|6E6}YztS% jGEcu^)2bAM(lF=re6RcrGnasg*QbeLH(+x!<4q<2FE%84 diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--SetupIntent.retrieve.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--SetupIntent.retrieve.1.json index 07472c7cde91f96091529a8abf3b5ebbd2bf8042..cac481c8601f7f084ed41d40ac8f1e455d16294e 100644 GIT binary patch delta 153 zcmZ3)zKDH7g>8UmX^M+$U}8~zp-Wb=kAHTlQ$(3>d~s@WQEEwifJ=5jkVk}5R7AO_ zuYZASRaj&`hG%05zi&QUT L3-`?tOkRutn-evR delta 153 zcmZ3)zKDH7g{^;jMV^amU}8~zp-WbArn#HHah6*^d~s@WQEEwifQz|vWkixkfTwXv zW}1&dl5ep=Zdg`Ys%Jr}fvfk#txaOs4Vdi9Xp1HlW{?<=RvF|vc>&`hbSZBqj|vOd KoXrtTUW@=r+%=B? diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--checkout.Session.create.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--checkout.Session.create.1.json index 952a0d9ad2b5b31069e52be542ef91ef76eb4adb..a2510cf57ed27850cfd5a1da07800b302560f3c7 100644 GIT binary patch delta 258 zcmX>tbWUgk7o&D@YEfBgk-k}SN~&p^d7`dint7_OiKV%PuBEx58IYA`W|^9lmTZ}p zy4i&BFq2+HT4uUIVL@SOwo_D)rZ~G;n*g}8RsjG2 delta 255 zcmX>nbXsTw7o%2DYGO{Vev*kN z$&=MsN`=5y#FrMQ7R6_#C|M~e8Esz2a)eRLKfNN?#WgUoD8JAptJu`rAU8iWFJN*9 T+Y=I8HF-Mw22veW%5f6_*F;lM diff --git a/corporate/tests/stripe_fixtures/non_sponsorship_billing--checkout.Session.list.1.json b/corporate/tests/stripe_fixtures/non_sponsorship_billing--checkout.Session.list.1.json index c27d5b40f955b7d5515a8c172696b00089c83a85..0fbad52a65131d08f8a85cd0dc7f5848de4cc85f 100644 GIT binary patch delta 260 zcmca8dPQ`D3!`>%YEfBgk-k}SN~&p^d7`dint7_OiKV%PuBEx58IYA`W|^9lmTZ}p zx;c+gpII*=Ei>Jqu%NIs+bJr@)6B;#**U7vKinlG%Fr#sy}-md%%z|>IV?LPARs?G zW%6m3USWtG@ufgIJ~KthNrfaH9y;Is(ewD1%c(*nOpPcQd8qs(NtOjG9+DCP7 delta 35 rcmX@ac8G1m3`Q~kic(h>*TBT0{6d$k;!Iz|^3<>(zs>6yr!WEl>2eIu diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.1.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.1.json index 627cebb8792ecb784f7ad8a15df0a153c7b839f6..1b2fa2b4e546ab6404d45e4ac3fcc08772f4fa16 100644 GIT binary patch delta 35 qcmeC?@8;i7!YUTvSz7Gk8kks=U+9um92!xXW#}KAy}65(kqH3U9}Bhs delta 35 qcmeC?@8;i7!YbxpQR?dA8kks=U+9umoat*=o*EY9x4DazkqH3Ty9=QJ diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.2.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.2.json index 627cebb8792ecb784f7ad8a15df0a153c7b839f6..1b2fa2b4e546ab6404d45e4ac3fcc08772f4fa16 100644 GIT binary patch delta 35 qcmeC?@8;i7!YUTvSz7Gk8kks=U+9um92!xXW#}KAy}65(kqH3U9}Bhs delta 35 qcmeC?@8;i7!YbxpQR?dA8kks=U+9umoat*=o*EY9x4DazkqH3Ty9=QJ diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.3.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.3.json index 627cebb8792ecb784f7ad8a15df0a153c7b839f6..1b2fa2b4e546ab6404d45e4ac3fcc08772f4fa16 100644 GIT binary patch delta 35 qcmeC?@8;i7!YUTvSz7Gk8kks=U+9um92!xXW#}KAy}65(kqH3U9}Bhs delta 35 qcmeC?@8;i7!YbxpQR?dA8kks=U+9umoat*=o*EY9x4DazkqH3Ty9=QJ diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.4.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.4.json index 627cebb8792ecb784f7ad8a15df0a153c7b839f6..1b2fa2b4e546ab6404d45e4ac3fcc08772f4fa16 100644 GIT binary patch delta 35 qcmeC?@8;i7!YUTvSz7Gk8kks=U+9um92!xXW#}KAy}65(kqH3U9}Bhs delta 35 qcmeC?@8;i7!YbxpQR?dA8kks=U+9umoat*=o*EY9x4DazkqH3Ty9=QJ diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.5.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.5.json index 627cebb8792ecb784f7ad8a15df0a153c7b839f6..1b2fa2b4e546ab6404d45e4ac3fcc08772f4fa16 100644 GIT binary patch delta 35 qcmeC?@8;i7!YUTvSz7Gk8kks=U+9um92!xXW#}KAy}65(kqH3U9}Bhs delta 35 qcmeC?@8;i7!YbxpQR?dA8kks=U+9umoat*=o*EY9x4DazkqH3Ty9=QJ diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.6.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--Customer.retrieve.6.json index 627cebb8792ecb784f7ad8a15df0a153c7b839f6..1b2fa2b4e546ab6404d45e4ac3fcc08772f4fa16 100644 GIT binary patch delta 35 qcmeC?@8;i7!YUTvSz7Gk8kks=U+9um92!xXW#}KAy}65(kqH3U9}Bhs delta 35 qcmeC?@8;i7!YbxpQR?dA8kks=U+9umoat*=o*EY9x4DazkqH3Ty9=QJ diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--SetupIntent.create.1.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--SetupIntent.create.1.json index c00c853dd81990dc328b0fd4dd2c00122905bffe..ee193c85086e199351a282ccb4c9f5d431b7013d 100644 GIT binary patch delta 153 zcmZ3)zKDH7g>8UmX|aoIU}8~zp-WbAnR%gwySsBid~s@WQEEwifJ=5jg?oNwfp3X- zxwBD{NwP(XnYWi=cyNZFce2;StxaOs4Vdi9Xp1IgVCtG&;N_Atc>&`hG^x;t$}B_w L;Oxy2OkRutTgEl0 delta 153 zcmZ3)zKDH7g{^-@sjG`?U}8~zp-WbAqF+`;n5$`ad~s@WQEEwifQx@dU`ViKXi-G2 zr$LcRRdR4;l8;+>hGTYcifi%2txaOs4Vdi9Xp1Hllwp#RSCwHjc>&`hG^tEq!}8Ry LAivEKOkRutv6?o) diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--SetupIntent.list.1.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--SetupIntent.list.1.json index 07261c6f3a084150e53cecce8d367b0ff33bf948..0e8cdc74dceb9056513a9dbb22915dcdf0b824a4 100644 GIT binary patch delta 99 zcmcb^aff5VEZYFj(jphvz{H~bLYJ)K3TI#Q%sd~L_~O*$qSTW30GI55{J;{+fRX_J jto$ew6C+8UmX|aoIU}8~zp-WbAnR%gwySsBid~s@WQEEwifJ=5jg?oNwfp3X- zxwBD{NwP(XnYWi=cyNZFce2;StxaOs4Vdi9Xp1IgVCtG&;N_Atc>&`hG^x;t$}B_w L;Oxy2OkRutTgEl0 delta 153 zcmZ3)zKDH7g{^-@sjG`?U}8~zp-WbAqF+`;n5$`ad~s@WQEEwifQx@dU`ViKXi-G2 zr$LcRRdR4;l8;+>hGTYcifi%2txaOs4Vdi9Xp1Hllwp#RSCwHjc>&`hG^tEq!}8Ry LAivEKOkRutv6?o) diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--checkout.Session.create.1.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--checkout.Session.create.1.json index f151a7d554bea6d7c0b1f44f68ca5a67a4ef57fe..3ade166d1a0ad64fa05a9a4ab2e4afdc632e22ea 100644 GIT binary patch delta 144 zcmX>nbWUi)4`w}QbI0J)2v4&Vm*Rl*sASi0GiU$ufYkCdi*UmXe~S!{$YSpd^WY$_ zjI5HxkjZK+?Tp5o*RdR76btYyEpl-UOf1STbjd2NaP~FN%=2;C+`+b=kyKMlIc@>~ DBlt1s delta 144 zcmX>nbWUi)4`#j00-wa<)bs!si|`OH_jHS(G-q#9AETV? zsE9;Ii^*y%?Tm(-*RdR76!Whrb#ZYGOf1STbjd0~ D5cDwz diff --git a/corporate/tests/stripe_fixtures/upgrade_legacy_plan--checkout.Session.list.1.json b/corporate/tests/stripe_fixtures/upgrade_legacy_plan--checkout.Session.list.1.json index 8bc8cb038e615b69d5fbfb61284e38d3302aa2c0..b9a56f547061dc887b649f33577b443bfcc867a9 100644 GIT binary patch delta 145 zcmca2dPQ`@JQh7?bI0J)2v4&Vm*Rl*sASi0GiU$ufYkCdi*UmXe~S!{$YSpd^WY$_ zjI5HxkjZCQ<}(^^&SB+Y5)1GwEpl-UOf1STbjd2NaP~FN%=2;C+{gZ!kwjBBFXz-{ F1OP19F+uG-q#9AETV? zsE9;Ii^*qL<}(^@&SB+Y67#Ppb#ZYGOf1STbjd0L}(gFPpw1`NVG^Ci_pkB^KN&_d~D|<3LyS_J+o{`sMNi! z{ra{2c%EnTc|%GC#MpeEyKKyd5^Bkili<*4{g(lhp!k1zI(=gzhX5xZ4~rE#$|ec< zpIr1gRR4WT1*6@c442reBNI^@C`1|bkhFIkZ=SNz!%0F+5n+okZ`(DnZdVIBUp8Zf zj?(99vp0t&ZAyJl)*yWuZKStji7uNpGDq>_=Jxy7>#LvNE_uyYL+!R+ONb$$)4QUq zs`u%Ll(hR*I6gB&rpSiLThVD4b%>W!6QhA1Ew3yrQt!(Y)5xspyiW+nF@~)WxQ+0Y z$z;n7U+VToZ(+SEr+b6Q?xZNu+h~DB34+gRtmu6#(Eov3;qV|w;+#iXhu}Ah71U-y zpK!KVug;cgbFun}Zr$w1a%9U$({_!+E{O?jM7eu?4$HcPZ+}D9kw%0}p~i>ayCa)& v67UOD!gxsr1;^ce)y7^A1A{v3nrJ7mgB_~3D`r(&-jk4Q@$jmiz0Cds{r2zaPy?cze?8V(nzp1OS zLj~bdkvWLNaHVs9$BjmOKgtMa#uk+~t3(Ry^VPRcA3k1QpKoc+CqZR*P6@Eyqg6w$ zELDG}17cM6XXf}o42dEMMrT;7pye@MN==M=H`&s(No6ra zHW3fV52C!2x-8+EJBVUwWJ?rEyziWSA(L+fdYY1HC%8t&adTU0L#O(lKpjtwd|()0 W`l4;KSgFkqjR}(Y^;A83oc#gYT>J+B literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.1.json new file mode 100644 index 0000000000000000000000000000000000000000..2deed286cd0e71399831aea2ec25e7e2cecc00be GIT binary patch literal 1917 zcmaJ?O>f&U488AH1UfH6Fkov@2#QR{YGuilpv;1Jd_)eBMFb4C<+TD`jp;>G=BN|v7F*^mgvL@8DU?Q_G!nAl z6$Gq(iyD!)Bg_6Np$g+k&>Q_&*Mf>qj92!G5 zL>dV3i6)bNEYD&$k{QwFu#t1uSd*VO5CayI!i^~-(ws1HmP_SDob4v5Y(U=al8Ejb z8hIpvN1sD2Ww%l1&pXSd9E_|JcvnN~L*37*RonH3*0A z#Zgg?EH&;4xX!7#^l3Zu4(Bc2@KE=rLT|)ic+-^%@?`#~$68lbY!ENM>$$1#PWaR9vH9#Cn3 z_g*Y0(auHqzU!<@(iL0}2Z0`hMp4*JH6$XQ4r*U)Bb_+VP@dC|=$90xYx(T*>&5Eo z?EIT>_WtbFuazx+|N3}5(20k)gf<=5AcGMDH9}M(27tx3|bp&MUxGT5uaxHwzaA#;}9+v2krN1>&>_&XGLb@&+}7O4yh0 zP1n25eV^DGOZ(}xgz9uEj-i;Il*Oz%eOtbU`h<=vm9?iI%)lz}EZrXH%Mw30GvbA9 zSsNx8-^Y5B9`Yt~ZKcpabX?y=lW$blrDMwcu^?6)R?v2_T|?p(ed&wEB|_X`eB9`# G7k>ey@(R-c literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.2.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.2.json new file mode 100644 index 0000000000000000000000000000000000000000..2deed286cd0e71399831aea2ec25e7e2cecc00be GIT binary patch literal 1917 zcmaJ?O>f&U488AH1UfH6Fkov@2#QR{YGuilpv;1Jd_)eBMFb4C<+TD`jp;>G=BN|v7F*^mgvL@8DU?Q_G!nAl z6$Gq(iyD!)Bg_6Np$g+k&>Q_&*Mf>qj92!G5 zL>dV3i6)bNEYD&$k{QwFu#t1uSd*VO5CayI!i^~-(ws1HmP_SDob4v5Y(U=al8Ejb z8hIpvN1sD2Ww%l1&pXSd9E_|JcvnN~L*37*RonH3*0A z#Zgg?EH&;4xX!7#^l3Zu4(Bc2@KE=rLT|)ic+-^%@?`#~$68lbY!ENM>$$1#PWaR9vH9#Cn3 z_g*Y0(auHqzU!<@(iL0}2Z0`hMp4*JH6$XQ4r*U)Bb_+VP@dC|=$90xYx(T*>&5Eo z?EIT>_WtbFuazx+|N3}5(20k)gf<=5AcGMDH9}M(27tx3|bp&MUxGT5uaxHwzaA#;}9+v2krN1>&>_&XGLb@&+}7O4yh0 zP1n25eV^DGOZ(}xgz9uEj-i;Il*Oz%eOtbU`h<=vm9?iI%)lz}EZrXH%Mw30GvbA9 zSsNx8-^Y5B9`Yt~ZKcpabX?y=lW$blrDMwcu^?6)R?v2_T|?p(ed&wEB|_X`eB9`# G7k>ey@(R-c literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.3.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.3.json new file mode 100644 index 0000000000000000000000000000000000000000..2deed286cd0e71399831aea2ec25e7e2cecc00be GIT binary patch literal 1917 zcmaJ?O>f&U488AH1UfH6Fkov@2#QR{YGuilpv;1Jd_)eBMFb4C<+TD`jp;>G=BN|v7F*^mgvL@8DU?Q_G!nAl z6$Gq(iyD!)Bg_6Np$g+k&>Q_&*Mf>qj92!G5 zL>dV3i6)bNEYD&$k{QwFu#t1uSd*VO5CayI!i^~-(ws1HmP_SDob4v5Y(U=al8Ejb z8hIpvN1sD2Ww%l1&pXSd9E_|JcvnN~L*37*RonH3*0A z#Zgg?EH&;4xX!7#^l3Zu4(Bc2@KE=rLT|)ic+-^%@?`#~$68lbY!ENM>$$1#PWaR9vH9#Cn3 z_g*Y0(auHqzU!<@(iL0}2Z0`hMp4*JH6$XQ4r*U)Bb_+VP@dC|=$90xYx(T*>&5Eo z?EIT>_WtbFuazx+|N3}5(20k)gf<=5AcGMDH9}M(27tx3|bp&MUxGT5uaxHwzaA#;}9+v2krN1>&>_&XGLb@&+}7O4yh0 zP1n25eV^DGOZ(}xgz9uEj-i;Il*Oz%eOtbU`h<=vm9?iI%)lz}EZrXH%Mw30GvbA9 zSsNx8-^Y5B9`Yt~ZKcpabX?y=lW$blrDMwcu^?6)R?v2_T|?p(ed&wEB|_X`eB9`# G7k>ey@(R-c literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.4.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.4.json new file mode 100644 index 0000000000000000000000000000000000000000..2deed286cd0e71399831aea2ec25e7e2cecc00be GIT binary patch literal 1917 zcmaJ?O>f&U488AH1UfH6Fkov@2#QR{YGuilpv;1Jd_)eBMFb4C<+TD`jp;>G=BN|v7F*^mgvL@8DU?Q_G!nAl z6$Gq(iyD!)Bg_6Np$g+k&>Q_&*Mf>qj92!G5 zL>dV3i6)bNEYD&$k{QwFu#t1uSd*VO5CayI!i^~-(ws1HmP_SDob4v5Y(U=al8Ejb z8hIpvN1sD2Ww%l1&pXSd9E_|JcvnN~L*37*RonH3*0A z#Zgg?EH&;4xX!7#^l3Zu4(Bc2@KE=rLT|)ic+-^%@?`#~$68lbY!ENM>$$1#PWaR9vH9#Cn3 z_g*Y0(auHqzU!<@(iL0}2Z0`hMp4*JH6$XQ4r*U)Bb_+VP@dC|=$90xYx(T*>&5Eo z?EIT>_WtbFuazx+|N3}5(20k)gf<=5AcGMDH9}M(27tx3|bp&MUxGT5uaxHwzaA#;}9+v2krN1>&>_&XGLb@&+}7O4yh0 zP1n25eV^DGOZ(}xgz9uEj-i;Il*Oz%eOtbU`h<=vm9?iI%)lz}EZrXH%Mw30GvbA9 zSsNx8-^Y5B9`Yt~ZKcpabX?y=lW$blrDMwcu^?6)R?v2_T|?p(ed&wEB|_X`eB9`# G7k>ey@(R-c literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.5.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.5.json new file mode 100644 index 0000000000000000000000000000000000000000..daa0843dc24d6ff39d30626a1ae1d00f736d889f GIT binary patch literal 1919 zcmaJ?O>f&U488AH1UfH6Fkov@2#QR{YGuil)dXb?W%<);)w~Meg9o<;H(M@G z08WBuSBgOyzgM7t-BCKy)oH({^j!f=MSGQuFlV}(H>Bl zwN(;$}Rv_>8NksRa zMjlDv(Pyfq7jZ6eoJ3JpZZ^-VPSN;OS)Oo=}h#D>EL>L#{pNW7vieX+Pih&zmr8~ya+ EFLTKXegFUf literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.6.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Customer.retrieve.6.json new file mode 100644 index 0000000000000000000000000000000000000000..daa0843dc24d6ff39d30626a1ae1d00f736d889f GIT binary patch literal 1919 zcmaJ?O>f&U488AH1UfH6Fkov@2#QR{YGuil)dXb?W%<);)w~Meg9o<;H(M@G z08WBuSBgOyzgM7t-BCKy)oH({^j!f=MSGQuFlV}(H>Bl zwN(;$}Rv_>8NksRa zMjlDv(Pyfq7jZ6eoJ3JpZZ^-VPSN;OS)Oo=}h#D>EL>L#{pNW7vieX+Pih&zmr8~ya+ EFLTKXegFUf literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.1.json new file mode 100644 index 0000000000000000000000000000000000000000..50f0bb123ab07d6a2b006fae857f4526dedbf55e GIT binary patch literal 1695 zcma)7U2oGc6n)>XsQgSul4V)T6G$7m+Ey2eYA#%UbI(UAl)t3Z_`i0k7iG`M>&xMBW+$HD4Vn zDxhSoa`b; z?|+VR?OZku3ULUXV@nE4sG2}q?VF5p{R5#KOFwS1`}w!TBM4$4HM*NQXJpZ07KU$| zk_-$SGwo4FdP@7Y=$ih!`|6>PwUDrIYYP{Hh2w8uZ`tkLKr1=sw_zy~Som$y5keZY zv^Vr`DCSx}`WgEzh<-ROdGc3*33%c W5PoFRny}ekFOt`R2un_0PW}RssJ&AF literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.2.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.2.json new file mode 100644 index 0000000000000000000000000000000000000000..7610e06a8167e6ac1b1d1122621043f0dfa990ae GIT binary patch literal 12910 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 literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.4.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.4.json new file mode 100644 index 0000000000000000000000000000000000000000..a509e3f7195f585c8643823c190e19353bd2958e GIT binary patch literal 19948 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 I3Ev+412bTyEC2ui literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.6.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Event.list.6.json new file mode 100644 index 0000000000000000000000000000000000000000..6d922067afeefefcba3c644d2dd8510c1d8984a9 GIT binary patch literal 81 zcmb>CQczGzNi0cJvQmhS)dBG`5{u(=^NUh}B58>^#i?My{G_bZ Xv?vE8pkHRFpIVlhS5mCRRm%kck@XgY literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Invoice.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Invoice.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..5d072c4ee5800272a6aa7a5c49e397864d7d861c GIT binary patch literal 7137 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 literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Invoice.list.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--Invoice.list.1.json new file mode 100644 index 0000000000000000000000000000000000000000..e39960ab7254f5b071e40ef45d6574c984929f3a GIT binary patch literal 83 zcmb>CQczGzNi0cJvQmhS)dBG`5{u(=^NUh}B58>^#i?My{G_bZ Zv?vE8pkHRFpP5&dpP8Imti)Bz1pvYK7f%2H literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--InvoiceItem.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--InvoiceItem.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..c351f1fdd5acdaf9cae7a1b1411840fa231375f5 GIT binary patch literal 1121 zcmaJ=%dQhK4Bg+a7|jYKkfxU_kk}z$fy7HJK`6>3F4r`VA&-ixy8n)yq-_Q&W;L;o zPmYhB-a_D@%29m$^yR~=_wT;G zeM4oNiqSFw8gIKL&Ke-R<4&c1J`|Xr ze}ZC*#>RmOY$aVFpy&IKWE&Yr&Cp@pK80hFfe9`Nf>-jzNH*oHX$e(iBa|wUNCKQK zAi5ciAx$ z_q)7^9q?Xt)c-h6SchuoWNEHLUM5j(;_(o830~(qA^u(KtK%nB0B)UpTi>4KZ!yEY z+@mk6on2f&;TFlh#-9*E6m3&FIVngNw?0_$D@&I!{nc1HEM+?0fk;TrG(Mix#pLec zk;*P7H0iL?@PHd=yzEWzLADol-i@)-u_?P7^W49^llYOlrh4e!5gn3H#;aXtP_Ku= Moz^~cRq4acAH1kNE&u=k literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--InvoiceItem.create.2.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--InvoiceItem.create.2.json new file mode 100644 index 0000000000000000000000000000000000000000..f6b553cfa627a7ebec263720368b23d8111994b3 GIT binary patch literal 1094 zcmaJ=%WfMn47}$n44r%MYmv0K7RjMNA3%>O3PG!-8`fG$)x&6DO{~`o)JF(L#)^5Tj-tsy9rqQzk;`Iauh3>|>1FIpxenwD$JnF+pJUaPy-aV;5vWF*i zKv!-#+vq{#4#~d8pAbTn?NVlPQcyPTTo~o=tZc&c&tU1l%^iWOq!I$8L=AezhftvHigml)Y#82 z&(F@~uIqX|`Q)g7)4jfb*zI<&BxX_w;LH<8`xM8%1|#_if&@*9>dWKT&u>3{{Py8J zm+cE?)C8R0bEJH^a)f9C&V=4c@w-%rx`Wl!jTnt6=ng(~`}=P4j*hX?)tnxz&>pmn zP#9|>a`gL;9Kun!5x2UoIu?cK&K`}hxnymww0MTekJ}q2AkE!q240>s%n!f7h*5pz zK!U00oFSl>`!DPs`v*=ATNgMSNe3ZV6AUlpv(@6wqG=9AWF^#wSR?}$3z%*|Ytj8w z(HvotWY0QOa!6SfBTN7u$W1M`Ml2P1Hkm{%n{ide`Qma`_p;H9z2&Qfy+5T{oj}&B zq5jWt#yT`7r*m@+a-Br6NyfwAIruS^3CZtPUs+H_1(4R+x9#nu|EK|u`iwqrcye(D zg9l{$DnB8FsOqLPawupQd3z`IJ84Hq|1?HVbDoZOpa{8{$|sXrOPAWEqpT zGT(yf*R2UY==!Xd&FC8y`@Fd^4ebNGO7Ep-u7~Co@qv`F-kchHS~(nEm9~jnI-l?U E0#^t?6aWAK literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--PaymentIntent.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--PaymentIntent.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..5b6cc460857dae5518ee6347d4ea36a2dd42e0bd GIT binary patch literal 6098 zcmbtY+in{-5Pi>A2t*%STT-3aEl{*gVh2i{OXJ#U925(ROG&i%7G7j2MgF}r!JAX6Dd>H+ z9vIc0u-<44Z+(jEjkjyhcH9!HNWL&dYE`W3y|ndF@VLGZ9r&n1-^2AmbDE(O6D?_> zD60cS^rlGOzWeaz_siMs`Af)__Ge<9YC*3l5hY7vy8I4lH zFiGVOA>73$!~0M)9Truk(lkq0nf4uJ?*y^-qB_R7Zu1-ez#qbMD1?CvNI`SI8PmuA zkZM&HUeK%uXA(v;W*|)=fvp8L%~P(J6qPO|+(mA$FK6#Z&#$j$Z_lr;LeJM(jP<6a z;qA?YLCV9KAeb~!3&loCUNH19F)EGDGzzMY+nbqDaRx+j_g1>PCfC(c(v**MIl48O zs7B9?f_NzP{ph>1@zHp+8BL##ei(f>b^lDJ;k9s>7DX2%oF7RlRArjz1n;N?_|65* zROo>PM9N5>3@5k8iTVPsJeVHDOLKS(UHWhaW-KH%X_)_Egaukh*edp96P0n~Q&Fr- z!3M6#09SLDyxo@qDAF3896r~Nn%8v++i2!$4a`7TOB%4FS+)(r04eTwDYoLNvCV*l zCV~o}IWH7|CoRAon6dc6=FIrKS{dt~OrOTG3UDXU!X?{eeA1ChxF@N&OzJc6h%<0p ztR}%Pnj^+%d9s2sN42k*fkzsWN^!Y{3)*PG1EMVkG!kFfWJU9g>)+gdR_2dwbkPk{ z8O~Qwd;m4B)AnAiw-pAM7*{Z45Esh%9cT6_E@Xinq%4v-U(sxllnXehlgp({twX!Z zM#FRP;wVW9t{+NyZ^6gdAknIlB{cD5zD;UraJltfr<*otCxyCCGQQ@Bk)$YPPP5Kl z)KILHXh_iMtkbd#BGDEZdGEUZ2<)yPDEufs%li=$Z&gb172s~rl@+x?>L8>aDMX>` z1g^wECF(c2Sp*+i<;mpT``PC9<@ujfmS0}psjVodpZ>lG^PR*SL%3+n1~)J&5ir6a z!K#}vux|ZR!x7F002JrY!!6*fg`$za@az?5_x(#*D5^@MM#BrglS0_!Hzu&8U{mQ!q9)A97ACxt-6 zh}AgJH=Eeia1J(NR}0Wza3Bs63#|yy-5Rxk>4(coLMp-4q%$+c;0ed$qz5}t720$v zbT>?*fOUjb7+8G74=~mgbPY|zwy!rYP9M(I`Cszv@7c4nS;bGLAJgkM*~Rkgbn)@@ z%f+9sr|P8$su7;m(6a8-hO=`HBuU%qGXc{}v{9FiwYX6t zZkV+%kJppqnytd`oh=NUi*E_QHxBk%@P}Tu5w#Lk<-jV238G3PhXz%*?zrS)C>3_n zoQO08Zm@W4@eq2ZCq{`fi-p(>SlocOGK_JKq`Gw}u^bodO6ov$Ue$<~vNZUSBd9R^ z+%X!}f!z_(;b4+Dj1y-M=?CyvKO?xQfP)adwn(eX_jrQub>AP3jxy`0>hqfBs)kZ0p#k@OIUoASP~!K|3@i_ z8_M^%!M(Ciwrt~TzBX|wEd%#C0#alYFw7u{g5-FV)d5xN(>Bs0Yz^r;kg7HMLnQ4$ zdgj#-!CHz!c2F_`)6HHo7IUgcXjrU#5CI$55>u~Tq^oIz0o`(SQ}B&Wn$KNLkXty8 zi_zuG4(`<%?$M`@v4YMP;EPamOZWn7i?02c))?l^al|8R+ZLF*%z^9~^ZX1K9OAFB zb4xpNMaz~xq9 zhDAL-K0ea>(Rf@y+Zrt)XlIKLV;hZmlfyB%hNDunuxro;(O}p(MSYM2E76#oEIa}Y zIi%4kkx+UJoL3MAEvAd*>}6eEd;#yC$_JY77L!{qw?~{U|$*YB;=t>H73MAK(~pY=6igi!WR*chd*D`v-23BdH-4s%_vgb;X<&_qYL5 z30L)VhD(rg+vb(-opx`(-+g-5Q4LdsbhgrU^xd*37OTy`<1@U=^GS$3?;|g&1fQnR zo%npTK>P)soX&8I;o14eUK2U&@hPS$gpEfODlJ{~$;Sdt8(-vl2Yz=po(T)P7L%+W vJz4zuGh0sD)&@l+6#p0z1qdG z{P*ke^1a9P^=3N%Q!eI4#l^gy)(dfjN>x>ak_u18hp%@gq(LBXTb)oY?!JEhIKTaQ zGo#Q+U!(-o!LeR-T728W%~q9=><- z0cvF{>8oMx`JTM(mD;)1F+IAw(| zKsbocKCA~Qvn#+Ru?DdY0J7wDOo6Et>TnaHyON^Vb+4Y?0qFSJ0z=+kUT%;fcX_{$ zs-STz3o;?d|EP&k#l*D)L!^Dg!EN?BB~+^n*;f?}fXEk~TQcC>RMZM(n>8T-1F*ba&@{CC`P-{Us!}lBme*a literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--SetupIntent.retrieve.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_business_plan--SetupIntent.retrieve.1.json new file mode 100644 index 0000000000000000000000000000000000000000..a67bd95a005b9cc9e36a3d2e60a100e116ec1eb2 GIT binary patch literal 930 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 GC;tEm96+%E literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..a5a64c5447cd23e5bef7c04beb8be6655826f846 GIT binary patch literal 795 zcmaKqO-~y^42JLd715p>L}(gFPpw1`NVG^Ci_pkB^KN&_d~D|<3LyS_J+o{`sMNi! z{ra{2c%EnTc|%GC#MpeEyKKyd5^Bkili<*4{g(lhp!k1zI(=gzhX5xZ4~rE#$|ec< zpIr1gRR4WT1*6@c442reBNI^@C`1|bkhFIkZ=SNz!%0F+5n+okZ`(DnZdVIBUp8Zf zj?(99vp0t&ZAyJl)*yWuZKStji7uNpGDq>_=Jxy7>#LvNE_uyYL+!R+ONb$$)4QUq zs`u%Ll(hR*I6gB&rpSiLThVD4b%>W!6QhA1Ew3yrQt!(Y)5xspyiW+nF@~)WxQ+0Y z$z;n7U+VToZ(+SEr+b6Q?xZNu+h~DB34+gRtmu6#(Eov3;qV|w;+#iXhu}Ah71U-y zpK!KVug;cgbFun}Zr$w1a%9U$({_!+E{O?jM7eu?4$HcPZ+}D9kw%0}p~i>ayCa)& v67UOD!gxsr1;^ce)y7^A1A{v3nrJ7mgB_~3D`r(&-jk4Q@$jmiz0Cds{r2mUt(>ErP_psvev{|C%Nk=CB zlM62SqJJDIp_P3|u#vP{t^>*di6Fe{qjHww)$gQL|1KiL0Dpj=H_aMYH>(BzSXX0* z3c{r#a}|Alt8&=GSEAz$Mk>XVT-#VL&#PcO1rtROcF{sGIydbO>HVUE6~%FOgq6fGL9cVOKs>>-xH|QsgVy11597E TZ5AuF`JpjE62D%mXV0@g>+Ady literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.1.json new file mode 100644 index 0000000000000000000000000000000000000000..4396554c4415a21ee1db77418f1451b402c35450 GIT binary patch literal 1917 zcmaJ?O>f&U488YP1UfH6<9XS-(*`t$0$aNe?6RT|6q%0I%91O|X|iJfeWVmQPL?jW zh~y*rNIpNGO(slKl>_hDhl%O6enn49p@orvPv`N!bRYs$_tpp|*-!34yrh4v5=RN$pkT~OBGJNw;h)x8ejg9o<;H(4&{0P|%z z74K#&MJO+AA7KV?Xob=g--uR2_?Td%ZBvM%&Y0{yzrOkY<7BLRP$j zfVJ;YBl3P^**_&zVLST6qy?yGtq?kPn9>qWg|U z9!cQQ=TuACZPfY8&T=gWBkKg-)zJD-Ii}u^g#G+6t`s&MZ>E)V-4DYPug zVjO57JXv>w-!-nTSZbQ!?LY&S!s38NPj~x%&`PHUs4O%~+LOU?Okrpo0I#?QR2tyD z7b{A1a1p-mI_r{j1=qt#peLbG6b@4jiHN6@+85hMCk`}}m-Hk0C57o)KD+sPwXv6r zZ^GHf%X@#d2#f1YQ4e(D;jN)f$2G`c#6XP@l?Z}*+?QvU_aLcwT($!($%L}7?TD9j zE|Gv;G^?!*vG)BfGL-WQaFtfvM%B&2g@G~bWPNO0TTFpCErN3-Pq(~5&7cyF<$Krl zp>y9Sw#L$aF)g9Gn2NVhOy^}Wt1jM`Z=jyjaiy}3^n)4L1fHea1ASTI2WLjSusv(T z1mpWyZ_-2FM6RtA8ibi7HnLif9hQkKhF1Bk(yrM6CvA9Ht2aJy!{paj2 Dx-bgf literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.2.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.2.json new file mode 100644 index 0000000000000000000000000000000000000000..4396554c4415a21ee1db77418f1451b402c35450 GIT binary patch literal 1917 zcmaJ?O>f&U488YP1UfH6<9XS-(*`t$0$aNe?6RT|6q%0I%91O|X|iJfeWVmQPL?jW zh~y*rNIpNGO(slKl>_hDhl%O6enn49p@orvPv`N!bRYs$_tpp|*-!34yrh4v5=RN$pkT~OBGJNw;h)x8ejg9o<;H(4&{0P|%z z74K#&MJO+AA7KV?Xob=g--uR2_?Td%ZBvM%&Y0{yzrOkY<7BLRP$j zfVJ;YBl3P^**_&zVLST6qy?yGtq?kPn9>qWg|U z9!cQQ=TuACZPfY8&T=gWBkKg-)zJD-Ii}u^g#G+6t`s&MZ>E)V-4DYPug zVjO57JXv>w-!-nTSZbQ!?LY&S!s38NPj~x%&`PHUs4O%~+LOU?Okrpo0I#?QR2tyD z7b{A1a1p-mI_r{j1=qt#peLbG6b@4jiHN6@+85hMCk`}}m-Hk0C57o)KD+sPwXv6r zZ^GHf%X@#d2#f1YQ4e(D;jN)f$2G`c#6XP@l?Z}*+?QvU_aLcwT($!($%L}7?TD9j zE|Gv;G^?!*vG)BfGL-WQaFtfvM%B&2g@G~bWPNO0TTFpCErN3-Pq(~5&7cyF<$Krl zp>y9Sw#L$aF)g9Gn2NVhOy^}Wt1jM`Z=jyjaiy}3^n)4L1fHea1ASTI2WLjSusv(T z1mpWyZ_-2FM6RtA8ibi7HnLif9hQkKhF1Bk(yrM6CvA9Ht2aJy!{paj2 Dx-bgf literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.3.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.3.json new file mode 100644 index 0000000000000000000000000000000000000000..4396554c4415a21ee1db77418f1451b402c35450 GIT binary patch literal 1917 zcmaJ?O>f&U488YP1UfH6<9XS-(*`t$0$aNe?6RT|6q%0I%91O|X|iJfeWVmQPL?jW zh~y*rNIpNGO(slKl>_hDhl%O6enn49p@orvPv`N!bRYs$_tpp|*-!34yrh4v5=RN$pkT~OBGJNw;h)x8ejg9o<;H(4&{0P|%z z74K#&MJO+AA7KV?Xob=g--uR2_?Td%ZBvM%&Y0{yzrOkY<7BLRP$j zfVJ;YBl3P^**_&zVLST6qy?yGtq?kPn9>qWg|U z9!cQQ=TuACZPfY8&T=gWBkKg-)zJD-Ii}u^g#G+6t`s&MZ>E)V-4DYPug zVjO57JXv>w-!-nTSZbQ!?LY&S!s38NPj~x%&`PHUs4O%~+LOU?Okrpo0I#?QR2tyD z7b{A1a1p-mI_r{j1=qt#peLbG6b@4jiHN6@+85hMCk`}}m-Hk0C57o)KD+sPwXv6r zZ^GHf%X@#d2#f1YQ4e(D;jN)f$2G`c#6XP@l?Z}*+?QvU_aLcwT($!($%L}7?TD9j zE|Gv;G^?!*vG)BfGL-WQaFtfvM%B&2g@G~bWPNO0TTFpCErN3-Pq(~5&7cyF<$Krl zp>y9Sw#L$aF)g9Gn2NVhOy^}Wt1jM`Z=jyjaiy}3^n)4L1fHea1ASTI2WLjSusv(T z1mpWyZ_-2FM6RtA8ibi7HnLif9hQkKhF1Bk(yrM6CvA9Ht2aJy!{paj2 Dx-bgf literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.4.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.4.json new file mode 100644 index 0000000000000000000000000000000000000000..4396554c4415a21ee1db77418f1451b402c35450 GIT binary patch literal 1917 zcmaJ?O>f&U488YP1UfH6<9XS-(*`t$0$aNe?6RT|6q%0I%91O|X|iJfeWVmQPL?jW zh~y*rNIpNGO(slKl>_hDhl%O6enn49p@orvPv`N!bRYs$_tpp|*-!34yrh4v5=RN$pkT~OBGJNw;h)x8ejg9o<;H(4&{0P|%z z74K#&MJO+AA7KV?Xob=g--uR2_?Td%ZBvM%&Y0{yzrOkY<7BLRP$j zfVJ;YBl3P^**_&zVLST6qy?yGtq?kPn9>qWg|U z9!cQQ=TuACZPfY8&T=gWBkKg-)zJD-Ii}u^g#G+6t`s&MZ>E)V-4DYPug zVjO57JXv>w-!-nTSZbQ!?LY&S!s38NPj~x%&`PHUs4O%~+LOU?Okrpo0I#?QR2tyD z7b{A1a1p-mI_r{j1=qt#peLbG6b@4jiHN6@+85hMCk`}}m-Hk0C57o)KD+sPwXv6r zZ^GHf%X@#d2#f1YQ4e(D;jN)f$2G`c#6XP@l?Z}*+?QvU_aLcwT($!($%L}7?TD9j zE|Gv;G^?!*vG)BfGL-WQaFtfvM%B&2g@G~bWPNO0TTFpCErN3-Pq(~5&7cyF<$Krl zp>y9Sw#L$aF)g9Gn2NVhOy^}Wt1jM`Z=jyjaiy}3^n)4L1fHea1ASTI2WLjSusv(T z1mpWyZ_-2FM6RtA8ibi7HnLif9hQkKhF1Bk(yrM6CvA9Ht2aJy!{paj2 Dx-bgf literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.5.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.5.json new file mode 100644 index 0000000000000000000000000000000000000000..b4d2618befd099ddc2bef52465ae098533c305f5 GIT binary patch literal 1919 zcmaJ?O>f&U488YP1UfH6<9XS-(*`t$0$aNe?6RT|6q%0I%91O|X|iJfeWYYNPUbGR zh~y*rNIpNG&1Os#g#+)|hnZ=$enn4fp@orvPv`N!bRYs0_ldb31H{ZW}`h4|kb%~93fXZyG zlE51WrP`5a^g19Trk}zb9*AOa8RiscFg3?IH zh8Ga9_5*4}J`An*PYG3^S@dnw8~s@1!%dnn2P~#y$dFAL8ta45T-t&*?02}|;*N*1H3fPj2E(f^R2Zk;fB{FB&P#`n8Z!;_8aErU~8-G*Brl4rugrcjyPLbZUUwLbIej863wHhROl(f_p%z0p5DC zp+rX);oGLME{RugEldJE35}v~oN7o!JWZ-!Y$KgG&`@5|kLZ^arm6Yj=IhnYUar0g zXCE)`{naY0u6J2E(8;vgLY^ZMco9+Y1*4#<0oy*toWs0&!{t=SZHed4-xmC7jB4*Y&Y; z+a|Wg(ta_|p}3ffw~)=3dA2An-sf+iT+(r+vQG4a8Q2BhOScF5vcwNgJSlcyZI~eO z#m0J*9{Nq>+Df5;=(xR$CSR$hNypUl$AZ{#*g@UIb`6PF^rbHrmk9BI@o}U7oc#rf C2MUP* literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.6.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Customer.retrieve.6.json new file mode 100644 index 0000000000000000000000000000000000000000..b4d2618befd099ddc2bef52465ae098533c305f5 GIT binary patch literal 1919 zcmaJ?O>f&U488YP1UfH6<9XS-(*`t$0$aNe?6RT|6q%0I%91O|X|iJfeWYYNPUbGR zh~y*rNIpNG&1Os#g#+)|hnZ=$enn4fp@orvPv`N!bRYs0_ldb31H{ZW}`h4|kb%~93fXZyG zlE51WrP`5a^g19Trk}zb9*AOa8RiscFg3?IH zh8Ga9_5*4}J`An*PYG3^S@dnw8~s@1!%dnn2P~#y$dFAL8ta45T-t&*?02}|;*N*1H3fPj2E(f^R2Zk;fB{FB&P#`n8Z!;_8aErU~8-G*Brl4rugrcjyPLbZUUwLbIej863wHhROl(f_p%z0p5DC zp+rX);oGLME{RugEldJE35}v~oN7o!JWZ-!Y$KgG&`@5|kLZ^arm6Yj=IhnYUar0g zXCE)`{naY0u6J2E(8;vgLY^ZMco9+Y1*4#<0oy*toWs0&!{t=SZHed4-xmC7jB4*Y&Y; z+a|Wg(ta_|p}3ffw~)=3dA2An-sf+iT+(r+vQG4a8Q2BhOScF5vcwNgJSlcyZI~eO z#m0J*9{Nq>+Df5;=(xR$CSR$hNypUl$AZ{#*g@UIb`6PF^rbHrmk9BI@o}U7oc#rf C2MUP* literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.1.json new file mode 100644 index 0000000000000000000000000000000000000000..bc0bb766df376ae25e96feb0d6494669d80cd4c3 GIT binary patch literal 1695 zcma)7%Wm5+5WMFr44$jRQXD((sRiPLfi!7*Y)}vsxvCgbqQZyjG|0bqNn5hzN6{Pt zf!xRJ%y9j7F&YuU93vk`Pxw6=y~Y1{${I;qFjndsFG)7e#>x0L$!6q37s3rN2Li9t zarf6>ZmV|nu%gbNfjf-eorOL^7_b(PYp+z79-xq%DOPj9tMTCcUwvaD_r^fYUr!Yk zP%y6?{ht`Cy@~ygpb1d2e(_L;c?za13=j&i+{ngl$@}A#Y%U#GXTcz;qdcDiO!G;? zW@*o7gf67z+Q+g-O`&2^VLwu`N`d>dDa&;=EFps;gnLUL9>0J2e82p$xI=jk8p*oV zk^^lF6mlIhV)VH%3(m>#E_2jhP_ru8LhyTI-+bUnm&GA zuJzsG8#DUl?%6IEZt<|riosA=q|n-d!TyK5;2o+hz#u-VBk3KEty2TD?*oC9Y@yO3 zc^oqdOhC*Nb^}>5on)z)-%hTf zn3A*bYgPs5hfI(f){b_{S_lS>{!ItN_YZNa9kM#OZ%SRCEFZiA__PF7nllA~=BJ;7 zTwBVfK_O0|b8Jmv4OJ6qt3#7PZg?P+W9ij4yPtngJc1xvsnOlcIU{qASs1==O0r|% zoN3QGGEmyLMc4G--B%BVY=nf?Z7lqoNIzN_mm^(4SdfI>-0)P~W(jhVCX?BOC-c03 zWG)IkxxN2 literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.2.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.2.json new file mode 100644 index 0000000000000000000000000000000000000000..7e5d2927005e9458ff9d3f6ba2463f7ef96d8e5f GIT binary patch literal 12857 zcmeHNZBrXL68^rw!ll}eYp@LtuvJ&L1W14c$g)SWu(dTM&&YUS-q1+KWGnyux;3MD zmBwTCt}1nPe1ODiNv(c;y4!#KFc=Vz3QB$+`~m+S4E|ET;ZvIU&XV!ek0V$llhI@} z9PJM$d*mlg;&Mg>^I&;A(m%yweyTnXPK;*{%oRXgeunpiv5fH3@&0tAcOxhHisRBm zNKR(~10o}Z#{~6*v~e<=Ap8VB{FXC}r+zbC!I{haW%iO57fBNME)|&^A{hkr6Ut?0 z&X`j?r%fqE9Kt!SlhButMZyW0Si~Ok-6D2r@Y_in>n7*<41RBCIK0Q^RVdL&|kYv(LlEkT?f#b%WUEqo*AQPIT;-UIg zHBZ$a5*C81cQ8OA8tOx7QvJ$3ocokEz%W9HRq^B$vKN$R3nk8XS_?M5N4QS%av)}9F0b( zpOOdqo8+ETj}1gTxRZgO4BpbzcYhlExU)4KtOn!pU^w`3GTIv9e@q;}dBTru0W*6I z@%%KAh4u{+$q6vI%xRFCgf<6D!02Xn#%3_gFV>qn&68-V5ZsR5YjZKMIpmFROy*a%%qS(S(HK|q7jG_JqRUI+|juS;~p8CWCT1U5QiP%XZAiG z?U+wWINa|fj5|3ac;wD>WTxgIR>3f>2BEWnXol2Z(HFJ^*mlY|;G!N|B~Us#UXcY2 z115gS&T-?g?*Wi-%7OqiUd9aaDFb=~cwYj_XItj8wSK@K7BTm~ zLZ;}YqJ%2ru;dhtGW|&8{sxGC6Lg{v$Y3f8C<&eM)u*#ne0=gN&2Tk_B`uPDLLBLvI= z-i*d*w=NRURP5qIb|<^$ObhRY91A($4jhy$Lm5CNsw!(+)XfS~K zYgG6QHp6sxz#s^t8xfsrRJ3jFGVCEx4N&gH2^P63SQ?42gOZ4i;11;HY*Qq|Sr2m$G7zS_|iLCE}!J-!|rf4e{+9z zcb+=CFUe#Y9vsFW!Z$|;?>>JxeUYo@^SgiX--qt?@!8?9atVnCKD1a)ODmh&MhlyENa0nr){5^+|zXK>OCa&jGPFUQ+?(+K`rVFf4!-)=}{ zW+Phq?AaOuNxJZpBn#!{AW70#@~)aGThH1y^DdLKR{CX0Y>=S}0V;(6*wGCFCzbQL zzv_5akrz|xx{P7dtF0fRdQHHzlUH;W5fo(iJeJu0M7oBfR~w>(LBp!n*i*M9k-80y z>+c|K>-nb!i5X1&M;At|yrO14#0`9Kc#N7{MMTnZN>1g7ouk|1NqEbW(}S}Mad`Um z`8bqM{(epN&^U|cK9mI*{d)9KJ38W+CptSgu-LnIL$rPU?XC^U3d|0P)dgbjODK3! zG`AV&syWs)Q=q~s8lW!r8NfaPhFjxD{pzlc2eI}#iay1LU5;X3SATDkACjI((MqrPdQ-i2YSxoZI>a%aDyKqrPyMcv~gwh~U!cyHNQneFP~rEX7a z+82%b6;;-^0B&rB77av^dzfOWFjBVrTa0UVvzoh#x+=jB-K8`DR#6`sZY!}V=clc35?i6E4WZ@ zo?6&aI6K%jO3Svq<*ocLs2_O4%!0&gnIi-`m(-mD>1)G>HnGjaucw+~y@qHWAdDxF1x=v3@h zks)8Kgv?fNtz(>OAEXk?2(>VM#lqhhn?k5p-&?>oPqVqbc2xR3LhSC5XvZ*AFBJ_h z9sHDt^_0@=0xh4?=diNA>3fIz zC6>=i#+nbT!|=A@BZ)0z$5#y;L86xLU;$R|F=WhWEaSyj3>J$*O3yLsvzB_Kwu}*r z8fNnWVzG7e(P3k&b!cd@DFe%`b`x|1lzSMR!sH576ITs580LQa;omgOk(mGh literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.3.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.3.json new file mode 100644 index 0000000000000000000000000000000000000000..b83e5557ec229ad453274e41e8c8aa772fd00f86 GIT binary patch literal 16887 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 F{{o{pLFE7d literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.4.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Event.list.4.json new file mode 100644 index 0000000000000000000000000000000000000000..2818c9da6e26129a7acee25642618a69a4b46d9e GIT binary patch literal 20475 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 Xv?vE8pkHRFpIVlhS5mCRRm%kck@XgY literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Invoice.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Invoice.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..2b0ad2bb0e323af3103c6cd3173bdfe1165e88cc GIT binary patch literal 7108 zcmeHMS&tkw5PsiZ(ee{Wxn>U$@dN}OBElgMFNq?{)9u+Y>vng1EZIc)?^OAA&vZ0M zfHs1Ch$2_HT(0AD*EjFax{k2EpPaJP|EurFmmT@-SMs11DK>Ik|DLHqv+f1kng`u; z)jw+0EPG4EU_etjDT9U4+a4V5e^M{aObp94%||AbP}fU=*^7B@*5_G@o>?)e=D4y< zcbrq^k8d=r<>MT0TaF2<96j1GX?XC|*@?2@mZ=`yx7wBU5zg)@+!zG!AyyDbuGm(# zCScWAW?hO2D1Pv!w?ay|57nF*e+4o!<(Lcs?e|PyUz{Ujyt@w#;6c0Zw`B&bma zZhCi^ly}hp*tOo3&6D)!&+VPoT=hQ7&J0o88L&Wig3C60y%%up4|9h8_|q>xeEs72 z%kRDgqnmm&*AS>dbCYfwPea2X!@NqgvS*{@_N#YJiuqALjSCyG(8{%=19aX`strhz zRHbpa4J(qr#f0PG3T?EGm6Cn++Dit$V@_H+v%8T)SLA4C<4MCzPW!qzkf2cw@yA$X zv!>T#Ue@a%jBh(oELP%Lz1wj*fWcag?{-)aw@~DGxxAgL0Sjx(WGve(*-ex6xhyLh z(k|5PB-)GYCj-@!B-CllUEbyUmI&3BLn^ae7||}Bhh4o}GGn3C6qDke?_bKbp0LF7 z0TN?pp*L=YSu{8_jSp*VIS2}aov(ZYcCitCGv>~Jcn+RnYQrB10;q~!Iv=Uf!%MYe zjS?*kyv`+g7Avvaf!|%qXt$emx9P@7*}d^amv+bWMriuzU(hEkX5+nwxOmdE{T<2_&%o4Ce_)l3nQP&}EF?5; zf*OV$Ep!D@091_zi#R8@K6r-u2dz|8(ekWAsW-uGSI7Vy9A9l~pp4QY-63orhGZ-}p3zGt_>;|6ic%)A%yeuW1u zTd{&`Lu17rn$b)dXw#9taZFiZj|Rft%~)s&#}S@* zFy@wx>tOy4z&dc+6@8Q8M$q9O=1l?-J#K#Ku%Lt~>9FMafw>dKpPBVydP2Ddh5 z1Op%N^8kJh-@K3olHwO3X9)mxfR>othAB69xp4$@xaY;ws}n$ep|#$VWP$N7@q4BF zh8fXU`6mhN*MgGde>aw&*G`;{<;}KrY*_1kQo8%EWBJAT)6Lc9>E%@^HfRs{I1X5T zaej6A#l_|2)zM=8PhxqUEeO?mzEF6tuzcb9r-|hkHK42`IjG$m9KXLnUPbAnF#d3J z5{@s`P6zUz!&ujS_KfMF3$s!uRCjrPdH#8gstLOPZD_x!oj4uZn{De*@sB`zp8SqO zdlvr>?I{#>wmvOrUwHm$Li++f*1_E?-Wzx??RDQi(-E~(m_GP6e;u3!z7OXwy=Su>yLlY((7=D%=`l4HkWY^TMFd{>m*(hq(;*BJ#ordv zj|DmyoG2s%dP9^Ow=IQMzKNrA9=~B)^b@Mw(Wzm-BI}(8JAw;zau)P}v-7-1Ees^2 zP!_nzIL>)T5}IsvixbEa}yi~YB7_mVO*sOcu7;H=MKEsv1fhioTF8 zMNr22Gh4@VDfLx3$YA%33_;wHD Soq-_WhaE6HCE{lv&i(|;L$p!= literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Invoice.finalize_invoice.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--Invoice.finalize_invoice.1.json new file mode 100644 index 0000000000000000000000000000000000000000..288a25a12490e2f4c539cbfdcd86d03a4d6a1188 GIT binary patch literal 7443 zcmeHMZI9G85dO}ui1MkGfW5sJ@gh|%aBxDsqh-q>3PP4Q@v`nFPOzQr-6H;bXZ#jB zyFpv2FNaz_AjsI`@yz4Lo@YPZ%CejmMbimQ%-`}lf0*T$zvQ=Llb|)j?>|yeN}8S1 zxw@S_7scIln5I{RmkLITuBxnu+W0OzoPQ91YAG*=-z2Lk7hHT88q|`vZSuWsD_&5| z8<8y6evr2OW4|(tNXw4dKs((KTCS-mF!}|pRBxzZ?SjCL!SV@m z1&L&W&MV_0427>sQ{DNTz`)PO_ncQ1?1xB3mDxgGQ_<1NCbU>m`2p7qc`TZ$Vg+uO z)J!iM3^cdH2!%LJIJBy+odfWzO(@d?|HrIbbW$==m@0RwbfY^39>{{TDy?2&3{0BE zIz?XmG`o0o{`~FJQ*b(sCo>6|DkW2Xr*1WL3^uH5gOw4XlUkyZ6RYvIXrbO3cRfq+;8$Z>OnIx|rsyymoW z=(T5W(KOnWGpx3dPy#dqPiL>6EsOfW)$FX@oIiW;a(1R)6?J>|>-6!4on9QwpB2-K)7R_SS$R2M zO*b#A+2-=;gW37%YV+dNYICu9B49cEt$|mOD+}Z>pjJ8)%NaunJTJepcKfmN= z29=Jn08WZ7T`KjUp-37uUPRc9b(DR4M!7tc5kC5w+j{=^;R zYyoj+{y=1lMrPBjZiHScQ&>OSoeoFs{UI6Hk&0n!5fkHp-22~}=U`KP88&Va4;~J8 z38IJdy{1)gTI;6V6&KJ9b=CM}ZV0zhGye@vIj(`FBW6M5DQ9k(k7P<1!Cky?3&a6VJgEG7($Yk-95plqg9pimbo*;g6-#EH5D+ox1lLhbVO%kC zUxld0@r1JtgpAwm8$Yf0{`&0}3j@Ju~O|$A+vSN6brfCA}NIk(Kc(EE>b0NgO z+9u32N3Cqi&SC-oneM@|T5u#8Cd@vVwqnEUY0j2(%?)qlolq?+I9&hsJrKNT&ZHs^ zvDppp%hP^Gx$5RIxurSFG4Yl^ zx9Dg4$zZFH`}{e|84^I0KzQh+oSdd99PWO{j?7`7NB2+mAo;=U*H&3W6GuvclTx7?G$A{m>tm>)zpQiSsIEekJJ()I66@Lr0`^Gf7fMaS8 z=KrbPry{P_*G27v$iGf%AJE4*xtoDEhTi*^(@lG(BWwFKeKyDZy$u%RQtZFvKru*O zlFGNzxo$MAtc;IOdgsC^ca!zht9A*%V4+@TB_fEz+%!AiP1`h>3wG6OrqrtG zu7AQfa?#aut0OxN`3|hs?}!C))na-l)ZP2E_FVp>C^-1maeyjTes6#0SZ3LEhbtu9O&BkB59(WQJa23t5k zBIMO7H)NMolRH~@-G}m+RJNeZ26@_ctVDpUtNKRTioLC5dyV_p!R$CSKuZj?Y7&YT zau2^9lpr~oA82eJ=>gb1&`L<=zGzz+Q@Q-@pj27xv9zm#73v8 a`n2Z1v-uL*Jq1a?haMCQczGzNi0cJvQmhS)dBG`5{u(=^NUh}B58>^#i?My{G_bZ Zv?vE8pkHRFpP5&dpP8Imti)Bz1pvYK7f%2H literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--InvoiceItem.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--InvoiceItem.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..041633b56c0996a814ed94c5e2397cb68201be3b GIT binary patch literal 1111 zcmaJ=O^?$s5WVlOh!lq}>H^1R=|DrtDD1&ibRGs`kG#W4oyX6+Ja? zo}b^m86U5@PN>Nx8^zo1<>t-n{sluic@I_}2ox!dqJkm12|R;31$qDZ>)pHCPv1U% z==*+CIHQU{^$j8Amrsrmw8uH3vwZlAI!s_=_w2p$V+VFb`?Eva-CW;XKd(9%G`muR zVZE&~0g6;D1VX?6$PkV!inum(GSK(0iX_^-L(OV78Iw;M+{5I?^$in5MQtb|9-lJJ z4ZlEhK%#13gsF(m;L-8@M~aPtqh{!1-9Et~D$fGv0?~{3Y!rvGc$$4NSp}7jWReI= z1SB`0F_f7M`T-^`3i2V7#h6_YLwle}T=a5jwtOP-bhC(DHsa)p>Lumu?*Bm(_foD5 zJGV=-+yU=ZBmGa}#I>k*R^{dz=6Mn&CLRxwXYa;TCd7Z&{>u1?<$+tL+}5{8^;-_` zp!VqUY9||J(6~j4uj)qxA7tH>#!mFghOP6Hd`!wljDIy24|AT5vmhf%Db8={XWwQ+jagwwhq Nc=6fd7hFDF{Q-`~J5B%q literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--InvoiceItem.create.2.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--InvoiceItem.create.2.json new file mode 100644 index 0000000000000000000000000000000000000000..82e3bb8ef9179aeda7b9b4bf60059921ce515cae GIT binary patch literal 1085 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 literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..7854fd6e2d112c8a5737b111cecd001a4500f8c6 GIT binary patch literal 930 zcmaJ=!EO^V5WVLsqCIm+Kmv&yC<{uVZ5pIfK**YUXA`$x+qK6eQIvmYY$tR#Aoj3Y zkKep`^JaEG8jmY*PAdtdtf}6PP1O2D4o9*bN2PGE>(G$skk+;deUJnrQR|#6JVF?9 zNUc(0KD$Em=OpYCY?@BPq~PJg`-d9WDMf!dU^To^Za`~W7xDLHyET>?!4tz z+l^?HN11L0jjB}X|MCm9hL9Sj=mdIilZ-!>vQNmjK!lw;`N5~Z9CrwV(s$Hajp4)Ai|jKEN^H*#3|~2De-;chd*j`v-23BdH-4stoa%N-=B1J+48w z!nXaK;S!`=*A?CNd6M&*>Z|R`wonaIgtVqrtLV$JG%Qx>fyZZfo9B}dd)`N0R0%#! zp`7@9v_L!qPflmJLE2dV*lQw(JwC-W1zLMV(WIq|KKWR|Y2&M0@4)Y36W~EWYfZ`t`3Ir5WZWW@Ghz)OWPKyCnS%hs{mJ~wz8%KxHZ^ND`)c^nh literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.list.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.list.1.json new file mode 100644 index 0000000000000000000000000000000000000000..42b19479221d5d1b1fefd153d6b45cdf21a1d387 GIT binary patch literal 1116 zcmaJ=O-~y!5WVMDtbDFSBSfisD+;s}+N7Xfs4B~NXA^_h-q>Rj6y?8n#@S?(P0Jou z)_lHsZ)Pf3m8ku|_L2-jUNKYv1i$34Ki-EgSV(gF{&Z&U_jB zfm%5Y*5)EIfQrYpv^88Hf)0R`FCw6k!|~*L=|`78Rq*rCQ^a4lv-5A0i#AS9M$h-l z`Ptdm#(zlj^M}RFm#gu|n>)O~(dqbJ?4VLrg-}xA;rs2^Ia8!TAaGlqqWm$w`~La% z`r&d!p~J372~h{r{ELdp`h_e_0L|Vb0t|P4d!(+7RgsCn)JO=yGpqyJiASIag$Q-S zTpfDN3)H>@vRBGR*iBh0M+&q3Af6;st@5k&F4)16I^<#c3I6ekrX(xRLl})iQm%vV zoqU9uvX%5zKlgA?-u6oEU1g>zY}TeEoW>q8dstEWtPV$Q7noL9tHAts7P7T$>?Q28 z!WSSM;KGOJ9?I+rFi)%j&H{iec^y+=YK7X~glMm%DAw((W48wyUmIY^o6E}$GUPVz z&rX$S+|+_h5#)c=jHobiEx{0JA7k$}JDpNg(+t^H6%7z0UwCfGfOAtZQ&HAFPlh4o bT@s!C*2InOA_dDmPhN&6`%4kUU_JN?(ZENu literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.retrieve.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--SetupIntent.retrieve.1.json new file mode 100644 index 0000000000000000000000000000000000000000..7854fd6e2d112c8a5737b111cecd001a4500f8c6 GIT binary patch literal 930 zcmaJ=!EO^V5WVLsqCIm+Kmv&yC<{uVZ5pIfK**YUXA`$x+qK6eQIvmYY$tR#Aoj3Y zkKep`^JaEG8jmY*PAdtdtf}6PP1O2D4o9*bN2PGE>(G$skk+;deUJnrQR|#6JVF?9 zNUc(0KD$Em=OpYCY?@BPq~PJg`-d9WDMf!dU^To^Za`~W7xDLHyET>?!4tz z+l^?HN11L0jjB}X|MCm9hL9Sj=mdIilZ-!>vQNmjK!lw;`N5~Z9CrwV(s$Hajp4)Ai|jKEN^H*#3|~2De-;chd*j`v-23BdH-4stoa%N-=B1J+48w z!nXaK;S!`=*A?CNd6M&*>Z|R`wonaIgtVqrtLV$JG%Qx>fyZZfo9B}dd)`N0R0%#! zp`7@9v_L!qPflmJLE2dV*lQw(JwC-W1zLMV(WIq|KKWR|Y2&M0@4)Y36W~EWYfZ`t`3Ir5WZWW@Ghz)OWPKyCnS%hs{mJ~wz8%KxHZ^ND`)c^nh literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--checkout.Session.create.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--checkout.Session.create.1.json new file mode 100644 index 0000000000000000000000000000000000000000..8960c5ec4b09ee4f3694b092799c1d237acee7ce GIT binary patch literal 2379 zcmb_dT~i`C6n&pxVfEJT(<;)aGfb5=I|w*3GpHa4Y;C1Na)D?%X*-F6mj8Wk`b$9O zX_u$wCim;yb5CAA?Ck|~W+5T4j737N&?@-6r<|03re{*>ClV(*(*B4r&B1J3h_q9d z7&o=rQn};kz1>+IVJ1c_U82JaCc-j6(WwNEh8dLxe0sDRORXz1qUkj)YbvA^YECHU z2^fQANeOJbct#ZiNnGN~3KrJJpDPsua<<&GOA3cCjckYqka0Z zTHikcUf-w35bmEGg;ievbX0@cNyWwUgmS2SiKuc^5-Auc0|fulIYglBY1+XbRzPxE z4bqC46nH=qm_Y(q77@PF66gHb087Ab9B2%!cA0+FGMKJ#iLdTzs5 z3Q;gy(`U}$sK`u!6oz}MWdof4;EVDg;rZ8Bt9-2MDZ3>-Y!z8 zJu}`lNs8xqZ@x0Y+wWsdu(ADY5;Y~m4@%eFWa%V%w zN8?6KEy9_*x-)mp>*pLqp&m7kVhxQTH|>N~ibsf0EbxB0&Vkg7%8d{ag3hU>cr8ag zK{pGyD7cTrApx>Y32Ftvb`|>&0iy{gE=F$%N~H3XfdT8{Z1eQ=4y7UWSOB}%&K?-l z3{Ulx%`sj1oh3rqtwk$NP-^bczXZLoWAO{kH}^20@`qp{&_HQY7!!DKB0-hN5by*g%0*MZBkNMSTbfI> z6JQ!;12~!C3$YGSivJs=ejb8UFRw0^y4kv>iGFC_89Vr~_}IB>WK|S0u@PoVIyS2- zaVuQO8)CUsl_v=L2Jzlt(J|yq$fStm1bd6_riLXV9mYm+4pj*spa1)P$se~0JbGGY zg?=#>D*zP4l)1PQr!QyUT4&!c2REeO>h~`$yX2zznn9U9xw{DF1SvMezkvk-);ciw zM6z;E(xhJ9Dy)Lssr+{_`E4e6m4}U(M!m$>aHeh=H7>g0ia literal 0 HcmV?d00001 diff --git a/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--checkout.Session.list.1.json b/corporate/tests/stripe_fixtures/upgrade_user_to_monthly_basic_plan--checkout.Session.list.1.json new file mode 100644 index 0000000000000000000000000000000000000000..2e6736d9cea30de4e70ac7af458dad34a4c7fece GIT binary patch literal 2769 zcmb_eT~i`C6n&pxVfEJT(<;)aGfb5=J196ZGpHa4Ol_q?a)D?%-R1*9%m2PN4GqoL zzU=y7X>M|J?>Xn5^xKDngMd>@gU<)Q@b80zxAZrz(xC-SV44U`t%w!wP)^D}mvJfM z7n0~WihY={n1k8c6va+iV%)&SmdZWh-7#n52ybS@(kULy3d7Ps(SZbxi$f|6WF=w5 zSZZBX#iG*pEFKJmltPUNL1bF$7oe^>$fycjGiXHsC0Xc&S9ER6`?{Td&OEe4ndyA_P_8ntiv-+;jG zYzlSpIQv;u<+QJ6wsqTL9rG$g$m~!La|Y=pLjjU|zJC3k%bJEPOntpM+UJTyEk$Cp z6HonEBuS3ljiUUHJttA;ksC&Y$<78K4^>w_%~_XG=F~maow+8 zB1n1O(l&99kd&QMlqDh@EEUp2k?(je)a_Ov!p;8jF^weHzh0db$q|dArDU*QMWd{N z3|w4I#xYr0Gw1Pq}*@eUECN)DJIex&k1hLfx6 zWwkbNUpuZ$&yMd~QIn5OOZ`V1I^OM7N@^Sq-R+}!yu5qOfiBb}MjAIz3l__JsgPm< z5t4h1!z)S#3n#?BI-E?`u1;u6dP!4|5E zQUU|kCCk%6Ja|OQN>7i0J;lx*8T2wgVj0OnLTBDfh){ON&}UJ!!lzA)vKTfuj`_MT z1XRAznc2Q(xmgXx$jx7ioSxUzuyH}0c=t_Jzq09#Jsz#pA{G##hCOf@Vk_gw&MhB- zK*c0m)bQ+tMkiaLnTuHWVchG~(KxmC17H^s;H|9(psk9h$mUh4CrzZi>E02+BZ5jcD2Zx`RH7vFE% z_oP*AwXSa(9k_exn7kXvX_ZA<~u!*}X9Xt{Bu8Pm}0q-yM)NQF& zVpo-udaEtx)BBF|l+G`{V+OI-UW`_|^ph@Uby66cauzIbFHDL{%<;P{W!nTF-aq^U Doo_%? literal 0 HcmV?d00001 diff --git a/corporate/tests/test_stripe.py b/corporate/tests/test_stripe.py index bc0b0eaf44..310ec9eac4 100644 --- a/corporate/tests/test_stripe.py +++ b/corporate/tests/test_stripe.py @@ -579,14 +579,14 @@ class StripeTestCase(ZulipTestCase): **kwargs: Any, ) -> "TestHttpResponse": if upgrade_page_response is None: + tier = kwargs.get("tier") + upgrade_url = f"{self.billing_session.billing_base_url}/upgrade/" + if tier: + upgrade_url += f"?tier={tier}" if self.billing_session.billing_base_url: - upgrade_page_response = self.client_get( - f"{self.billing_session.billing_base_url}/upgrade/", {}, subdomain="selfhosting" - ) + upgrade_page_response = self.client_get(upgrade_url, {}, subdomain="selfhosting") else: - upgrade_page_response = self.client_get( - f"{self.billing_session.billing_base_url}/upgrade/", {} - ) + upgrade_page_response = self.client_get(upgrade_url, {}) params: Dict[str, Any] = { "schedule": "annual", "signed_seat_count": self.get_signed_seat_count_from_response(upgrade_page_response), @@ -5651,7 +5651,7 @@ class TestRemoteRealmBillingFlow(StripeTestCase, RemoteRealmBillingTestCase): @responses.activate @mock_stripe() - def test_non_sponsorship_billing(self, *mocks: Mock) -> None: + def test_upgrade_user_to_business_plan(self, *mocks: Mock) -> None: self.login("hamlet") hamlet = self.example_user("hamlet") @@ -5659,6 +5659,7 @@ class TestRemoteRealmBillingFlow(StripeTestCase, RemoteRealmBillingTestCase): realm_user_count = UserProfile.objects.filter( realm=hamlet.realm, is_bot=False, is_active=True ).count() + self.assertEqual(realm_user_count, 11) with time_machine.travel(self.now, tick=False): send_server_data_to_push_bouncer(consider_usage_statistics=False) @@ -5673,7 +5674,24 @@ class TestRemoteRealmBillingFlow(StripeTestCase, RemoteRealmBillingTestCase): f"{self.billing_session.billing_base_url}/upgrade/", subdomain="selfhosting" ) self.assertEqual(result.status_code, 200) - self.assert_in_success_response(["Add card", "Purchase Zulip Business"], result) + + # Min licenses used since org has less users. + min_licenses = self.billing_session.min_licenses_for_plan( + CustomerPlan.TIER_SELF_HOSTED_BUSINESS + ) + self.assertEqual(min_licenses, 25) + flat_discount, flat_discounted_months = self.billing_session.get_flat_discount_info() + self.assertEqual(flat_discounted_months, 12) + + self.assert_in_success_response( + [ + "Minimum purchase for", + f"{min_licenses} licenses", + "Add card", + "Purchase Zulip Business", + ], + result, + ) self.assertFalse(Customer.objects.exists()) self.assertFalse(CustomerPlan.objects.exists()) @@ -5693,10 +5711,10 @@ class TestRemoteRealmBillingFlow(StripeTestCase, RemoteRealmBillingTestCase): for substring in [ "Zulip Business", "Number of licenses", - f"{realm_user_count} (managed automatically)", + f"{min_licenses} (managed automatically)", "January 2, 2013", "Your plan will automatically renew on", - f"${80 * realm_user_count:,.2f}", + f"${80 * min_licenses:,.2f}", "Visa ending in 4242", "Update card", ]: @@ -5707,7 +5725,7 @@ class TestRemoteRealmBillingFlow(StripeTestCase, RemoteRealmBillingTestCase): self.assertEqual(LicenseLedger.objects.count(), 1) with time_machine.travel(self.now + timedelta(days=2), tick=False): - for count in range(4, 14): + for count in range(realm_user_count, min_licenses + 10): do_create_user( f"email {count}", f"password {count}", @@ -5722,11 +5740,140 @@ class TestRemoteRealmBillingFlow(StripeTestCase, RemoteRealmBillingTestCase): self.assertEqual( RemoteRealmAuditLog.objects.count(), - audit_log_count + 10, + min_licenses + 10 - realm_user_count + audit_log_count, ) latest_ledger = LicenseLedger.objects.last() assert latest_ledger is not None - self.assertEqual(latest_ledger.licenses, realm_user_count + 10) + self.assertEqual(latest_ledger.licenses, min_licenses + 10) + + with time_machine.travel(self.now + timedelta(days=1), tick=False): + response = self.client_get( + f"{self.billing_session.billing_base_url}/billing/", subdomain="selfhosting" + ) + + self.assertEqual(latest_ledger.licenses, 35) + for substring in [ + "Zulip Business", + "Number of licenses", + f"{latest_ledger.licenses} (managed automatically)", + "January 2, 2013", + "Your plan will automatically renew on", + f"${80 * latest_ledger.licenses:,.2f}", + "Visa ending in 4242", + "Update card", + ]: + self.assert_in_response(substring, response) + + @responses.activate + @mock_stripe() + def test_upgrade_user_to_monthly_basic_plan(self, *mocks: Mock) -> None: + self.login("hamlet") + hamlet = self.example_user("hamlet") + + self.add_mock_response() + realm_user_count = UserProfile.objects.filter( + realm=hamlet.realm, is_bot=False, is_active=True + ).count() + self.assertEqual(realm_user_count, 11) + + with time_machine.travel(self.now, tick=False): + send_server_data_to_push_bouncer(consider_usage_statistics=False) + + result = self.execute_remote_billing_authentication_flow(hamlet) + self.assertEqual(result.status_code, 302) + self.assertEqual(result["Location"], f"{self.billing_session.billing_base_url}/plans/") + + # upgrade to basic plan + with time_machine.travel(self.now, tick=False): + result = self.client_get( + f"{self.billing_session.billing_base_url}/upgrade/?tier={CustomerPlan.TIER_SELF_HOSTED_BASIC}", + subdomain="selfhosting", + ) + self.assertEqual(result.status_code, 200) + + min_licenses = self.billing_session.min_licenses_for_plan( + CustomerPlan.TIER_SELF_HOSTED_BASIC + ) + self.assertEqual(min_licenses, 10) + flat_discount, flat_discounted_months = self.billing_session.get_flat_discount_info() + self.assertEqual(flat_discounted_months, 12) + + self.assert_in_success_response( + [f"{realm_user_count}", "Add card", "Purchase Zulip Basic"], result + ) + + self.assertFalse(Customer.objects.exists()) + self.assertFalse(CustomerPlan.objects.exists()) + self.assertFalse(LicenseLedger.objects.exists()) + + with time_machine.travel(self.now, tick=False): + stripe_customer = self.add_card_and_upgrade( + tier=CustomerPlan.TIER_SELF_HOSTED_BASIC, schedule="monthly" + ) + + customer = Customer.objects.get(stripe_customer_id=stripe_customer.id) + plan = CustomerPlan.objects.get(customer=customer) + LicenseLedger.objects.get(plan=plan) + + with time_machine.travel(self.now + timedelta(days=1), tick=False): + response = self.client_get( + f"{self.billing_session.billing_base_url}/billing/", subdomain="selfhosting" + ) + for substring in [ + "Zulip Basic", + "Number of licenses", + f"{realm_user_count} (managed automatically)", + "February 2, 2012", + "Your plan will automatically renew on", + f"${3.5 * realm_user_count - flat_discount // 100 * 1:,.2f}", + "Visa ending in 4242", + "Update card", + ]: + self.assert_in_response(substring, response) + + # Verify that change in user count updates LicenseLedger. + audit_log_count = RemoteRealmAuditLog.objects.count() + self.assertEqual(LicenseLedger.objects.count(), 1) + + with time_machine.travel(self.now + timedelta(days=2), tick=False): + for count in range(realm_user_count, min_licenses + 10): + do_create_user( + f"email {count}", + f"password {count}", + hamlet.realm, + "name", + role=UserProfile.ROLE_MEMBER, + acting_user=None, + ) + + with time_machine.travel(self.now + timedelta(days=3), tick=False): + send_server_data_to_push_bouncer(consider_usage_statistics=False) + + self.assertEqual( + RemoteRealmAuditLog.objects.count(), + min_licenses + 10 - realm_user_count + audit_log_count, + ) + latest_ledger = LicenseLedger.objects.last() + assert latest_ledger is not None + self.assertEqual(latest_ledger.licenses, min_licenses + 10) + + with time_machine.travel(self.now + timedelta(days=1), tick=False): + response = self.client_get( + f"{self.billing_session.billing_base_url}/billing/", subdomain="selfhosting" + ) + + self.assertEqual(latest_ledger.licenses, 20) + for substring in [ + "Zulip Basic", + "Number of licenses", + f"{latest_ledger.licenses} (managed automatically)", + "February 2, 2012", + "Your plan will automatically renew on", + f"${3.5 * latest_ledger.licenses - flat_discount // 100 * 1:,.2f}", + "Visa ending in 4242", + "Update card", + ]: + self.assert_in_response(substring, response) @responses.activate def test_request_sponsorship(self) -> None: @@ -5918,10 +6065,10 @@ class TestRemoteServerBillingFlow(StripeTestCase, RemoteServerTestCase): for substring in [ "Zulip Business", "Number of licenses", - f"{server_user_count} (managed automatically)", + f"{25} (managed automatically)", "Your plan will automatically renew on", "January 2, 2013", - f"${80 * server_user_count:,.2f}", + f"${80 * 25:,.2f}", "Visa ending in 4242", "Update card", ]: @@ -6151,8 +6298,6 @@ class TestRemoteServerBillingFlow(StripeTestCase, RemoteServerTestCase): self.assertEqual(new_customer_plan.tier, CustomerPlan.TIER_SELF_HOSTED_BUSINESS) self.assertEqual(new_customer_plan.billing_cycle_anchor, end_date) - server_user_count = UserProfile.objects.filter(is_bot=False, is_active=True).count() - # Visit billing page with time_machine.travel(self.now, tick=False): response = self.client_get(f"{billing_base_url}/billing/", subdomain="selfhosting") @@ -6160,7 +6305,8 @@ class TestRemoteServerBillingFlow(StripeTestCase, RemoteServerTestCase): "(legacy plan)", f"This is a legacy plan that ends on {end_date.strftime('%B %d, %Y')}", f"Your plan will automatically upgrade to Zulip Business on {end_date.strftime('%B %d, %Y')}", - f"Expected charge: ${80 * server_user_count:,.2f}", + "Expected next charge", + f"${80 * 25 - 20 * 12:,.2f}", "Visa ending in 4242", "Update card", ]: @@ -6189,3 +6335,114 @@ class TestRemoteServerBillingFlow(StripeTestCase, RemoteServerTestCase): m.output[1], f"INFO:corporate.stripe:Change plan status: Customer.id: {customer.id}, CustomerPlan.id: {customer_plan.id}, status: {CustomerPlan.ACTIVE}", ) + + @responses.activate + @mock_stripe() + def test_upgrade_user_to_monthly_basic_plan(self, *mocks: Mock) -> None: + self.login("hamlet") + hamlet = self.example_user("hamlet") + + self.add_mock_response() + realm_user_count = UserProfile.objects.filter(is_bot=False, is_active=True).count() + self.assertEqual(realm_user_count, 18) + + with time_machine.travel(self.now, tick=False): + send_server_data_to_push_bouncer(consider_usage_statistics=False) + + result = self.execute_remote_billing_authentication_flow( + hamlet.delivery_email, hamlet.full_name + ) + self.assertEqual(result.status_code, 302) + self.assertEqual(result["Location"], f"{self.billing_session.billing_base_url}/plans/") + + # upgrade to basic plan + with time_machine.travel(self.now, tick=False): + result = self.client_get( + f"{self.billing_session.billing_base_url}/upgrade/?tier={CustomerPlan.TIER_SELF_HOSTED_BASIC}", + subdomain="selfhosting", + ) + self.assertEqual(result.status_code, 200) + + min_licenses = self.billing_session.min_licenses_for_plan( + CustomerPlan.TIER_SELF_HOSTED_BASIC + ) + self.assertEqual(min_licenses, 10) + flat_discount, flat_discounted_months = self.billing_session.get_flat_discount_info() + self.assertEqual(flat_discounted_months, 12) + + self.assert_in_success_response( + [f"{min_licenses}", "Add card", "Purchase Zulip Basic"], result + ) + + self.assertFalse(Customer.objects.exists()) + self.assertFalse(CustomerPlan.objects.exists()) + self.assertFalse(LicenseLedger.objects.exists()) + + with time_machine.travel(self.now, tick=False): + stripe_customer = self.add_card_and_upgrade( + tier=CustomerPlan.TIER_SELF_HOSTED_BASIC, schedule="monthly" + ) + + customer = Customer.objects.get(stripe_customer_id=stripe_customer.id) + plan = CustomerPlan.objects.get(customer=customer) + LicenseLedger.objects.get(plan=plan) + + with time_machine.travel(self.now + timedelta(days=1), tick=False): + response = self.client_get( + f"{self.billing_session.billing_base_url}/billing/", subdomain="selfhosting" + ) + for substring in [ + "Zulip Basic", + "Number of licenses", + f"{realm_user_count} (managed automatically)", + "February 2, 2012", + "Your plan will automatically renew on", + f"${3.5 * realm_user_count - flat_discount // 100 * 1:,.2f}", + "Visa ending in 4242", + "Update card", + ]: + self.assert_in_response(substring, response) + + # Verify that change in user count updates LicenseLedger. + audit_log_count = RemoteRealmAuditLog.objects.count() + self.assertEqual(LicenseLedger.objects.count(), 1) + + with time_machine.travel(self.now + timedelta(days=2), tick=False): + for count in range(realm_user_count, min_licenses + 10): + do_create_user( + f"email {count}", + f"password {count}", + hamlet.realm, + "name", + role=UserProfile.ROLE_MEMBER, + acting_user=None, + ) + + with time_machine.travel(self.now + timedelta(days=3), tick=False): + send_server_data_to_push_bouncer(consider_usage_statistics=False) + + self.assertEqual( + RemoteRealmAuditLog.objects.count(), + min_licenses + 10 - realm_user_count + audit_log_count, + ) + latest_ledger = LicenseLedger.objects.last() + assert latest_ledger is not None + self.assertEqual(latest_ledger.licenses, min_licenses + 10) + + with time_machine.travel(self.now + timedelta(days=1), tick=False): + response = self.client_get( + f"{self.billing_session.billing_base_url}/billing/", subdomain="selfhosting" + ) + + self.assertEqual(latest_ledger.licenses, 20) + for substring in [ + "Zulip Basic", + "Number of licenses", + f"{latest_ledger.licenses} (managed automatically)", + "February 2, 2012", + "Your plan will automatically renew on", + f"${3.5 * latest_ledger.licenses - flat_discount // 100 * 1:,.2f}", + "Visa ending in 4242", + "Update card", + ]: + self.assert_in_response(substring, response) diff --git a/templates/corporate/billing.html b/templates/corporate/billing.html index bb6a70af6e..f384af9826 100644 --- a/templates/corporate/billing.html +++ b/templates/corporate/billing.html @@ -237,25 +237,34 @@ Your next invoice is due on {{ renewal_date }}. {% endif %}
- Expected charge: ${{ renewal_amount }} - {% if not fixed_price %} - (${{ price_per_license }} x {{ licenses_at_next_renewal }} {{ 'user' if licenses_at_next_renewal == 1 else 'users' }} x - {% if switch_to_annual_at_end_of_cycle %} - 12 months - {%- elif switch_to_monthly_at_end_of_cycle %} - 1 month - {%- else %} - {{ "1 month" if billing_frequency == "Monthly" else "12 months" }} - {%- endif -%}) - {% if discount_percent %} -
- Includes: {{ discount_percent }}% discount +
+ + {% if not fixed_price %} +
+ {% if using_min_licenses_for_plan %} + Minimum purchase for this plan: {{ min_licenses_for_plan }} licenses +
+ {% endif %} + ${{ pre_discount_renewal_cents }} (${{ price_per_license }} x {{ licenses_at_next_renewal }} {{ 'user' if licenses_at_next_renewal == 1 else 'users' }} x + {% if switch_to_annual_at_end_of_cycle %} + 12 months + {%- elif switch_to_monthly_at_end_of_cycle %} + 1 month + {%- else %} + {{ "1 month" if billing_frequency == "Monthly" else "12 months" }} + {%- endif -%}) + {% if discounted_months_left != 0 %} +
+ Discount: ${{ flat_discount }}/month off ({{ discounted_months_left }} {{ "month" if discounted_months_left == 1 else "months" }} remaining) + {% endif %} + {% if discount_percent %} +
+ Includes: {{ discount_percent }}% discount + {% endif %} +
{% endif %} - {% if using_min_licenses_for_plan %} -
- Minimum purchase for this plan: {{ min_licenses_for_plan }} licenses - {% endif %} - {% endif %} +
+

${{ renewal_amount }}

{% endif %} {% else %} Your plan ends on {{ renewal_date }}, and does not renew. @@ -498,12 +507,12 @@

- Your organization will be not be upgraded to Zulip Business + Your organization will be not be upgraded to {{ legacy_remote_server_next_plan_name }} on {{ remote_server_legacy_plan_end_date }}. If your organization has more than 10 users at that time, you will lose access to the Mobile Push Notification Service. You will also not receive the other benefits - of the Zulip Business plan. Are you sure you want to continue? + of the {{ legacy_remote_server_next_plan_name }} plan. Are you sure you want to continue?