mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-03 12:19:12 +00:00
Merge branch 'version-14-hotfix' into handle_post_depr_entries_fail
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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"]),
|
||||||
|
|||||||
@@ -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({
|
||||||
|
|||||||
@@ -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()
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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.
|
@@ -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",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user