Example #1
0
def remove_pricing_rule_for_item(pricing_rules, item_details, item_code=None):
    from erpnext.accounts.doctype.pricing_rule.utils import get_pricing_rule_items
    for d in pricing_rules.split(','):
        if not d or not frappe.db.exists("Pricing Rule", d): continue
        pricing_rule = frappe.get_cached_doc('Pricing Rule', d)

        if pricing_rule.price_or_product_discount == 'Price':
            if pricing_rule.rate_or_discount == 'Discount Percentage':
                item_details.discount_percentage = 0.0
                item_details.discount_amount = 0.0

            if pricing_rule.rate_or_discount == 'Discount Amount':
                item_details.discount_amount = 0.0

            if pricing_rule.margin_type in ['Percentage', 'Amount']:
                item_details.margin_rate_or_amount = 0.0
                item_details.margin_type = None
        elif pricing_rule.get('free_item'):
            item_details.remove_free_item = (item_code if
                                             pricing_rule.get('same_item') else
                                             pricing_rule.get('free_item'))

        if pricing_rule.get("mixed_conditions") or pricing_rule.get(
                "apply_rule_on_other"):
            items = get_pricing_rule_items(pricing_rule)
            item_details.apply_on = (
                frappe.scrub(pricing_rule.apply_rule_on_other)
                if pricing_rule.apply_rule_on_other else frappe.scrub(
                    pricing_rule.get('apply_on')))
            item_details.applied_on_items = ','.join(items)

    item_details.pricing_rules = ''

    return item_details
Example #2
0
def remove_pricing_rule_for_item(pricing_rules,
                                 item_details,
                                 item_code=None,
                                 rate=None):
    from erpnext.accounts.doctype.pricing_rule.utils import (
        get_applied_pricing_rules,
        get_pricing_rule_items,
    )

    for d in get_applied_pricing_rules(pricing_rules):
        if not d or not frappe.db.exists("Pricing Rule", d):
            continue
        pricing_rule = frappe.get_cached_doc("Pricing Rule", d)

        if pricing_rule.price_or_product_discount == "Price":
            if pricing_rule.rate_or_discount == "Discount Percentage":
                item_details.discount_percentage = 0.0
                item_details.discount_amount = 0.0
                item_details.rate = rate or 0.0

            if pricing_rule.rate_or_discount == "Discount Amount":
                item_details.discount_amount = 0.0

            if pricing_rule.margin_type in ["Percentage", "Amount"]:
                item_details.margin_rate_or_amount = 0.0
                item_details.margin_type = None
        elif pricing_rule.get("free_item"):
            item_details.remove_free_item = (item_code if
                                             pricing_rule.get("same_item") else
                                             pricing_rule.get("free_item"))

        if pricing_rule.get("mixed_conditions") or pricing_rule.get(
                "apply_rule_on_other"):
            items = get_pricing_rule_items(pricing_rule)
            item_details.apply_on = (
                frappe.scrub(pricing_rule.apply_rule_on_other)
                if pricing_rule.apply_rule_on_other else frappe.scrub(
                    pricing_rule.get("apply_on")))
            item_details.applied_on_items = ",".join(items)

    item_details.pricing_rules = ""
    item_details.pricing_rule_removed = True

    return item_details
Example #3
0
def get_pricing_rule_for_item(args,
                              price_list_rate=0,
                              doc=None,
                              for_validate=False):
    from erpnext.accounts.doctype.pricing_rule.utils import (
        get_pricing_rules, get_applied_pricing_rules, get_pricing_rule_items,
        get_product_discount_rule)

    if isinstance(doc, string_types):
        doc = json.loads(doc)

    if doc:
        doc = frappe.get_doc(doc)

    if (args.get('is_free_item')
            or args.get("parenttype") == "Material Request"):
        return {}

    item_details = frappe._dict({
        "doctype": args.doctype,
        "name": args.name,
        "parent": args.parent,
        "parenttype": args.parenttype,
        "child_docname": args.get('child_docname'),
        "discount_percentage_on_rate": [],
        "discount_amount_on_rate": []
    })

    if args.ignore_pricing_rule or args.item_ignore_pricing_rule or not args.item_code:
        if frappe.db.exists(args.doctype,
                            args.name) and args.get("pricing_rules"):
            item_details = remove_pricing_rule_for_item(
                args.get("pricing_rules"), item_details, args.get('item_code'))
        return item_details

    update_args_for_pricing_rule(args)

    pricing_rules = (get_applied_pricing_rules(args) if for_validate
                     and args.get("pricing_rules") else get_pricing_rules(
                         args, doc))

    if pricing_rules:
        rules = []

        for pricing_rule in pricing_rules:
            if not pricing_rule: continue

            if isinstance(pricing_rule, string_types):
                pricing_rule = frappe.get_cached_doc("Pricing Rule",
                                                     pricing_rule)
                pricing_rule.apply_rule_on_other_items = get_pricing_rule_items(
                    pricing_rule)

            if pricing_rule.get('suggestion'): continue

            item_details.validate_applied_rule = pricing_rule.get(
                "validate_applied_rule", 0)
            item_details.price_or_product_discount = pricing_rule.get(
                "price_or_product_discount")

            rules.append(get_pricing_rule_details(args, pricing_rule))

            if pricing_rule.mixed_conditions or pricing_rule.apply_rule_on_other:
                item_details.update({
                    'apply_rule_on_other_items':
                    json.dumps(pricing_rule.apply_rule_on_other_items),
                    'price_or_product_discount':
                    pricing_rule.price_or_product_discount,
                    'apply_rule_on':
                    (frappe.scrub(pricing_rule.apply_rule_on_other)
                     if pricing_rule.apply_rule_on_other else frappe.scrub(
                         pricing_rule.get('apply_on')))
                })

            if pricing_rule.coupon_code_based == 1 and args.coupon_code == None:
                return item_details

            if not pricing_rule.validate_applied_rule:
                if pricing_rule.price_or_product_discount == "Price":
                    apply_price_discount_rule(pricing_rule, item_details, args)
                else:
                    get_product_discount_rule(pricing_rule, item_details, args,
                                              doc)

        item_details.has_pricing_rule = 1

        item_details.pricing_rules = ','.join([d.pricing_rule for d in rules])

        if not doc: return item_details

    elif args.get("pricing_rules"):
        item_details = remove_pricing_rule_for_item(args.get("pricing_rules"),
                                                    item_details,
                                                    args.get('item_code'))

    return item_details