mirror of
				https://github.com/zulip/zulip.git
				synced 2025-11-04 05:53:43 +00:00 
			
		
		
		
	billing: Add INVOICING_STATUS_ prefix to values.
This commit is contained in:
		@@ -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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user