def recalculate(self, amount, billing_info): """ Calculates and return pre-filled Order """ order = Order(pk=-1) order.amount = amount order.currency = self.get_currency() country = getattr(billing_info, 'country', None) if country is None: country = get_country_code(self.request) else: country = country.code tax_number = getattr(billing_info, 'tax_number', None) # Calculating tax can be complex task (e.g. VIES webservice call) # To ensure that tax calculated on order preview will be the same on final order # tax rate is cached for a given billing data (as this value only depends on it) tax_session_key = "tax_%s_%s" % (tax_number, country) tax = self.request.session.get(tax_session_key) if tax is None: taxation_policy = getattr(settings, 'PLANS_TAXATION_POLICY', None) if not taxation_policy: raise ImproperlyConfigured('PLANS_TAXATION_POLICY is not set') taxation_policy = import_name(taxation_policy) tax = str(taxation_policy.get_tax_rate(tax_number, country)) # Because taxation policy could return None which clutters with saving this value # into cache, we use str() representation of this value self.request.session[tax_session_key] = tax order.tax = Decimal(tax) if tax != 'None' else None return order
def recalculate(self, amount, billing_info): """ Calculates and return pre-filled Order """ order = Order(pk=-1) order.amount = amount order.currency = self.get_currency() country = getattr(billing_info, "country", None) if not country is None: country = country.code tax_number = getattr(billing_info, "tax_number", None) # Calculating tax can be complex task (e.g. VIES webservice call) # To ensure that tax calculated on order preview will be the same on # final order tax rate is cached for a given billing data (as this # value only depends on it) tax_session_key = "tax_%s_%s" % (tax_number, country) tax = self.request.session.get(tax_session_key) if tax is None: tax = getattr(settings, "PLANS_TAX", None) if tax is None: taxation_policy = getattr(settings, "PLANS_TAXATION_POLICY", None) if not taxation_policy: raise ImproperlyConfigured("PLANS_TAXATION_POLICY is not set") taxation_policy = import_name(taxation_policy) tax = str(taxation_policy.get_tax_rate(tax_number, country)) # Because taxation policy could return None which clutters with saving this value # into cache, we use str() representation of this value self.request.session[tax_session_key] = tax order.tax = Decimal(tax) if tax != "None" else None return order
def recalculate(self, amount, billing_info): """ Calculates and return pre-filled Order """ order = Order(pk=-1) order.amount = amount order.currency = self.get_currency() country = getattr(billing_info, 'country', None) if not country is None: country = country.code tax_number = getattr(billing_info, 'tax_number', None) # Calculating session can be complex task (e.g. VIES webservice call) # To ensure that once we get what tax we display to confirmation it will # not change, tax rate is cached for a given billing data (as it mainly depends on it) tax_session_key = "tax_%s_%s" % (tax_number, country) tax = self.request.session.get(tax_session_key) if tax: order.tax = tax[0] #retreiving tax as a tuple to avoid None problems else: taxation_policy = getattr(settings, 'TAXATION_POLICY' , None) if not taxation_policy: raise ImproperlyConfigured('TAXATION_POLICY is not set') taxation_policy = import_name(taxation_policy) order.tax = taxation_policy.get_tax_rate(tax_number, country) self.request.session[tax_session_key] = (order.tax, ) return order
def recalculate(self, amount, billing_info): """ Calculates and return pre-filled Order """ order = Order(pk=-1) order.recalculate(amount, billing_info, self.request) return order
def recalculate(self, amount, billing_info): """ Calculates and return pre-filled Order """ order = Order(pk=-1) order.amount = amount order.currency = self.get_currency() country = getattr(billing_info, 'country', None) if not country is None: country = country.code tax_number = getattr(billing_info, 'tax_number', None) # Calculating session can be complex task (e.g. VIES webservice call) # To ensure that once we get what tax we display to confirmation it will # not change, tax rate is cached for a given billing data (as it mainly depends on it) tax_session_key = "tax_%s_%s" % (tax_number, country) tax = self.request.session.get(tax_session_key) if tax is None: taxation_policy = getattr(settings, 'TAXATION_POLICY', None) if not taxation_policy: raise ImproperlyConfigured('TAXATION_POLICY is not set') taxation_policy = import_name(taxation_policy) tax = str(taxation_policy.get_tax_rate(tax_number, country)) # Because taxation policy could return None which clutters with saving this value # into cache, we use str() representation of this value self.request.session[tax_session_key] = tax order.tax = Decimal(tax) if tax != 'None' else None return order
def test_invoice_number_annually(self): settings.INVOICE_NUMBER_FORMAT = "{{ invoice.number }}/{% ifequal " \ "invoice.type invoice.INVOICE_TYPES.PROFORMA %}PF{% else %}FV" \ "{% endifequal %}/{{ invoice.issued|date:'Y' }}" settings.INVOICE_COUNTER_RESET = Invoice.NUMBERING.ANNUALLY user = get_user_model().objects.get(username='******') plan_pricing = PlanPricing.objects.all()[0] tax = getattr(settings, "TAX") currency = getattr(settings, "CURRENCY") o1 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o1.save() o2 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o2.save() o3 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o3.save() day = date(1991, 5, 3) i1 = Invoice(issued=day, selling_date=day, payment_date=day) i1.copy_from_order(o1) i1.set_issuer_invoice_data() i1.set_buyer_invoice_data(o1.user.billinginfo) i1.clean() i1.save() day = date(1991, 7, 13) i2 = Invoice(issued=day, selling_date=day, payment_date=day) i2.copy_from_order(o2) i2.set_issuer_invoice_data() i2.set_buyer_invoice_data(o2.user.billinginfo) i2.clean() i2.save() day = date(1992, 6, 1) i3 = Invoice(issued=day, selling_date=day, payment_date=day) i3.copy_from_order(o1) i3.set_issuer_invoice_data() i3.set_buyer_invoice_data(o1.user.billinginfo) i3.clean() i3.save() self.assertEqual(i1.full_number, "1/FV/1991") self.assertEqual(i2.full_number, "2/FV/1991") self.assertEqual(i3.full_number, "1/FV/1992")
def recalculate(self, amount, billing_info): """ Calculates and return pre-filled Order """ order = Order(pk=-1) order.amount = amount order.currency = self.get_currency() country = getattr(billing_info, 'country', None) if not country is None: country = country.code tax_number = getattr(billing_info, 'tax_number', None) # Calculating session can be complex task (e.g. VIES webservice call) # To ensure that once we get what tax we display to confirmation it will # not change, tax rate is cached for a given billing data (as it mainly depends on it) tax_session_key = "tax_%s_%s" % (tax_number, country) tax = self.request.session.get(tax_session_key) if tax: order.tax = tax[ 0] # retreiving tax as a tuple to avoid None problems else: taxation_policy = getattr(settings, 'TAXATION_POLICY', None) if not taxation_policy: raise ImproperlyConfigured('TAXATION_POLICY is not set') taxation_policy = import_name(taxation_policy) order.tax = taxation_policy.get_tax_rate(tax_number, country) self.request.session[tax_session_key] = (order.tax, ) return order
def complete_order(): user = User.objects.get(username='******') plan_pricing = PlanPricing.objects.all()[0] o1 = Order( user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, ) o1.save() with freeze_time(random.choice(["2012-01-14", "2012-02-14"])): o1.complete_order()
def create_order(user, plan_pricing, ip_address, organization, renew=False): order = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, created=user.date_joined, amount=plan_pricing.price, tax=app_settings.TAX, currency=app_settings.CURRENCY) order.full_clean() order.save() payment = Payment(organization=organization, order=order, currency=order.currency, total=order.total(), tax=order.tax_total(), customer_ip_address=ip_address, is_renewal=renew) payment.full_clean() payment.save() return payment
def test_invoice_number_annually(self): settings.PLANS_INVOICE_NUMBER_FORMAT = "{{ invoice.number }}/{% ifequal " \ "invoice.type invoice.INVOICE_TYPES.PROFORMA %}PF{% else %}FV" \ "{% endifequal %}/{{ invoice.issued|date:'Y' }}" settings.PLANS_INVOICE_COUNTER_RESET = Invoice.NUMBERING.ANNUALLY user = User.objects.get(username='******') plan_pricing = PlanPricing.objects.all()[0] tax = getattr(settings, "PLANS_TAX") currency = getattr(settings, "PLANS_CURRENCY") o1 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o1.save() o2 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o2.save() o3 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o3.save() day = date(1991, 5, 3) i1 = Invoice(issued=day, selling_date=day, payment_date=day) i1.copy_from_order(o1) i1.set_issuer_invoice_data() i1.set_buyer_invoice_data(o1.user.billinginfo) i1.clean() i1.save() day = date(1991, 7, 13) i2 = Invoice(issued=day, selling_date=day, payment_date=day) i2.copy_from_order(o2) i2.set_issuer_invoice_data() i2.set_buyer_invoice_data(o2.user.billinginfo) i2.clean() i2.save() day = date(1992, 6, 1) i3 = Invoice(issued=day, selling_date=day, payment_date=day) i3.copy_from_order(o1) i3.set_issuer_invoice_data() i3.set_buyer_invoice_data(o1.user.billinginfo) i3.clean() i3.save() self.assertEqual(i1.full_number, "1/FV/1991") self.assertEqual(i2.full_number, "2/FV/1991") self.assertEqual(i3.full_number, "1/FV/1992")
def test_amount_taxed_23(self): o = Order() o.amount = Decimal(123) o.tax = Decimal(23) self.assertEqual(o.total(), Decimal('151.29'))
def test_amount_taxed_0(self): o = Order() o.amount = Decimal(123) o.tax = Decimal(0) self.assertEqual(o.total(), Decimal('123'))
def test_invoice_number_monthly(self): settings.INVOICE_NUMBER_FORMAT = "{{ invoice.number }}/{% ifequal invoice.type invoice.INVOICE_TYPES.PROFORMA %}PF{% else %}FV{% endifequal %}/{{ invoice.issued|date:'m/Y' }}" settings.INVOICE_COUNTER_RESET = Invoice.NUMBERING.MONTHLY user = User.objects.get(username="******") plan_pricing = PlanPricing.objects.all()[0] tax = getattr(settings, "TAX") currency = getattr(settings, "CURRENCY") o1 = Order( user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency, ) o1.save() o2 = Order( user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency, ) o2.save() o3 = Order( user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency, ) o3.save() day = date(2002, 05, 03) i1 = Invoice(issued=day, selling_date=day, payment_date=day) i1.copy_from_order(o1) i1.set_issuer_invoice_data() i1.set_buyer_invoice_data(o1.user.billinginfo) i1.clean() i1.save() day = date(2002, 05, 13) i2 = Invoice(issued=day, selling_date=day, payment_date=day) i2.copy_from_order(o2) i2.set_issuer_invoice_data() i2.set_buyer_invoice_data(o2.user.billinginfo) i2.clean() i2.save() day = date(2002, 06, 01) i3 = Invoice(issued=day, selling_date=day, payment_date=day) i3.copy_from_order(o1) i3.set_issuer_invoice_data() i3.set_buyer_invoice_data(o1.user.billinginfo) i3.clean() i3.save() self.assertEqual(i1.full_number, "1/FV/05/2002") self.assertEqual(i2.full_number, "2/FV/05/2002") self.assertEqual(i3.full_number, "1/FV/06/2002")
def test_amount_taxed_none(self): o = Order() o.amount = Decimal(123) o.tax = None self.assertEqual(o.total(), Decimal("123"))
def test_invoice_number_custom(self): settings.PLANS_INVOICE_NUMBER_FORMAT = "{{ invoice.number }}/{% if " \ "invoice.type == invoice.INVOICE_TYPES.PROFORMA %}PF{% else %}FV" \ "{% endif %}/{{ invoice.issued|date:'Y' }}" def plans_invoice_counter_reset_function(invoice): from plans.models import Invoice, get_initial_number older_invoices = Invoice.objects.filter( type=invoice.type, issued__year=invoice.issued.year, issued__month=invoice.issued.month, currency=invoice.currency, ) sequence_name = f"{invoice.issued.year}_{invoice.issued.month}_{invoice.currency}" return sequence_name, get_initial_number(older_invoices) settings.PLANS_INVOICE_COUNTER_RESET = plans_invoice_counter_reset_function user = User.objects.get(username='******') plan_pricing = PlanPricing.objects.all()[0] tax = getattr(settings, "PLANS_TAX") currency = getattr(settings, "PLANS_CURRENCY") currency1 = 'CZK' o1 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o1.save() o2 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency1) o2.save() o3 = Order(user=user, plan=plan_pricing.plan, pricing=plan_pricing.pricing, amount=plan_pricing.price, tax=tax, currency=currency) o3.save() day = date(1991, 7, 13) i1 = Invoice(issued=day, selling_date=day, payment_date=day) i1.copy_from_order(o1) i1.set_issuer_invoice_data() i1.set_buyer_invoice_data(o1.user.billinginfo) i1.clean() i1.save() day = date(1991, 7, 13) i2 = Invoice(issued=day, selling_date=day, payment_date=day) i2.copy_from_order(o2) i2.set_issuer_invoice_data() i2.set_buyer_invoice_data(o2.user.billinginfo) i2.clean() i2.save() day = date(1991, 7, 13) i3 = Invoice(issued=day, selling_date=day, payment_date=day) i3.copy_from_order(o1) i3.set_issuer_invoice_data() i3.set_buyer_invoice_data(o1.user.billinginfo) i3.clean() i3.save() self.assertEqual(i1.full_number, "1/FV/1991") self.assertEqual(i2.full_number, "1/FV/1991") self.assertEqual(i3.full_number, "2/FV/1991")