Beispiel #1
0
def _calculate(
    price,
    product=None,
    shipping_method=None,
    cart=None,
    order=None,
    bare=False,
    **kwargs
):

    if bare or price is None or DISCOUNT in price:
        return

    discounts = Discount.objects.none()

    if product:
        discounts = Discount.objects.filter(
            applies_to=APPLIES_TO_PRODUCT_PRICE
        ).for_product(product)
    elif shipping_method:
        discounts = Discount.objects.filter(
            applies_to=APPLIES_TO_SHIPPING_COSTS
        )
    elif cart or order:
        discounts = Discount.objects.filter(applies_to=APPLIES_TO_TOTAL)

    if 'customer_group' in kwargs:
        customer_group = kwargs['customer_group']
    else:
        CustomerGroup.current_customer_group()

    now = timezone.now()
    discounts = discounts.filter(active=True)
    discounts = discounts.filter(
        Q(valid_from__isnull=True) | Q(
            valid_from__lte=now
        )
    )
    discounts = discounts.filter(
        Q(valid_to__isnull=True) | Q(
            valid_to__gte=now
        )
    )
    discounts = discounts.filter(
        Q(customer_groups=customer_group) | Q(
            customer_groups=None
        )
    )
    discounts = discounts.polymorphic()

    for discount in discounts:
        price = discount.apply(price)

    yield chaining.update(price=price)
    yield price
Beispiel #2
0
def _calculate(
    price,
    product=None,
    shipping_method=None,
    payment_method=None,
    bare=False,
    **kwargs
):

    if bare or price is None or TAX in price:
        return

    tax_policy = settings_manager['tax_policy']
    if tax_policy:
        address_type = POLICY_CUSTOMER_ADDRESS_TYPES.get(tax_policy, None)

    zone = AddressZone.get_current(address_type)
    taxes = Tax.objects.spans(zone)
    tax_rules = TaxRule.objects.none()

    if product:
        product_classes = ProductTaxClass.objects.for_product(product)
        tax_rules = TaxRule.objects.filter(product_classes__in=product_classes)
    elif shipping_method:
        tax_rules = TaxRule.objects.filter(applies_to_shipping_costs=True)
    elif payment_method:
        tax_rules = TaxRule.objects.filter(applies_to_payment_costs=True)

    if 'customer_group' in kwargs:
        customer_group = kwargs['customer_group']
    else:
        CustomerGroup.current_customer_group()

    tax_rules = tax_rules.filter(
        Q(customer_groups=customer_group) | Q(
            customer_groups=None
        )
    )
    taxes = taxes.polymorphic().filter(tax_rules__in=tax_rules).distinct()

    for tax in taxes:
        price = tax.apply(price)

    yield chaining.update(price=price)
    yield price
Beispiel #3
0
def _calculate(price,
               product=None,
               shipping_method=None,
               payment_method=None,
               bare=False,
               **kwargs):

    if bare or price is None or TAX in price:
        return

    tax_policy = settings_manager['tax_policy']
    if tax_policy:
        address_type = POLICY_CUSTOMER_ADDRESS_TYPES.get(tax_policy, None)

    zone = AddressZone.get_current(address_type)
    taxes = Tax.objects.spans(zone)
    tax_rules = TaxRule.objects.none()

    if product:
        product_classes = ProductTaxClass.objects.for_product(product)
        tax_rules = TaxRule.objects.filter(product_classes__in=product_classes)
    elif shipping_method:
        tax_rules = TaxRule.objects.filter(applies_to_shipping_costs=True)
    elif payment_method:
        tax_rules = TaxRule.objects.filter(applies_to_payment_costs=True)

    if 'customer_group' in kwargs:
        customer_group = kwargs['customer_group']
    else:
        CustomerGroup.current_customer_group()

    tax_rules = tax_rules.filter(
        Q(customer_groups=customer_group) | Q(customer_groups=None))
    taxes = taxes.polymorphic().filter(tax_rules__in=tax_rules).distinct()

    for tax in taxes:
        price = tax.apply(price)

    yield chaining.update(price=price)
    yield price