diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js index d07710878d..45e632cd35 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js @@ -64,6 +64,14 @@ erpnext.maintenance.MaintenanceSchedule = frappe.ui.form.Controller.extend({ }); }, __("Get Items From")); } else if (this.frm.doc.docstatus === 1) { + var s = me.frm.doc.schedules; + let flag = 0 + for(let i in s){ + if (s[i].completion_status == pending){ + flag = 1 + } + } + if(count){ this.frm.add_custom_button(__('Create Maintenance Visit'), function () { let items = me.frm.doc.items; let s = me.frm.doc.schedules; @@ -103,7 +111,7 @@ erpnext.maintenance.MaintenanceSchedule = frappe.ui.form.Controller.extend({ let field = d.get_field("scheduled_date"); dates = "" for (let i in s) { - if (s[i].item_name == this.value) { + if (s[i].item_name == this.value && s[i].completion_status == "Pending") { dates = dates + '\n' + formatDate(s[i].scheduled_date); } @@ -154,6 +162,7 @@ erpnext.maintenance.MaintenanceSchedule = frappe.ui.form.Controller.extend({ }, __('Create')); } + } }, start_date: function (doc, cdt, cdn) { diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py index fd06a4ef9b..aa582ee219 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py +++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py @@ -33,6 +33,7 @@ class MaintenanceSchedule(TransactionBase): count = count + 1 child.sales_person = d.sales_person child.completion_status = "Pending" + child.item_ref = d.name def on_submit(self): if not self.get('schedules'): @@ -171,9 +172,7 @@ class MaintenanceSchedule(TransactionBase): def on_update(self): frappe.db.set(self, 'status', 'Draft') - - - + def update_amc_date(self, serial_nos, amc_expiry_date=None): for serial_no in serial_nos: serial_no_doc = frappe.get_doc("Serial No", serial_no) @@ -255,6 +254,8 @@ def make_maintenance_visit(source_name, target_doc=None,item_name=None,s_id=None def update_sid(source, target, parent): target.prevdoc_detail_docname = s_id + sales_person = frappe.db.get_value('Maintenance Schedule Detail', s_id, 'sales_person') + target.service_person = sales_person doclist = get_mapped_doc("Maintenance Schedule", source_name, { "Maintenance Schedule": { @@ -275,7 +276,7 @@ def make_maintenance_visit(source_name, target_doc=None,item_name=None,s_id=None }, "condition": lambda doc: doc.item_name == item_name, - "postprocess": update_sid + "postprocess": update_sid } }, target_doc) diff --git a/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json index 7fda687ca4..f1e2e21a12 100644 --- a/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json +++ b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json @@ -10,10 +10,11 @@ "item_code", "item_name", "scheduled_date", - "actual_date", "sales_person", + "actual_date", + "completion_status", "serial_no", - "completion_status" + "item_ref" ], "fields": [ { @@ -29,11 +30,9 @@ "search_index": 1 }, { - "columns": 2, "fieldname": "item_name", "fieldtype": "Data", "in_global_search": 1, - "in_list_view": 1, "label": "Item Name", "oldfieldname": "item_name", "oldfieldtype": "Data", @@ -71,7 +70,8 @@ "label": "Sales Person", "oldfieldname": "incharge_name", "oldfieldtype": "Link", - "options": "Sales Person" + "options": "Sales Person", + "read_only_depends_on": "eval:doc.completion_status != \"Pending\"" }, { "fieldname": "serial_no", @@ -85,16 +85,25 @@ "width": "160px" }, { + "columns": 2, "fieldname": "completion_status", "fieldtype": "Select", + "in_list_view": 1, "label": "Completion Status", - "options": "Pending\nPartially Completed\nFully Completed" + "options": "Pending\nPartially Completed\nFully Completed", + "read_only": 1 + }, + { + "fieldname": "item_ref", + "fieldtype": "Data", + "label": "Item Reference", + "read_only": 1 } ], "idx": 1, "istable": 1, "links": [], - "modified": "2021-04-19 16:18:36.723319", + "modified": "2021-04-19 17:42:31.685710", "modified_by": "Administrator", "module": "Maintenance", "name": "Maintenance Schedule Detail", diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py index 2f2ad00e02..9505a36545 100644 --- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py +++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py @@ -4,6 +4,7 @@ from __future__ import unicode_literals import frappe from frappe import _ +from frappe.utils import get_datetime from erpnext.utilities.transaction_base import TransactionBase @@ -16,8 +17,33 @@ class MaintenanceVisit(TransactionBase): if d.serial_no and not frappe.db.exists("Serial No", d.serial_no): frappe.throw(_("Serial No {0} does not exist").format(d.serial_no)) + def validate_mntc_date(self): + if self.maintenance_type == "Scheduled": + p = self.purposes + for i in p: + detail_ref = i.prevdoc_detail_docname + item_ref = frappe.db.get_value('Maintenance Schedule Detail', detail_ref , 'item_ref') + start_date, end_date = frappe.db.get_value('Maintenance Schedule Item', item_ref, ['start_date', 'end_date']) + if get_datetime(self.mntc_date) < get_datetime(start_date) or get_datetime(self.mntc_date) > get_datetime(end_date): + frappe.throw(_("Date must be between {0} and {1}").format(start_date,end_date)) + def validate(self): self.validate_serial_no() + self.validate_mntc_date() + + def update_completion_status(self): + if self.maintenance_type == "Scheduled": + p = self.purposes + for i in p: + detail_ref = i.prevdoc_detail_docname + frappe.db.set_value('Maintenance Schedule Detail', detail_ref, 'completion_status', self.completion_status) + + def update_actual_date(self): + if self.maintenance_type == "Scheduled": + p = self.purposes + for i in p: + detail_ref = i.prevdoc_detail_docname + frappe.db.set_value('Maintenance Schedule Detail', detail_ref, 'actual_date', self.mntc_date) def update_customer_issue(self, flag): for d in self.get('purposes'): @@ -77,6 +103,8 @@ class MaintenanceVisit(TransactionBase): def on_submit(self): self.update_customer_issue(1) frappe.db.set(self, 'status', 'Submitted') + self.update_completion_status() + self.update_actual_date() def on_cancel(self): self.check_if_last_visit()