def test_over_limit(self): num_users = self.user_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) tasks.generate_invoices(self.invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() user_line_items = invoice.lineitem_set.get_feature_by_type(FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) num_to_charge = num_users - self.user_rate.monthly_limit self.assertEqual(num_to_charge, user_line_item.quantity) if self.user_rate.feature.name == user_line_item.feature_rate.feature.name: self.assertEqual(user_line_item.unit_cost, self.user_rate.per_excess_fee) self.assertEqual(user_line_item.total, self.user_rate.per_excess_fee * num_to_charge) self.assertEqual(user_line_item.subtotal, self.user_rate.per_excess_fee * num_to_charge) elif user_line_item.feature_rate.feature.name == self.advanced_rate.feature.name: self.assertEqual(user_line_item.unit_cost, self.advanced_rate.per_excess_fee) self.assertEqual(user_line_item.total, self.advanced_rate.per_excess_fee * num_to_charge) self.assertEqual(user_line_item.subtotal, self.advanced_rate.per_excess_fee * num_to_charge)
def test_over_limit(self): num_users = self.user_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) calculate_users_in_all_domains(self.invoice_date) tasks.generate_invoices(self.invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() user_line_items = invoice.lineitem_set.get_feature_by_type(FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) num_to_charge = num_users - self.user_rate.monthly_limit self.assertEqual(num_to_charge, user_line_item.quantity) if self.user_rate.feature.name == user_line_item.feature_rate.feature.name: self.assertEqual(user_line_item.unit_cost, self.user_rate.per_excess_fee) self.assertEqual(user_line_item.total, self.user_rate.per_excess_fee * num_to_charge) self.assertEqual(user_line_item.subtotal, self.user_rate.per_excess_fee * num_to_charge) elif user_line_item.feature_rate.feature.name == self.advanced_rate.feature.name: self.assertEqual(user_line_item.unit_cost, self.advanced_rate.per_excess_fee) self.assertEqual(user_line_item.total, self.advanced_rate.per_excess_fee * num_to_charge) self.assertEqual(user_line_item.subtotal, self.advanced_rate.per_excess_fee * num_to_charge)
def test_over_limit(self): """ Make sure that the User rate produced: - base_description is None - base_cost is 0.0 - unit_description is not None - unit_cost is equal to the per_excess_fee on the user rate - quantity is equal to number of commcare users in that domain minus the monthly_limit on the user rate - total and subtotals are equal to number of extra users * per_excess_fee """ invoice_date = utils.months_from_date(self.subscription.date_start, random.randint(2, self.subscription_length)) num_users = lambda: random.randint(self.user_rate.monthly_limit + 1, self.user_rate.monthly_limit + 2) num_active = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_inactive = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_inactive, is_active=False) tasks.generate_invoices(invoice_date) invoice = self.subscription.invoice_set.latest('date_created') user_line_item = invoice.lineitem_set.get_feature_by_type(FeatureType.USER).get() # there is no base cost self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) num_to_charge = num_active - self.user_rate.monthly_limit self.assertIsNotNone(user_line_item.unit_description) self.assertEqual(user_line_item.quantity, num_to_charge) self.assertEqual(user_line_item.unit_cost, self.user_rate.per_excess_fee) self.assertEqual(user_line_item.subtotal, num_to_charge * self.user_rate.per_excess_fee) self.assertEqual(user_line_item.total, num_to_charge * self.user_rate.per_excess_fee)
def test_under_limit(self): num_users = random.randint(0, self.user_rate.monthly_limit) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = random.randint(0, self.advanced_rate.monthly_limit) generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) invoice_date = utils.months_from_date( self.subscription.date_start, random.randint(2, self.subscription_length)) tasks.generate_invoices(invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() self.assertEqual(invoice.balance, Decimal('1500.0000')) user_line_items = invoice.lineitem_set.get_feature_by_type( FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: self.assertEqual(user_line_item.quantity, 0) self.assertEqual(user_line_item.subtotal, Decimal('0.0000')) self.assertEqual(user_line_item.total, Decimal('0.0000')) self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) self.assertIsNone(user_line_item.unit_description) self.assertEqual(user_line_item.unit_cost, Decimal('1.0000'))
def _generate_users_fee_to_credit_against(self): user_rate = self.subscription.plan_version.feature_rates.filter(feature__feature_type=FeatureType.USER)[:1].get() num_active = random.randint(user_rate.monthly_limit + 1, user_rate.monthly_limit + 2) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_excess = num_active - user_rate.monthly_limit per_month_fee = num_excess * user_rate.per_excess_fee return user_rate, per_month_fee
def _generate_users_fee_to_credit_against(self): user_rate = self.subscription.plan_version.feature_rates.filter(feature__feature_type=FeatureType.USER)[:1].get() num_active = random.randint(user_rate.monthly_limit + 1, user_rate.monthly_limit + 2) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_excess = num_active - user_rate.monthly_limit per_month_fee = num_excess * user_rate.per_excess_fee return user_rate, per_month_fee
def test_user_over_limit_in_yearly_invoice(self): num_users = self.user_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 2 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) self.account.invoicing_plan = InvoicingPlan.YEARLY self.account.save() invoice_date = utils.months_from_date(self.subscription.date_start, 14) invoice_start, invoice_end = get_previous_month_date_range( invoice_date) invoice_start = invoice_start - relativedelta(months=11) invoice_factory = CustomerAccountInvoiceFactory( account=self.account, date_start=invoice_start, date_end=invoice_end) invoice_factory.create_invoice() self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() user_line_items = invoice.lineitem_set.get_feature_by_type( FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: if self.user_rate.feature.name == user_line_item.feature_rate.feature.name: self.assertEqual(user_line_item.quantity, 12) elif user_line_item.feature_rate.feature.name == self.advanced_rate.feature.name: self.assertEqual(user_line_item.quantity, 24)
def setUp(self): super(TestDomainUserHistory, self).setUp() self.num_users = 2 generator.arbitrary_commcare_users_for_domain(self.domain.name, self.num_users) self.today = datetime.date.today() self.record_date = self.today - datetime.timedelta(days=1)
def test_under_limit(self): """ Make sure that the User rate produced: - base_description is None - base_cost is 0.0 - unit_cost is equal to the per_excess_fee - quantity is equal to 0 - unit_description is None - total and subtotals are 0.0 """ invoice_date = utils.months_from_date(self.subscription.date_start, random.randint(2, self.subscription_length)) num_users = lambda: random.randint(0, self.user_rate.monthly_limit) num_active = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_inactive = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_inactive, is_active=False) tasks.generate_invoices(invoice_date) invoice = self.subscription.invoice_set.latest('date_created') user_line_item = invoice.lineitem_set.get_feature_by_type(FeatureType.USER).get() self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) self.assertIsNone(user_line_item.unit_description) self.assertEqual(user_line_item.quantity, 0) self.assertEqual(user_line_item.unit_cost, self.user_rate.per_excess_fee) self.assertEqual(user_line_item.subtotal, Decimal('0.0000')) self.assertEqual(user_line_item.total, Decimal('0.0000'))
def test_over_limit(self): """ Make sure that the User rate produced: - base_description is None - base_cost is 0.0 - unit_description is not None - unit_cost is equal to the per_excess_fee on the user rate - quantity is equal to number of commcare users in that domain minus the monthly_limit on the user rate - total and subtotals are equal to number of extra users * per_excess_fee """ invoice_date = utils.months_from_date(self.subscription.date_start, random.randint(2, self.subscription_length)) num_users = lambda: random.randint(self.user_rate.monthly_limit + 1, self.user_rate.monthly_limit + 2) num_active = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_inactive = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_inactive, is_active=False) tasks.generate_invoices(invoice_date) invoice = self.subscription.invoice_set.latest('date_created') user_line_item = invoice.lineitem_set.get_feature_by_type(FeatureType.USER).get() # there is no base cost self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) num_to_charge = num_active - self.user_rate.monthly_limit self.assertIsNotNone(user_line_item.unit_description) self.assertEqual(user_line_item.quantity, num_to_charge) self.assertEqual(user_line_item.unit_cost, self.user_rate.per_excess_fee) self.assertEqual(user_line_item.subtotal, num_to_charge * self.user_rate.per_excess_fee) self.assertEqual(user_line_item.total, num_to_charge * self.user_rate.per_excess_fee)
def test_under_limit(self): """ Make sure that the User rate produced: - base_description is None - base_cost is 0.0 - unit_cost is equal to the per_excess_fee - quantity is equal to 0 - unit_description is None - total and subtotals are 0.0 """ invoice_date = utils.months_from_date(self.subscription.date_start, random.randint(2, self.subscription_length)) num_users = lambda: random.randint(0, self.user_rate.monthly_limit) num_active = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_inactive = num_users() generator.arbitrary_commcare_users_for_domain(self.domain.name, num_inactive, is_active=False) tasks.generate_invoices(invoice_date) invoice = self.subscription.invoice_set.latest('date_created') user_line_item = invoice.lineitem_set.get_feature_by_type(FeatureType.USER).get() self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) self.assertIsNone(user_line_item.unit_description) self.assertEqual(user_line_item.quantity, 0) self.assertEqual(user_line_item.unit_cost, self.user_rate.per_excess_fee) self.assertEqual(user_line_item.subtotal, Decimal('0.0000')) self.assertEqual(user_line_item.total, Decimal('0.0000'))
def test_subscription_level_user_credits(self): # Add User usage num_users = self.user_rate.monthly_limit + 10 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) # Cover the cost of 1 User on the Standard subscription CreditLine.add_credit( amount=Decimal(2.0000), feature_type=FeatureType.USER, subscription=self.subscription ) # Cover the cost of 5 Users on the Advanced subscription CreditLine.add_credit( amount=Decimal(10.0000), feature_type=FeatureType.USER, subscription=self.sub2 ) calculate_users_in_all_domains(self.invoice_date) tasks.generate_invoices(self.invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() self.assertEqual(invoice.balance, Decimal(1500.0000))
def setUp(self): super(TestCreditLines, self).setUp() num_active = random.randint(self.user_rate.monthly_limit + 1, self.user_rate.monthly_limit + 2) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_excess = num_active - self.user_rate.monthly_limit self.monthly_user_fee = num_excess * self.user_rate.per_excess_fee
def setUp(self): super(TestCreditLines, self).setUp() self.product_rate = self.subscription.plan_version.product_rate self.user_rate = self.subscription.plan_version.feature_rates.filter(feature__feature_type=FeatureType.USER)[:1].get() num_active = random.randint(self.user_rate.monthly_limit + 1, self.user_rate.monthly_limit + 2) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_excess = num_active - self.user_rate.monthly_limit self.monthly_user_fee = num_excess * self.user_rate.per_excess_fee
def setUp(self): super(TestCreditLines, self).setUp() self.product_rate = self.subscription.plan_version.product_rate self.user_rate = self.subscription.plan_version.feature_rates.filter( feature__feature_type=FeatureType.USER)[:1].get() num_active = random.randint(self.user_rate.monthly_limit + 1, self.user_rate.monthly_limit + 2) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_excess = num_active - self.user_rate.monthly_limit self.monthly_user_fee = num_excess * self.user_rate.per_excess_fee
def setUp(self): super(TestDomainInvoiceFactory, self).setUp() self.invoice_start, self.invoice_end = get_previous_month_date_range() self.domain = generator.arbitrary_domain() self.account = BillingAccount.get_or_create_account_by_domain( domain=self.domain.name, created_by="TEST")[0] self.community = DefaultProductPlan.get_default_plan_version() generator.arbitrary_commcare_users_for_domain( self.domain.name, self.community.user_limit + 1) self.invoice_factory = DomainInvoiceFactory(self.invoice_start, self.invoice_end, self.domain)
def setUp(self): super(TestDomainInvoiceFactory, self).setUp() self.invoice_start, self.invoice_end = get_previous_month_date_range() self.domain = generator.arbitrary_domain() self.account = BillingAccount.get_or_create_account_by_domain( domain=self.domain.name, created_by="TEST" )[0] self.community = DefaultProductPlan.get_default_plan().plan.get_version() generator.arbitrary_commcare_users_for_domain( self.domain.name, self.community.user_limit + 1 ) self.invoice_factory = DomainInvoiceFactory( self.invoice_start, self.invoice_end, self.domain )
def test_over_limit(self): num_users = self.user_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) invoice_date = utils.months_from_date( self.subscription.date_start, random.randint(2, self.subscription_length)) invoice_start, invoice_end = get_previous_month_date_range( invoice_date) invoice_factory = CustomerAccountInvoiceFactory( account=self.account, date_start=invoice_start, date_end=invoice_end) invoice_factory.create_invoice() self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() user_line_items = invoice.lineitem_set.get_feature_by_type( FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) num_to_charge = num_users - self.user_rate.monthly_limit self.assertEqual(num_to_charge, user_line_item.quantity) if self.user_rate.feature.name == user_line_item.feature_rate.feature.name: self.assertEqual(user_line_item.unit_cost, self.user_rate.per_excess_fee) self.assertEqual(user_line_item.total, self.user_rate.per_excess_fee * num_to_charge) self.assertEqual(user_line_item.subtotal, self.user_rate.per_excess_fee * num_to_charge) elif user_line_item.feature_rate.feature.name == self.advanced_rate.feature.name: self.assertEqual(user_line_item.unit_cost, self.advanced_rate.per_excess_fee) self.assertEqual( user_line_item.total, self.advanced_rate.per_excess_fee * num_to_charge) self.assertEqual( user_line_item.subtotal, self.advanced_rate.per_excess_fee * num_to_charge)
def test_account_level_user_credits(self): # Add User usage num_users = self.user_rate.monthly_limit + 10 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) # Cover the cost of 1 User CreditLine.add_credit( amount=Decimal(2.0000), feature_type=FeatureType.USER, account=self.account, ) tasks.generate_invoices(self.invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() self.assertEqual(invoice.balance, Decimal(1509.0000))
def test_one_subscription_level_user_credit(self): # Add User usage num_users = self.user_rate.monthly_limit + 10 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) # Cover the cost of 2 Users on the Advanced subscription CreditLine.add_credit( amount=Decimal(4.0000), feature_type=FeatureType.USER, subscription=self.sub2 ) invoice_date = utils.months_from_date(self.subscription.date_start, random.randint(2, self.subscription_length)) tasks.generate_invoices(invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() self.assertEqual(invoice.balance, Decimal(1507.0000))
def test_user_over_limit_in_yearly_invoice(self): num_users = self.user_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 2 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) self.account.invoicing_plan = InvoicingPlan.YEARLY self.account.save() invoice_date = utils.months_from_date(self.subscription.date_start, 14) tasks.generate_invoices(invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() user_line_items = invoice.lineitem_set.get_feature_by_type(FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: if self.user_rate.feature.name == user_line_item.feature_rate.feature.name: self.assertEqual(user_line_item.quantity, 12) elif user_line_item.feature_rate.feature.name == self.advanced_rate.feature.name: self.assertEqual(user_line_item.quantity, 24)
def test_user_over_limit_in_quarterly_invoice(self): num_users = self.user_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 2 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) self.account.invoicing_plan = InvoicingPlan.QUARTERLY self.account.save() invoice_date = utils.months_from_date(self.subscription.date_start, 14) tasks.generate_invoices(invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() user_line_items = invoice.lineitem_set.get_feature_by_type(FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: if self.user_rate.feature.name == user_line_item.feature_rate.feature.name: self.assertEqual(user_line_item.quantity, 3) elif user_line_item.feature_rate.feature.name == self.advanced_rate.feature.name: self.assertEqual(user_line_item.quantity, 6)
def test_one_subscription_level_user_credit(self): # Add User usage num_users = self.user_rate.monthly_limit + 10 generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = self.advanced_rate.monthly_limit + 1 generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) # Cover the cost of 2 Users on the Advanced subscription CreditLine.add_credit( amount=Decimal(4.0000), feature_type=FeatureType.USER, subscription=self.sub2 ) invoice_date = utils.months_from_date(self.subscription.date_start, random.randint(2, self.subscription_length)) calculate_users_in_all_domains(invoice_date) tasks.generate_invoices(invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() self.assertEqual(invoice.balance, Decimal(1507.0000))
def test_under_limit(self): num_users = random.randint(0, self.user_rate.monthly_limit) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_users) num_users_advanced = random.randint(0, self.advanced_rate.monthly_limit) generator.arbitrary_commcare_users_for_domain(self.domain2.name, num_users_advanced) tasks.generate_invoices(self.invoice_date) self.assertEqual(CustomerInvoice.objects.count(), 1) invoice = CustomerInvoice.objects.first() self.assertEqual(invoice.balance, Decimal('1500.0000')) user_line_items = invoice.lineitem_set.get_feature_by_type(FeatureType.USER) self.assertEqual(user_line_items.count(), 2) for user_line_item in user_line_items: self.assertEqual(user_line_item.quantity, 0) self.assertEqual(user_line_item.subtotal, Decimal('0.0000')) self.assertEqual(user_line_item.total, Decimal('0.0000')) self.assertIsNone(user_line_item.base_description) self.assertEqual(user_line_item.base_cost, Decimal('0.0000')) self.assertIsNone(user_line_item.unit_description) self.assertEqual(user_line_item.unit_cost, Decimal('1.0000'))
def setUp(self): super(TestDomainUserHistory, self).setUp() self.num_users = 2 generator.arbitrary_commcare_users_for_domain(self.domain.name, self.num_users) self.today = datetime.date.today() self.record_date = self.today - datetime.timedelta(days=1)
def setUp(self): super(TestCreditLines, self).setUp() num_active = random.randint(self.user_rate.monthly_limit + 1, self.user_rate.monthly_limit + 2) generator.arbitrary_commcare_users_for_domain(self.domain.name, num_active) num_excess = num_active - self.user_rate.monthly_limit self.monthly_user_fee = num_excess * self.user_rate.per_excess_fee