Merge branch 'hotfix'
diff --git a/erpnext/__init__.py b/erpnext/__init__.py
index a7ec84a..68f1fa7 100644
--- a/erpnext/__init__.py
+++ b/erpnext/__init__.py
@@ -5,7 +5,7 @@
from erpnext.hooks import regional_overrides
from frappe.utils import getdate
-__version__ = '10.1.53'
+__version__ = '10.1.54'
def get_default_company(user=None):
'''Get default company for user'''
diff --git a/erpnext/accounts/doctype/sales_invoice/pos.py b/erpnext/accounts/doctype/sales_invoice/pos.py
index a515724..93cabb0 100644
--- a/erpnext/accounts/doctype/sales_invoice/pos.py
+++ b/erpnext/accounts/doctype/sales_invoice/pos.py
@@ -506,7 +506,7 @@
frappe.db.commit()
name_list.append(name)
except Exception:
- frappe.log_error(frappe.get_traceback())
frappe.db.rollback()
+ frappe.log_error(frappe.get_traceback())
return name_list
diff --git a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
index c91bb8f..3f6cb44 100644
--- a/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
+++ b/erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py
@@ -16,16 +16,23 @@
self.update_new_bom()
bom_list = self.get_parent_boms(self.new_bom)
updated_bom = []
+
for bom in bom_list:
- bom_obj = frappe.get_doc("BOM", bom)
- bom_obj.get_doc_before_save()
- updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
- bom_obj.calculate_cost()
- bom_obj.update_parent_cost()
- bom_obj.db_update()
- if (getattr(bom_obj.meta, 'track_changes', False)
- and bom_obj._doc_before_save and not bom_obj.flags.ignore_version):
- bom_obj.save_version()
+ try:
+ bom_obj = frappe.get_doc("BOM", bom)
+ bom_obj.get_doc_before_save()
+ updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
+ bom_obj.calculate_cost()
+ bom_obj.update_parent_cost()
+ bom_obj.db_update()
+ if (getattr(bom_obj.meta, 'track_changes', False)
+ and bom_obj._doc_before_save and not bom_obj.flags.ignore_version):
+ bom_obj.save_version()
+
+ frappe.db.commit()
+ except Exception:
+ frappe.db.rollback()
+ frappe.log_error(frappe.get_traceback())
def validate_bom(self):
if cstr(self.current_bom) == cstr(self.new_bom):
diff --git a/erpnext/public/js/setup_wizard.js b/erpnext/public/js/setup_wizard.js
index 6fa710d..484d81d 100644
--- a/erpnext/public/js/setup_wizard.js
+++ b/erpnext/public/js/setup_wizard.js
@@ -138,10 +138,15 @@
validate: function () {
// validate fiscal year start and end dates
- if (this.values.fy_start_date == 'Invalid date' || this.values.fy_end_date == 'Invalid date') {
+ const invalid = this.values.fy_start_date == 'Invalid date' ||
+ this.values.fy_end_date == 'Invalid date';
+ const start_greater_than_end = this.values.fy_start_date > this.values.fy_end_date;
+
+ if (invalid || start_greater_than_end) {
frappe.msgprint(__("Please enter valid Financial Year Start and End Dates"));
return false;
}
+
return true;
},
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index a8cab80..3d1979d 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -187,13 +187,14 @@
update_serial_nos(sle, item_det)
def validate_serial_no(sle, item_det):
+ serial_nos = get_serial_nos(sle.serial_no) if sle.serial_no else []
+
if item_det.has_serial_no==0:
- if sle.serial_no:
+ if serial_nos:
frappe.throw(_("Item {0} is not setup for Serial Nos. Column must be blank").format(sle.item_code),
SerialNoNotRequiredError)
elif sle.is_cancelled == "No":
- if sle.serial_no:
- serial_nos = get_serial_nos(sle.serial_no)
+ if serial_nos:
if cint(sle.actual_qty) != flt(sle.actual_qty):
frappe.throw(_("Serial No {0} quantity {1} cannot be a fraction").format(sle.item_code, sle.actual_qty))
@@ -239,6 +240,12 @@
elif sle.actual_qty < 0 or not item_det.serial_no_series:
frappe.throw(_("Serial Nos Required for Serialized Item {0}").format(sle.item_code),
SerialNoRequiredError)
+ elif serial_nos:
+ for serial_no in serial_nos:
+ sr = frappe.db.get_value("Serial No", serial_no, ["name", "warehouse"], as_dict=1)
+ if sr and sle.actual_qty < 0 and sr.warehouse != sle.warehouse:
+ frappe.throw(_("Cannot cancel {0} {1} because Serial No {2} does not belong to the warehouse {3}")
+ .format(sle.voucher_type, sle.voucher_no, serial_no, sle.warehouse))
def has_duplicate_serial_no(sn, sle):
if sn.warehouse: