diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py index 2ffae1a4f2a9..f4532f5231d8 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py @@ -1,6 +1,7 @@ # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors # License: GNU General Public License v3. See license.txt +import json import frappe from frappe import _, throw @@ -306,13 +307,27 @@ def get_pending_data(self, data_type, s_date=None, item_name=None): return schedule.name @frappe.whitelist() -def update_serial_nos(s_id): - serial_nos = frappe.db.get_value('Maintenance Schedule Detail', s_id, 'serial_no') +def update_serial_nos(s_id, item): + if isinstance(item, str): + item = json.loads(item) + item = frappe._dict(item) + + serial_nos = [] + if s_id: + serial_nos = frappe.db.get_value('Maintenance Schedule Detail', s_id, 'serial_no') + + # for old docs which were already saved. + elif item.get('prevdoc_docname'): + serial_nos = frappe.db.get_value('Maintenance Schedule Item', { + 'parent': item.prevdoc_docname, + 'item_code': item.item_code + }, 'serial_no') + if serial_nos: serial_nos = get_serial_nos(serial_nos) return serial_nos - else: - return False + + return [] @frappe.whitelist() def make_maintenance_visit(source_name, target_doc=None, item_name=None, s_id=None): diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js index 7f983541f6dc..60a8a02da1cd 100644 --- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js +++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js @@ -2,45 +2,41 @@ // License: GNU General Public License v3. See license.txt frappe.provide("erpnext.maintenance"); -var serial_nos = []; frappe.ui.form.on('Maintenance Visit', { - refresh: function (frm) { - //filters for serial_no based on item_code - frm.set_query('serial_no', 'purposes', function (frm, cdt, cdn) { - let item = locals[cdt][cdn]; - if (serial_nos) { - return { - filters: { - 'item_code': item.item_code, - 'name': ["in", serial_nos] - } - }; - } else { - return { - filters: { - 'item_code': item.item_code - } - }; - } - }); - }, setup: function (frm) { frm.set_query('contact_person', erpnext.queries.contact_query); frm.set_query('customer_address', erpnext.queries.address_query); frm.set_query('customer', erpnext.queries.customer); }, onload: function (frm, cdt, cdn) { - let item = locals[cdt][cdn]; + // filters for serial no based on item code if (frm.doc.maintenance_type === "Scheduled") { - const schedule_id = item.purposes[0].prevdoc_detail_docname || frm.doc.maintenance_schedule_detail; + const schedule_id = frm.doc.maintenance_schedule_detail; + let item = frm.doc.purposes[0]; frappe.call({ method: "erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule.update_serial_nos", args: { - s_id: schedule_id - }, - callback: function (r) { - serial_nos = r.message; + s_id: schedule_id, + item: item } + }).then((r) => { + let serial_nos = r.message; + frm.set_query('serial_no', 'purposes', function () { + if (serial_nos.length > 0) { + return { + filters: { + 'item_code': item.item_code, + 'name': ["in", serial_nos] + } + }; + } + return { + filters: { + 'item_code': item.item_code + } + }; + }); + }); } else { @@ -63,7 +59,6 @@ frappe.ui.form.on('Maintenance Visit', { contact_person: function (frm) { erpnext.utils.get_contact_details(frm); } - }) // TODO commonify this code