Merge pull request #36441 from frappe/version-13-hotfix
chore: release v13
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and contributors
|
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors and contributors
|
||||||
# For license information, please see license.txt
|
# For license information, please see license.txt
|
||||||
|
import collections
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
@@ -44,6 +44,7 @@ class POSInvoice(SalesInvoice):
|
|||||||
self.validate_debit_to_acc()
|
self.validate_debit_to_acc()
|
||||||
self.validate_write_off_account()
|
self.validate_write_off_account()
|
||||||
self.validate_change_amount()
|
self.validate_change_amount()
|
||||||
|
self.validate_duplicate_serial_and_batch_no()
|
||||||
self.validate_change_account()
|
self.validate_change_account()
|
||||||
self.validate_item_cost_centers()
|
self.validate_item_cost_centers()
|
||||||
self.validate_warehouse()
|
self.validate_warehouse()
|
||||||
@@ -154,6 +155,27 @@ class POSInvoice(SalesInvoice):
|
|||||||
title=_("Item Unavailable"),
|
title=_("Item Unavailable"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def validate_duplicate_serial_and_batch_no(self):
|
||||||
|
serial_nos = []
|
||||||
|
batch_nos = []
|
||||||
|
|
||||||
|
for row in self.get("items"):
|
||||||
|
if row.serial_no:
|
||||||
|
serial_nos = row.serial_no.split("\n")
|
||||||
|
|
||||||
|
if row.batch_no and not row.serial_no:
|
||||||
|
batch_nos.append(row.batch_no)
|
||||||
|
|
||||||
|
if serial_nos:
|
||||||
|
for key, value in collections.Counter(serial_nos).items():
|
||||||
|
if value > 1:
|
||||||
|
frappe.throw(_("Duplicate Serial No {0} found").format("key"))
|
||||||
|
|
||||||
|
if batch_nos:
|
||||||
|
for key, value in collections.Counter(batch_nos).items():
|
||||||
|
if value > 1:
|
||||||
|
frappe.throw(_("Duplicate Batch No {0} found").format("key"))
|
||||||
|
|
||||||
def validate_pos_reserved_batch_qty(self, item):
|
def validate_pos_reserved_batch_qty(self, item):
|
||||||
filters = {"item_code": item.item_code, "warehouse": item.warehouse, "batch_no": item.batch_no}
|
filters = {"item_code": item.item_code, "warehouse": item.warehouse, "batch_no": item.batch_no}
|
||||||
|
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ class BOMUpdateLog(Document):
|
|||||||
else:
|
else:
|
||||||
frappe.enqueue(
|
frappe.enqueue(
|
||||||
method="erpnext.manufacturing.doctype.bom_update_log.bom_update_log.process_boms_cost_level_wise",
|
method="erpnext.manufacturing.doctype.bom_update_log.bom_update_log.process_boms_cost_level_wise",
|
||||||
|
queue="long",
|
||||||
update_doc=self,
|
update_doc=self,
|
||||||
now=frappe.flags.in_test,
|
now=frappe.flags.in_test,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -157,12 +157,21 @@ def get_next_higher_level_boms(
|
|||||||
def get_leaf_boms() -> List[str]:
|
def get_leaf_boms() -> List[str]:
|
||||||
"Get BOMs that have no dependencies."
|
"Get BOMs that have no dependencies."
|
||||||
|
|
||||||
return frappe.db.sql_list(
|
bom = frappe.qb.DocType("BOM")
|
||||||
"""select name from `tabBOM` bom
|
bom_item = frappe.qb.DocType("BOM Item")
|
||||||
where docstatus=1 and is_active=1
|
|
||||||
and not exists(select bom_no from `tabBOM Item`
|
boms = (
|
||||||
where parent=bom.name and ifnull(bom_no, '')!='')"""
|
frappe.qb.from_(bom)
|
||||||
)
|
.left_join(bom_item)
|
||||||
|
.on((bom.name == bom_item.parent) & (bom_item.bom_no != ""))
|
||||||
|
.select(bom.name)
|
||||||
|
.where((bom.docstatus == 1) & (bom.is_active == 1) & (bom_item.bom_no.isnull()))
|
||||||
|
.distinct()
|
||||||
|
).run(as_list=True)
|
||||||
|
|
||||||
|
boms = [bom[0] for bom in boms]
|
||||||
|
|
||||||
|
return boms
|
||||||
|
|
||||||
|
|
||||||
def _generate_dependence_map() -> defaultdict:
|
def _generate_dependence_map() -> defaultdict:
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
"actions": [],
|
||||||
"autoname": "format:{####}",
|
"autoname": "format:{####}",
|
||||||
"creation": "2019-05-26 15:03:43.996455",
|
"creation": "2019-05-26 15:03:43.996455",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
@@ -12,7 +13,6 @@
|
|||||||
],
|
],
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
"fetch_from": "goal.objective",
|
|
||||||
"fieldname": "objective",
|
"fieldname": "objective",
|
||||||
"fieldtype": "Text",
|
"fieldtype": "Text",
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
@@ -38,14 +38,17 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"modified": "2019-05-26 16:12:54.832058",
|
"links": [],
|
||||||
|
"modified": "2023-07-28 18:10:23.351246",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Quality Management",
|
"module": "Quality Management",
|
||||||
"name": "Quality Goal Objective",
|
"name": "Quality Goal Objective",
|
||||||
|
"naming_rule": "Expression",
|
||||||
"owner": "Administrator",
|
"owner": "Administrator",
|
||||||
"permissions": [],
|
"permissions": [],
|
||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
|
"states": [],
|
||||||
"track_changes": 1
|
"track_changes": 1
|
||||||
}
|
}
|
||||||
@@ -278,6 +278,8 @@ def update_args_in_repost_item_valuation(
|
|||||||
frappe.publish_realtime(
|
frappe.publish_realtime(
|
||||||
"item_reposting_progress",
|
"item_reposting_progress",
|
||||||
{"name": doc.name, "items_to_be_repost": json.dumps(args, default=str), "current_index": index},
|
{"name": doc.name, "items_to_be_repost": json.dumps(args, default=str), "current_index": index},
|
||||||
|
doctype=doc.doctype,
|
||||||
|
docname=doc.name,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user