Каков наилучший способ применения 18% налога на все товары в Джанго Оскар? - PullRequest
1 голос
/ 02 мая 2019

Я хочу применить 18% налог ко всем продуктам на Django Oscar. Каков наилучший и простой способ добиться этого?

Я следовал этой документации.

выписка / tax.py

from decimal import Decimal as D


def apply_to(submission):
    # Assume 7% sales tax on sales to New Jersey  You could instead use an
    # external service like Avalara to look up the appropriates taxes.
    STATE_TAX_RATES = {
        'NJ': D('0.07')
    }
    shipping_address = submission['shipping_address']
    rate = D('0.18')
    for line in submission['basket'].all_lines():
        line_tax = calculate_tax(
            line.line_price_excl_tax_incl_discounts, rate)
        unit_tax = (line_tax / line.quantity).quantize(D('0.01'))
        line.purchase_info.price.tax = unit_tax

    # Note, we change the submission in place - we don't need to
    # return anything from this function
    shipping_charge = submission['shipping_charge']
    if shipping_charge is not None:
        shipping_charge.tax = calculate_tax(
            shipping_charge.excl_tax, rate)


def calculate_tax(price, rate):
    tax = price * rate
    print(tax)
    return tax.quantize(D('0.01'))

выписка / session.py

from . import tax

    def build_submission(self, **kwargs):
        """
        Return a dict of data that contains everything required for an order
        submission.  This includes payment details (if any).

        This can be the right place to perform tax lookups and apply them to
        the basket.
        """
        # Pop the basket if there is one, because we pass it as a positional
        # argument to methods below
        basket = kwargs.pop('basket', self.request.basket)
        shipping_address = self.get_shipping_address(basket)
        shipping_method = self.get_shipping_method(
            basket, shipping_address)
        billing_address = self.get_billing_address(shipping_address)
        if not shipping_method:
            total = shipping_charge = None
        else:
            shipping_charge = shipping_method.calculate(basket)
            total = self.get_order_totals(
                basket, shipping_charge=shipping_charge, **kwargs)
        submission = {
            'user': self.request.user,
            'basket': basket,
            'shipping_address': shipping_address,
            'shipping_method': shipping_method,
            'shipping_charge': shipping_charge,
            'billing_address': billing_address,
            'order_total': total,
            'order_kwargs': {},
            'payment_kwargs': {}}

        # If there is a billing address, add it to the payment kwargs as calls
        # to payment gateways generally require the billing address. Note, that
        # it normally makes sense to pass the form instance that captures the
        # billing address information. That way, if payment fails, you can
        # render bound forms in the template to make re-submission easier.
        if billing_address:
            submission['payment_kwargs']['billing_address'] = billing_address

        # Allow overrides to be passed in
        submission.update(kwargs)

        # Set guest email after overrides as we need to update the order_kwargs
        # entry.
        user = submission['user']
        if (not user.is_authenticated
                and 'guest_email' not in submission['order_kwargs']):
            email = self.checkout_session.get_guest_email()
            submission['order_kwargs']['guest_email'] = email

        tax.apply_to(submission)
        return submission

Теперь предполагается, что в общую сумму заказа включен налог в размере 18%, но я вижу, что это относится только к общей сумме заказа, а не к сумме заказа. И даже в детальном представлении продукта налог должен отображаться как 18%.

1 Ответ

4 голосов
/ 04 мая 2019

Вы пропустили шаг, упомянутый в документации - когда сумма заказа пересчитывается после применения налога:

tax.apply_to(submission)

# Recalculate order total to ensure we have a tax-inclusive total
submission['order_total'] = self.get_order_totals(
    submission['basket'],
    submission['shipping_charge']
)

return submission

И даже в подробном представлении продукта налог должен отображаться как 18%.

Это не произойдет автоматически - приведенная выше логика применяется только при оформлении заказа. Если вы используете стратегию DeferredTax, то налог не известен в момент добавления товара в корзину, поэтому он не может быть отображен. Вам необходимо добавить некоторую логику отображения в подробный вид, чтобы указать возможные налоги.

...