Example #1
0
    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
Example #2
0
    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
Example #3
0
    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
Example #4
0
 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
Example #5
0
    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
Example #6
0
    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")
Example #7
0
    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
Example #8
0
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()
Example #9
0
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
Example #10
0
    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")
Example #11
0
 def test_amount_taxed_23(self):
     o = Order()
     o.amount = Decimal(123)
     o.tax = Decimal(23)
     self.assertEqual(o.total(), Decimal('151.29'))
Example #12
0
 def test_amount_taxed_0(self):
     o = Order()
     o.amount = Decimal(123)
     o.tax = Decimal(0)
     self.assertEqual(o.total(), Decimal('123'))
Example #13
0
    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")
Example #14
0
 def test_amount_taxed_none(self):
     o = Order()
     o.amount = Decimal(123)
     o.tax = None
     self.assertEqual(o.total(), Decimal("123"))
Example #15
0
 def test_amount_taxed_0(self):
     o = Order()
     o.amount = Decimal(123)
     o.tax = Decimal(0)
     self.assertEqual(o.total(), Decimal('123'))
Example #16
0
 def test_amount_taxed_23(self):
     o = Order()
     o.amount = Decimal(123)
     o.tax = Decimal(23)
     self.assertEqual(o.total(), Decimal('151.29'))
Example #17
0
    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")