billing: Add INVOICING_STATUS_ prefix to values.

This commit is contained in:
Tim Abbott
2023-11-29 23:07:12 -08:00
parent 610338d192
commit ebb02bad8f
3 changed files with 26 additions and 20 deletions

View File

@@ -1128,7 +1128,7 @@ class BillingSession(ABC):
status=CustomerPlan.FREE_TRIAL, status=CustomerPlan.FREE_TRIAL,
next_invoice_date=next_billing_cycle, next_invoice_date=next_billing_cycle,
invoiced_through=None, invoiced_through=None,
invoicing_status=CustomerPlan.INITIAL_INVOICE_TO_BE_SENT, invoicing_status=CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT,
) )
LicenseLedger.objects.create( LicenseLedger.objects.create(
@@ -1237,7 +1237,7 @@ class BillingSession(ABC):
status=CustomerPlan.ACTIVE, status=CustomerPlan.ACTIVE,
next_invoice_date=next_billing_cycle, next_invoice_date=next_billing_cycle,
invoiced_through=None, invoiced_through=None,
invoicing_status=CustomerPlan.INITIAL_INVOICE_TO_BE_SENT, invoicing_status=CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT,
) )
new_plan_ledger_entry = LicenseLedger.objects.create( new_plan_ledger_entry = LicenseLedger.objects.create(
@@ -1285,7 +1285,7 @@ class BillingSession(ABC):
status=CustomerPlan.ACTIVE, status=CustomerPlan.ACTIVE,
next_invoice_date=next_billing_cycle, next_invoice_date=next_billing_cycle,
invoiced_through=None, invoiced_through=None,
invoicing_status=CustomerPlan.INITIAL_INVOICE_TO_BE_SENT, invoicing_status=CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT,
) )
new_plan_ledger_entry = LicenseLedger.objects.create( new_plan_ledger_entry = LicenseLedger.objects.create(
@@ -1656,7 +1656,7 @@ class BillingSession(ABC):
billing_schedule=current_plan.billing_schedule, billing_schedule=current_plan.billing_schedule,
tier=new_plan_tier, tier=new_plan_tier,
billing_cycle_anchor=new_plan_billing_cycle_anchor, billing_cycle_anchor=new_plan_billing_cycle_anchor,
invoicing_status=CustomerPlan.INITIAL_INVOICE_TO_BE_SENT, invoicing_status=CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT,
next_invoice_date=new_plan_billing_cycle_anchor, next_invoice_date=new_plan_billing_cycle_anchor,
) )
@@ -2839,7 +2839,7 @@ class PriceArgs(TypedDict, total=False):
def invoice_plan(plan: CustomerPlan, event_time: datetime) -> None: def invoice_plan(plan: CustomerPlan, event_time: datetime) -> None:
if plan.invoicing_status == CustomerPlan.STARTED: if plan.invoicing_status == CustomerPlan.INVOICING_STATUS_STARTED:
raise NotImplementedError("Plan with invoicing_status==STARTED needs manual resolution.") raise NotImplementedError("Plan with invoicing_status==STARTED needs manual resolution.")
if not plan.customer.stripe_customer_id: if not plan.customer.stripe_customer_id:
assert plan.customer.realm is not None assert plan.customer.realm is not None
@@ -2856,7 +2856,7 @@ def invoice_plan(plan: CustomerPlan, event_time: datetime) -> None:
if plan.status is not CustomerPlan.SWITCH_PLAN_TIER_NOW: if plan.status is not CustomerPlan.SWITCH_PLAN_TIER_NOW:
billing_session.make_end_of_cycle_updates_if_needed(plan, event_time) billing_session.make_end_of_cycle_updates_if_needed(plan, event_time)
if plan.invoicing_status == CustomerPlan.INITIAL_INVOICE_TO_BE_SENT: if plan.invoicing_status == CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT:
invoiced_through_id = -1 invoiced_through_id = -1
licenses_base = None licenses_base = None
else: else:
@@ -2906,7 +2906,7 @@ def invoice_plan(plan: CustomerPlan, event_time: datetime) -> None:
if price_args: if price_args:
plan.invoiced_through = ledger_entry plan.invoiced_through = ledger_entry
plan.invoicing_status = CustomerPlan.STARTED plan.invoicing_status = CustomerPlan.INVOICING_STATUS_STARTED
plan.save(update_fields=["invoicing_status", "invoiced_through"]) plan.save(update_fields=["invoicing_status", "invoiced_through"])
stripe.InvoiceItem.create( stripe.InvoiceItem.create(
currency="usd", currency="usd",
@@ -2924,7 +2924,7 @@ def invoice_plan(plan: CustomerPlan, event_time: datetime) -> None:
) )
invoice_item_created = True invoice_item_created = True
plan.invoiced_through = ledger_entry plan.invoiced_through = ledger_entry
plan.invoicing_status = CustomerPlan.DONE plan.invoicing_status = CustomerPlan.INVOICING_STATUS_DONE
plan.save(update_fields=["invoicing_status", "invoiced_through"]) plan.save(update_fields=["invoicing_status", "invoiced_through"])
licenses_base = ledger_entry.licenses licenses_base = ledger_entry.licenses

View File

@@ -248,13 +248,13 @@ class CustomerPlan(models.Model):
) )
end_date = models.DateTimeField(null=True) end_date = models.DateTimeField(null=True)
DONE = 1 INVOICING_STATUS_DONE = 1
STARTED = 2 INVOICING_STATUS_STARTED = 2
INITIAL_INVOICE_TO_BE_SENT = 3 INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT = 3
# This status field helps ensure any errors encountered during the # This status field helps ensure any errors encountered during the
# invoicing process do not leave our invoicing system in a broken # invoicing process do not leave our invoicing system in a broken
# state. # state.
invoicing_status = models.SmallIntegerField(default=DONE) invoicing_status = models.SmallIntegerField(default=INVOICING_STATUS_DONE)
TIER_CLOUD_STANDARD = 1 TIER_CLOUD_STANDARD = 1
TIER_CLOUD_PLUS = 2 TIER_CLOUD_PLUS = 2

View File

@@ -2372,7 +2372,9 @@ class StripeTest(StripeTestCase):
assert annual_plan is not None assert annual_plan is not None
self.assertEqual(annual_plan.status, CustomerPlan.ACTIVE) self.assertEqual(annual_plan.status, CustomerPlan.ACTIVE)
self.assertEqual(annual_plan.billing_schedule, CustomerPlan.BILLING_SCHEDULE_ANNUAL) self.assertEqual(annual_plan.billing_schedule, CustomerPlan.BILLING_SCHEDULE_ANNUAL)
self.assertEqual(annual_plan.invoicing_status, CustomerPlan.INITIAL_INVOICE_TO_BE_SENT) self.assertEqual(
annual_plan.invoicing_status, CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT
)
self.assertEqual(annual_plan.billing_cycle_anchor, self.next_month) self.assertEqual(annual_plan.billing_cycle_anchor, self.next_month)
self.assertEqual(annual_plan.next_invoice_date, self.next_month) self.assertEqual(annual_plan.next_invoice_date, self.next_month)
self.assertEqual(annual_plan.invoiced_through, None) self.assertEqual(annual_plan.invoiced_through, None)
@@ -2398,7 +2400,7 @@ class StripeTest(StripeTestCase):
annual_ledger_entries = LicenseLedger.objects.filter(plan=annual_plan).order_by("id") annual_ledger_entries = LicenseLedger.objects.filter(plan=annual_plan).order_by("id")
self.assert_length(annual_ledger_entries, 2) self.assert_length(annual_ledger_entries, 2)
annual_plan.refresh_from_db() annual_plan.refresh_from_db()
self.assertEqual(annual_plan.invoicing_status, CustomerPlan.DONE) self.assertEqual(annual_plan.invoicing_status, CustomerPlan.INVOICING_STATUS_DONE)
self.assertEqual(annual_plan.invoiced_through, annual_ledger_entries[1]) self.assertEqual(annual_plan.invoiced_through, annual_ledger_entries[1])
self.assertEqual(annual_plan.billing_cycle_anchor, self.next_month) self.assertEqual(annual_plan.billing_cycle_anchor, self.next_month)
self.assertEqual(annual_plan.next_invoice_date, add_months(self.next_month, 1)) self.assertEqual(annual_plan.next_invoice_date, add_months(self.next_month, 1))
@@ -2552,7 +2554,9 @@ class StripeTest(StripeTestCase):
assert annual_plan is not None assert annual_plan is not None
self.assertEqual(annual_plan.status, CustomerPlan.ACTIVE) self.assertEqual(annual_plan.status, CustomerPlan.ACTIVE)
self.assertEqual(annual_plan.billing_schedule, CustomerPlan.BILLING_SCHEDULE_ANNUAL) self.assertEqual(annual_plan.billing_schedule, CustomerPlan.BILLING_SCHEDULE_ANNUAL)
self.assertEqual(annual_plan.invoicing_status, CustomerPlan.INITIAL_INVOICE_TO_BE_SENT) self.assertEqual(
annual_plan.invoicing_status, CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT
)
self.assertEqual(annual_plan.billing_cycle_anchor, self.next_month) self.assertEqual(annual_plan.billing_cycle_anchor, self.next_month)
self.assertEqual(annual_plan.next_invoice_date, self.next_month) self.assertEqual(annual_plan.next_invoice_date, self.next_month)
annual_ledger_entries = LicenseLedger.objects.filter(plan=annual_plan).order_by("id") annual_ledger_entries = LicenseLedger.objects.filter(plan=annual_plan).order_by("id")
@@ -2571,7 +2575,7 @@ class StripeTest(StripeTestCase):
annual_plan.refresh_from_db() annual_plan.refresh_from_db()
self.assertEqual(annual_plan.invoiced_through, annual_ledger_entries[0]) self.assertEqual(annual_plan.invoiced_through, annual_ledger_entries[0])
self.assertEqual(annual_plan.next_invoice_date, add_months(self.next_month, 12)) self.assertEqual(annual_plan.next_invoice_date, add_months(self.next_month, 12))
self.assertEqual(annual_plan.invoicing_status, CustomerPlan.DONE) self.assertEqual(annual_plan.invoicing_status, CustomerPlan.INVOICING_STATUS_DONE)
assert customer.stripe_customer_id assert customer.stripe_customer_id
[invoice0, invoice1] = iter(stripe.Invoice.list(customer=customer.stripe_customer_id)) [invoice0, invoice1] = iter(stripe.Invoice.list(customer=customer.stripe_customer_id))
@@ -2680,7 +2684,7 @@ class StripeTest(StripeTestCase):
annual_plan.refresh_from_db() annual_plan.refresh_from_db()
self.assertEqual(annual_plan.next_invoice_date, add_months(self.next_month, 1)) self.assertEqual(annual_plan.next_invoice_date, add_months(self.next_month, 1))
self.assertEqual(annual_plan.invoicing_status, CustomerPlan.DONE) self.assertEqual(annual_plan.invoicing_status, CustomerPlan.INVOICING_STATUS_DONE)
self.assertEqual(LicenseLedger.objects.filter(plan=annual_plan).count(), 3) self.assertEqual(LicenseLedger.objects.filter(plan=annual_plan).count(), 3)
customer = get_customer_by_realm(user.realm) customer = get_customer_by_realm(user.realm)
@@ -2734,7 +2738,9 @@ class StripeTest(StripeTestCase):
assert monthly_plan is not None assert monthly_plan is not None
self.assertEqual(monthly_plan.status, CustomerPlan.ACTIVE) self.assertEqual(monthly_plan.status, CustomerPlan.ACTIVE)
self.assertEqual(monthly_plan.billing_schedule, CustomerPlan.BILLING_SCHEDULE_MONTHLY) self.assertEqual(monthly_plan.billing_schedule, CustomerPlan.BILLING_SCHEDULE_MONTHLY)
self.assertEqual(monthly_plan.invoicing_status, CustomerPlan.INITIAL_INVOICE_TO_BE_SENT) self.assertEqual(
monthly_plan.invoicing_status, CustomerPlan.INVOICING_STATUS_INITIAL_INVOICE_TO_BE_SENT
)
self.assertEqual(monthly_plan.billing_cycle_anchor, self.next_year) self.assertEqual(monthly_plan.billing_cycle_anchor, self.next_year)
self.assertEqual(monthly_plan.next_invoice_date, self.next_year) self.assertEqual(monthly_plan.next_invoice_date, self.next_year)
self.assertEqual(monthly_plan.invoiced_through, None) self.assertEqual(monthly_plan.invoiced_through, None)
@@ -2760,7 +2766,7 @@ class StripeTest(StripeTestCase):
monthly_ledger_entries = LicenseLedger.objects.filter(plan=monthly_plan).order_by("id") monthly_ledger_entries = LicenseLedger.objects.filter(plan=monthly_plan).order_by("id")
self.assert_length(monthly_ledger_entries, 2) self.assert_length(monthly_ledger_entries, 2)
monthly_plan.refresh_from_db() monthly_plan.refresh_from_db()
self.assertEqual(monthly_plan.invoicing_status, CustomerPlan.DONE) self.assertEqual(monthly_plan.invoicing_status, CustomerPlan.INVOICING_STATUS_DONE)
self.assertEqual(monthly_plan.invoiced_through, monthly_ledger_entries[1]) self.assertEqual(monthly_plan.invoiced_through, monthly_ledger_entries[1])
self.assertEqual(monthly_plan.billing_cycle_anchor, self.next_year) self.assertEqual(monthly_plan.billing_cycle_anchor, self.next_year)
self.assertEqual(monthly_plan.next_invoice_date, add_months(self.next_year, 1)) self.assertEqual(monthly_plan.next_invoice_date, add_months(self.next_year, 1))
@@ -4827,7 +4833,7 @@ class InvoiceTest(StripeTestCase):
self.local_upgrade(self.seat_count, True, CustomerPlan.BILLING_SCHEDULE_ANNUAL, True, False) self.local_upgrade(self.seat_count, True, CustomerPlan.BILLING_SCHEDULE_ANNUAL, True, False)
plan = CustomerPlan.objects.first() plan = CustomerPlan.objects.first()
assert plan is not None assert plan is not None
plan.invoicing_status = CustomerPlan.STARTED plan.invoicing_status = CustomerPlan.INVOICING_STATUS_STARTED
plan.save(update_fields=["invoicing_status"]) plan.save(update_fields=["invoicing_status"])
with self.assertRaises(NotImplementedError): with self.assertRaises(NotImplementedError):
invoice_plan(assert_is_not_none(CustomerPlan.objects.first()), self.now) invoice_plan(assert_is_not_none(CustomerPlan.objects.first()), self.now)