Skip to content

Commit 0ff35a8

Browse files
committed
Merge branch 'hotfix'
2 parents 056ecdc + e04431e commit 0ff35a8

File tree

5 files changed

+34
-15
lines changed

5 files changed

+34
-15
lines changed

erpnext/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from erpnext.hooks import regional_overrides
66
from frappe.utils import getdate
77

8-
__version__ = '10.1.53'
8+
__version__ = '10.1.54'
99

1010
def get_default_company(user=None):
1111
'''Get default company for user'''

erpnext/accounts/doctype/sales_invoice/pos.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,7 @@ def save_invoice(doc, name, name_list):
506506
frappe.db.commit()
507507
name_list.append(name)
508508
except Exception:
509-
frappe.log_error(frappe.get_traceback())
510509
frappe.db.rollback()
510+
frappe.log_error(frappe.get_traceback())
511511

512512
return name_list

erpnext/manufacturing/doctype/bom_update_tool/bom_update_tool.py

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,23 @@ def replace_bom(self):
1616
self.update_new_bom()
1717
bom_list = self.get_parent_boms(self.new_bom)
1818
updated_bom = []
19+
1920
for bom in bom_list:
20-
bom_obj = frappe.get_doc("BOM", bom)
21-
bom_obj.get_doc_before_save()
22-
updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
23-
bom_obj.calculate_cost()
24-
bom_obj.update_parent_cost()
25-
bom_obj.db_update()
26-
if (getattr(bom_obj.meta, 'track_changes', False)
27-
and bom_obj._doc_before_save and not bom_obj.flags.ignore_version):
28-
bom_obj.save_version()
21+
try:
22+
bom_obj = frappe.get_doc("BOM", bom)
23+
bom_obj.get_doc_before_save()
24+
updated_bom = bom_obj.update_cost_and_exploded_items(updated_bom)
25+
bom_obj.calculate_cost()
26+
bom_obj.update_parent_cost()
27+
bom_obj.db_update()
28+
if (getattr(bom_obj.meta, 'track_changes', False)
29+
and bom_obj._doc_before_save and not bom_obj.flags.ignore_version):
30+
bom_obj.save_version()
31+
32+
frappe.db.commit()
33+
except Exception:
34+
frappe.db.rollback()
35+
frappe.log_error(frappe.get_traceback())
2936

3037
def validate_bom(self):
3138
if cstr(self.current_bom) == cstr(self.new_bom):

erpnext/public/js/setup_wizard.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,15 @@ erpnext.setup.slides_settings = [
138138

139139
validate: function () {
140140
// validate fiscal year start and end dates
141-
if (this.values.fy_start_date == 'Invalid date' || this.values.fy_end_date == 'Invalid date') {
141+
const invalid = this.values.fy_start_date == 'Invalid date' ||
142+
this.values.fy_end_date == 'Invalid date';
143+
const start_greater_than_end = this.values.fy_start_date > this.values.fy_end_date;
144+
145+
if (invalid || start_greater_than_end) {
142146
frappe.msgprint(__("Please enter valid Financial Year Start and End Dates"));
143147
return false;
144148
}
149+
145150
return true;
146151
},
147152

erpnext/stock/doctype/serial_no/serial_no.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,14 @@ def process_serial_no(sle):
187187
update_serial_nos(sle, item_det)
188188

189189
def validate_serial_no(sle, item_det):
190+
serial_nos = get_serial_nos(sle.serial_no) if sle.serial_no else []
191+
190192
if item_det.has_serial_no==0:
191-
if sle.serial_no:
193+
if serial_nos:
192194
frappe.throw(_("Item {0} is not setup for Serial Nos. Column must be blank").format(sle.item_code),
193195
SerialNoNotRequiredError)
194196
elif sle.is_cancelled == "No":
195-
if sle.serial_no:
196-
serial_nos = get_serial_nos(sle.serial_no)
197+
if serial_nos:
197198
if cint(sle.actual_qty) != flt(sle.actual_qty):
198199
frappe.throw(_("Serial No {0} quantity {1} cannot be a fraction").format(sle.item_code, sle.actual_qty))
199200

@@ -239,6 +240,12 @@ def validate_serial_no(sle, item_det):
239240
elif sle.actual_qty < 0 or not item_det.serial_no_series:
240241
frappe.throw(_("Serial Nos Required for Serialized Item {0}").format(sle.item_code),
241242
SerialNoRequiredError)
243+
elif serial_nos:
244+
for serial_no in serial_nos:
245+
sr = frappe.db.get_value("Serial No", serial_no, ["name", "warehouse"], as_dict=1)
246+
if sr and sle.actual_qty < 0 and sr.warehouse != sle.warehouse:
247+
frappe.throw(_("Cannot cancel {0} {1} because Serial No {2} does not belong to the warehouse {3}")
248+
.format(sle.voucher_type, sle.voucher_no, serial_no, sle.warehouse))
242249

243250
def has_duplicate_serial_no(sn, sle):
244251
if sn.warehouse:

0 commit comments

Comments
 (0)