Merge branch 'version-14-hotfix' into handle_post_depr_entries_fail

This commit is contained in:
Anand Baburajan
2022-12-08 21:04:32 +05:30
committed by GitHub
11 changed files with 56 additions and 32 deletions

View File

@@ -256,7 +256,7 @@ def apply_pricing_rule(args, doc=None):
for item in item_list: for item in item_list:
args_copy = copy.deepcopy(args) args_copy = copy.deepcopy(args)
args_copy.update(item) args_copy.update(item)
data = get_pricing_rule_for_item(args_copy, item.get("price_list_rate"), doc=doc) data = get_pricing_rule_for_item(args_copy, doc=doc)
out.append(data) out.append(data)
if ( if (
@@ -293,7 +293,7 @@ def update_pricing_rule_uom(pricing_rule, args):
pricing_rule.uom = row.uom pricing_rule.uom = row.uom
def get_pricing_rule_for_item(args, price_list_rate=0, doc=None, for_validate=False): def get_pricing_rule_for_item(args, doc=None, for_validate=False):
from erpnext.accounts.doctype.pricing_rule.utils import ( from erpnext.accounts.doctype.pricing_rule.utils import (
get_applied_pricing_rules, get_applied_pricing_rules,
get_pricing_rule_items, get_pricing_rule_items,

View File

@@ -997,7 +997,7 @@ def make_pricing_rule(**args):
"apply_on": args.apply_on or "Item Code", "apply_on": args.apply_on or "Item Code",
"applicable_for": args.applicable_for, "applicable_for": args.applicable_for,
"selling": args.selling or 0, "selling": args.selling or 0,
"currency": "USD", "currency": "INR",
"apply_discount_on_rate": args.apply_discount_on_rate or 0, "apply_discount_on_rate": args.apply_discount_on_rate or 0,
"buying": args.buying or 0, "buying": args.buying or 0,
"min_qty": args.min_qty or 0.0, "min_qty": args.min_qty or 0.0,

View File

@@ -244,6 +244,17 @@ def get_other_conditions(conditions, values, args):
and ifnull(`tabPricing Rule`.valid_upto, '2500-12-31')""" and ifnull(`tabPricing Rule`.valid_upto, '2500-12-31')"""
values["transaction_date"] = args.get("transaction_date") values["transaction_date"] = args.get("transaction_date")
if args.get("doctype") in [
"Quotation",
"Sales Order",
"Delivery Note",
"Sales Invoice",
"POS Invoice",
]:
conditions += """ and ifnull(`tabPricing Rule`.selling, 0) = 1"""
else:
conditions += """ and ifnull(`tabPricing Rule`.buying, 0) = 1"""
return conditions return conditions
@@ -663,7 +674,7 @@ def get_product_discount_rule(pricing_rule, item_details, args=None, doc=None):
item_details.free_item_data.append(free_item_data_args) item_details.free_item_data.append(free_item_data_args)
def apply_pricing_rule_for_free_items(doc, pricing_rule_args, set_missing_values=False): def apply_pricing_rule_for_free_items(doc, pricing_rule_args):
if pricing_rule_args: if pricing_rule_args:
items = tuple((d.item_code, d.pricing_rules) for d in doc.items if d.is_free_item) items = tuple((d.item_code, d.pricing_rules) for d in doc.items if d.is_free_item)

View File

@@ -197,7 +197,7 @@ class AccountsController(TransactionBase):
validate_einvoice_fields(self) validate_einvoice_fields(self)
if self.doctype != "Material Request": if self.doctype != "Material Request" and not self.ignore_pricing_rule:
apply_pricing_rule_on_transaction(self) apply_pricing_rule_on_transaction(self)
def before_cancel(self): def before_cancel(self):

View File

@@ -349,7 +349,7 @@ class StatusUpdater(Document):
def warn_about_bypassing_with_role(self, item, qty_or_amount, role): def warn_about_bypassing_with_role(self, item, qty_or_amount, role):
action = _("Over Receipt/Delivery") if qty_or_amount == "qty" else _("Overbilling") action = _("Over Receipt/Delivery") if qty_or_amount == "qty" else _("Overbilling")
msg = _("{} of {} {} ignored for item {} because you have {} role.").format( msg = _("{0} of {1} {2} ignored for item {3} because you have {4} role.").format(
action, action,
_(item["target_ref_field"].title()), _(item["target_ref_field"].title()),
frappe.bold(item["reduce_by"]), frappe.bold(item["reduce_by"]),

View File

@@ -1130,10 +1130,13 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
qty(doc, cdt, cdn) { qty(doc, cdt, cdn) {
let item = frappe.get_doc(cdt, cdn); let item = frappe.get_doc(cdt, cdn);
item.pricing_rules = '' // item.pricing_rules = ''
this.conversion_factor(doc, cdt, cdn, true); frappe.run_serially([
this.calculate_stock_uom_rate(doc, cdt, cdn); () => this.remove_pricing_rule(item),
this.apply_pricing_rule(item, true); () => this.conversion_factor(doc, cdt, cdn, true),
() => this.calculate_stock_uom_rate(doc, cdt, cdn),
() => this.apply_pricing_rule(item, true)
]);
} }
calculate_stock_uom_rate(doc, cdt, cdn) { calculate_stock_uom_rate(doc, cdt, cdn) {
@@ -1357,16 +1360,21 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
var item_list = []; var item_list = [];
$.each(this.frm.doc["items"] || [], function(i, d) { $.each(this.frm.doc["items"] || [], function(i, d) {
if (d.item_code && !d.is_free_item) { if (d.item_code) {
item_list.push({ if (d.is_free_item) {
"doctype": d.doctype, // Simply remove free items
"name": d.name, me.frm.get_field("items").grid.grid_rows[i].remove();
"item_code": d.item_code, } else {
"pricing_rules": d.pricing_rules, item_list.push({
"parenttype": d.parenttype, "doctype": d.doctype,
"parent": d.parent, "name": d.name,
"price_list_rate": d.price_list_rate "item_code": d.item_code,
}) "pricing_rules": d.pricing_rules,
"parenttype": d.parenttype,
"parent": d.parent,
"price_list_rate": d.price_list_rate
})
}
} }
}); });
return this.frm.call({ return this.frm.call({

View File

@@ -6,7 +6,7 @@ import json
import frappe import frappe
import frappe.defaults import frappe.defaults
from frappe import _, msgprint from frappe import _, msgprint, qb
from frappe.contacts.address_and_contact import ( from frappe.contacts.address_and_contact import (
delete_contact_and_address, delete_contact_and_address,
load_address_and_contact, load_address_and_contact,
@@ -732,12 +732,15 @@ def make_address(args, is_primary_address=1):
@frappe.validate_and_sanitize_search_inputs @frappe.validate_and_sanitize_search_inputs
def get_customer_primary_contact(doctype, txt, searchfield, start, page_len, filters): def get_customer_primary_contact(doctype, txt, searchfield, start, page_len, filters):
customer = filters.get("customer") customer = filters.get("customer")
return frappe.db.sql(
""" con = qb.DocType("Contact")
select `tabContact`.name from `tabContact`, `tabDynamic Link` dlink = qb.DocType("Dynamic Link")
where `tabContact`.name = `tabDynamic Link`.parent and `tabDynamic Link`.link_name = %(customer)s
and `tabDynamic Link`.link_doctype = 'Customer' return (
and `tabContact`.name like %(txt)s qb.from_(con)
""", .join(dlink)
{"customer": customer, "txt": "%%%s%%" % txt}, .on(con.name == dlink.parent)
.select(con.name, con.full_name, con.email_id)
.where((dlink.link_name == customer) & (con.name.like(f"%{txt}%")))
.run()
) )

View File

@@ -152,7 +152,7 @@ def get_parent_item_groups(item_group_name, from_item=False):
if from_item and frappe.request.environ.get("HTTP_REFERER"): if from_item and frappe.request.environ.get("HTTP_REFERER"):
# base page after 'Home' will vary on Item page # base page after 'Home' will vary on Item page
last_page = frappe.request.environ["HTTP_REFERER"].split("/")[-1] last_page = frappe.request.environ["HTTP_REFERER"].split("/")[-1].split("?")[0]
if last_page and last_page in ("shop-by-category", "all-products"): if last_page and last_page in ("shop-by-category", "all-products"):
base_nav_page_title = " ".join(last_page.split("-")).title() base_nav_page_title = " ".join(last_page.split("-")).title()
base_nav_page = {"name": _(base_nav_page_title), "route": "/" + last_page} base_nav_page = {"name": _(base_nav_page_title), "route": "/" + last_page}

View File

@@ -113,7 +113,7 @@ def get_item_details(args, doc=None, for_validate=False, overwrite_warehouse=Tru
if args.get(key) is None: if args.get(key) is None:
args[key] = value args[key] = value
data = get_pricing_rule_for_item(args, out.price_list_rate, doc, for_validate=for_validate) data = get_pricing_rule_for_item(args, doc=doc, for_validate=for_validate)
out.update(data) out.update(data)
@@ -1305,7 +1305,7 @@ def apply_price_list_on_item(args):
item_doc = frappe.db.get_value("Item", args.item_code, ["name", "variant_of"], as_dict=1) item_doc = frappe.db.get_value("Item", args.item_code, ["name", "variant_of"], as_dict=1)
item_details = get_price_list_rate(args, item_doc) item_details = get_price_list_rate(args, item_doc)
item_details.update(get_pricing_rule_for_item(args, item_details.price_list_rate)) item_details.update(get_pricing_rule_for_item(args))
return item_details return item_details

View File

@@ -9916,3 +9916,4 @@ Cost and Freight,Kosten und Fracht,
Delivered at Place,Geliefert benannter Ort, Delivered at Place,Geliefert benannter Ort,
Delivered at Place Unloaded,Geliefert benannter Ort entladen, Delivered at Place Unloaded,Geliefert benannter Ort entladen,
Delivered Duty Paid,Geliefert verzollt, Delivered Duty Paid,Geliefert verzollt,
{0} of {1} {2} ignored for item {3} because you have {4} role,"{0} von Artikel {3} mit {1} {2} wurde ignoriert, weil Sie die Rolle {4} haben."
Can't render this file because it is too large.

View File

@@ -110,6 +110,7 @@ def get_price(item_code, price_list, customer_group, company, qty=1):
"conversion_rate": 1, "conversion_rate": 1,
"for_shopping_cart": True, "for_shopping_cart": True,
"currency": frappe.db.get_value("Price List", price_list, "currency"), "currency": frappe.db.get_value("Price List", price_list, "currency"),
"doctype": "Quotation",
} }
) )