feat: Created Dialog Box on trying to create a maintenance visit.
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
index 1245246..d077108 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
@@ -65,11 +65,93 @@
}, __("Get Items From"));
} else if (this.frm.doc.docstatus === 1) {
this.frm.add_custom_button(__('Create Maintenance Visit'), function () {
- frappe.model.open_mapped_doc({
- method: "erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
- source_name: me.frm.doc.name,
- frm: me.frm
- });
+ let items = me.frm.doc.items;
+ let s = me.frm.doc.schedules;
+ let options = "";
+ let dates = "";
+ for (let i in items) {
+ for(let d in s){
+ if (s[d].item_name == items[i].item_name && s[d].completion_status == "Pending") {
+ options = options + '\n' + items[i].item_name
+ break
+ }
+ }
+ }
+ function formatDate(date) {
+ var d = new Date(date),
+ month = '' + (d.getMonth() + 1),
+ day = '' + d.getDate(),
+ year = d.getFullYear();
+
+ if (month.length < 2)
+ month = '0' + month;
+ if (day.length < 2)
+ day = '0' + day;
+
+ return [day, month, year].join('-');
+ }
+ var schedule_id = ""
+ var d = new frappe.ui.Dialog({
+ title: __("Enter Visit Details"),
+ fields: [{
+ fieldtype: "Select",
+ fieldname: "item_name",
+ label: __("Item Name"),
+ options: options,
+ reqd: 1,
+ onchange: function () {
+ let field = d.get_field("scheduled_date");
+ dates = ""
+ for (let i in s) {
+ if (s[i].item_name == this.value) {
+ dates = dates + '\n' + formatDate(s[i].scheduled_date);
+ }
+
+ }
+ field.df.options = dates;
+ field.refresh();
+ }
+ },
+ {
+ label: __('Scheduled Date'),
+ fieldname: 'scheduled_date',
+ fieldtype: 'Select',
+ options: dates,
+ reqd: 1,
+ onchange: function(){
+ let field = d.get_field('item_name');
+ for(let i in s ){
+ if(s[i].item_name == field.value && formatDate(s[i].scheduled_date) == this.value){
+ schedule_id = s[i].name;
+ }
+ }
+ }
+ },
+ ],
+ primary_action_label: 'Create Visit',
+ primary_action(values) {
+ frappe.call({
+ method: "erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
+ args: {
+ item_name: values.item_name,
+ s_id: schedule_id,
+ source_name: me.frm.doc.name,
+
+ },
+ callback: function (r) {
+ if (!r.exc) {
+ frappe.model.sync(r.message);
+ frappe.set_route("Form", r.message.doctype, r.message.name);
+ }
+ }
+
+
+ });
+ d.hide();
+ }
+ })
+ d.show()
+
}, __('Create'));
}
},
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
index 60dd298..fd06a4e 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.py
@@ -32,8 +32,7 @@
child.idx = count
count = count + 1
child.sales_person = d.sales_person
-
-
+ child.completion_status = "Pending"
def on_submit(self):
if not self.get('schedules'):
@@ -58,9 +57,9 @@
if no_email_sp:
frappe.msgprint(
- frappe._("Setting Events to {0}, since the Employee attached to the below Sales Persons does not have a User ID{1}").format(
- self.owner, "<br>" + "<br>".join(no_email_sp)
- ))
+ frappe._("Setting Events to {0}, since the Employee attached to the below Sales Persons does not have a User ID{1}").format(
+ self.owner, "<br>" + "<br>".join(no_email_sp)
+ ))
scheduled_date = frappe.db.sql("""select scheduled_date from
`tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
@@ -69,12 +68,12 @@
for key in scheduled_date:
description =frappe._("Reference: {0}, Item Code: {1} and Customer: {2}").format(self.name, d.item_code, self.customer)
event = frappe.get_doc({
- "doctype": "Event",
- "owner": email_map.get(d.sales_person, self.owner),
- "subject": description,
- "description": description,
- "starts_on": cstr(key["scheduled_date"]) + " 10:00:00",
- "event_type": "Private",
+ "doctype": "Event",
+ "owner": email_map.get(d.sales_person, self.owner),
+ "subject": description,
+ "description": description,
+ "starts_on": cstr(key["scheduled_date"]) + " 10:00:00",
+ "event_type": "Private",
})
event.add_participant(self.doctype, self.name)
event.insert(ignore_permissions=1)
@@ -92,7 +91,7 @@
start_date_copy = add_days(start_date_copy, add_by)
if len(schedule_list) < no_of_visit:
schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy),
- sales_person)
+ sales_person)
if schedule_date > getdate(end_date):
schedule_date = getdate(end_date)
schedule_list.append(schedule_date)
@@ -127,16 +126,16 @@
if d.start_date and d.end_date and d.periodicity and d.periodicity!="Random":
date_diff = (getdate(d.end_date) - getdate(d.start_date)).days + 1
days_in_period = {
- "Weekly": 7,
- "Monthly": 30,
- "Quarterly": 90,
- "Half Yearly": 180,
- "Yearly": 365
+ "Weekly": 7,
+ "Monthly": 30,
+ "Quarterly": 90,
+ "Half Yearly": 180,
+ "Yearly": 365
}
if date_diff < days_in_period[d.periodicity]:
throw(_("Row {0}: To set {1} periodicity, difference between from and to date must be greater than or equal to {2}")
- .format(d.idx, d.periodicity, days_in_period[d.periodicity]))
+ .format(d.idx, d.periodicity, days_in_period[d.periodicity]))
def validate_maintenance_detail(self):
if not self.get('items'):
@@ -172,8 +171,8 @@
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:
@@ -184,27 +183,27 @@
def validate_serial_no(self, item_code, serial_nos, amc_start_date):
for serial_no in serial_nos:
sr_details = frappe.db.get_value("Serial No", serial_no,
- ["warranty_expiry_date", "amc_expiry_date", "warehouse", "delivery_date", "item_code"], as_dict=1)
+ ["warranty_expiry_date", "amc_expiry_date", "warehouse", "delivery_date", "item_code"], as_dict=1)
if not sr_details:
frappe.throw(_("Serial No {0} not found").format(serial_no))
if sr_details.get("item_code") != item_code:
frappe.throw(_("Serial No {0} does not belong to Item {1}")
- .format(frappe.bold(serial_no), frappe.bold(item_code)), title="Invalid")
+ .format(frappe.bold(serial_no), frappe.bold(item_code)), title="Invalid")
if sr_details.warranty_expiry_date \
- and getdate(sr_details.warranty_expiry_date) >= getdate(amc_start_date):
+ and getdate(sr_details.warranty_expiry_date) >= getdate(amc_start_date):
throw(_("Serial No {0} is under warranty upto {1}")
- .format(serial_no, sr_details.warranty_expiry_date))
+ .format(serial_no, sr_details.warranty_expiry_date))
if sr_details.amc_expiry_date and getdate(sr_details.amc_expiry_date) >= getdate(amc_start_date):
throw(_("Serial No {0} is under maintenance contract upto {1}")
- .format(serial_no, sr_details.amc_expiry_date))
+ .format(serial_no, sr_details.amc_expiry_date))
if not sr_details.warehouse and sr_details.delivery_date and \
- getdate(sr_details.delivery_date) >= getdate(amc_start_date):
- throw(_("Maintenance start date can not be before delivery date for Serial No {0}")
+ getdate(sr_details.delivery_date) >= getdate(amc_start_date):
+ throw(_("Maintenance start date can not be before delivery date for Serial No {0}")
.format(serial_no))
def validate_schedule(self):
@@ -248,31 +247,37 @@
delete_events(self.doctype, self.name)
@frappe.whitelist()
-def make_maintenance_visit(source_name, target_doc=None):
+def make_maintenance_visit(source_name, target_doc=None,item_name=None,s_id=None):
from frappe.model.mapper import get_mapped_doc
def update_status(source, target, parent):
target.maintenance_type = "Scheduled"
+ def update_sid(source, target, parent):
+ target.prevdoc_detail_docname = s_id
+
doclist = get_mapped_doc("Maintenance Schedule", source_name, {
- "Maintenance Schedule": {
- "doctype": "Maintenance Visit",
- "field_map": {
- "name": "maintenance_schedule"
+ "Maintenance Schedule": {
+ "doctype": "Maintenance Visit",
+ "field_map": {
+ "name": "maintenance_schedule"
+ },
+ "validation": {
+ "docstatus": ["=", 1]
+ },
+ "postprocess": update_status
},
- "validation": {
- "docstatus": ["=", 1]
- },
- "postprocess": update_status
- },
- "Maintenance Schedule Item": {
- "doctype": "Maintenance Visit Purpose",
- "field_map": {
- "parent": "prevdoc_docname",
- "parenttype": "prevdoc_doctype",
- "sales_person": "service_person"
+ "Maintenance Schedule Item": {
+ "doctype": "Maintenance Visit Purpose",
+ "field_map": {
+ "parent": "prevdoc_docname",
+ "parenttype": "prevdoc_doctype",
+ },
+ "condition": lambda doc: doc.item_name == item_name,
+
+ "postprocess": update_sid
+
}
- }
}, target_doc)
return doclist
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 73536f6..7fda687 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
+++ b/erpnext/maintenance/doctype/maintenance_schedule_detail/maintenance_schedule_detail.json
@@ -12,7 +12,8 @@
"scheduled_date",
"actual_date",
"sales_person",
- "serial_no"
+ "serial_no",
+ "completion_status"
],
"fields": [
{
@@ -52,6 +53,7 @@
{
"fieldname": "actual_date",
"fieldtype": "Date",
+ "in_list_view": 1,
"label": "Actual Date",
"no_copy": 1,
"oldfieldname": "actual_date",
@@ -81,12 +83,18 @@
"print_width": "160px",
"read_only": 1,
"width": "160px"
+ },
+ {
+ "fieldname": "completion_status",
+ "fieldtype": "Select",
+ "label": "Completion Status",
+ "options": "Pending\nPartially Completed\nFully Completed"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2021-04-16 16:01:53.271287",
+ "modified": "2021-04-19 16:18:36.723319",
"modified_by": "Administrator",
"module": "Maintenance",
"name": "Maintenance Schedule Detail",
diff --git a/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
index 467441d..60e5afe 100644
--- a/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
+++ b/erpnext/maintenance/doctype/maintenance_visit_purpose/maintenance_visit_purpose.json
@@ -1,4 +1,5 @@
{
+ "actions": [],
"autoname": "hash",
"creation": "2013-02-22 01:28:06",
"doctype": "DocType",
@@ -62,6 +63,8 @@
"fieldtype": "Section Break"
},
{
+ "fetch_from": "prevdoc_detail_docname.sales_person",
+ "fetch_if_empty": 1,
"fieldname": "service_person",
"fieldtype": "Link",
"in_list_view": 1,
@@ -110,12 +113,12 @@
},
{
"fieldname": "prevdoc_detail_docname",
- "fieldtype": "Data",
- "hidden": 1,
+ "fieldtype": "Link",
"label": "Against Document Detail No",
"no_copy": 1,
"oldfieldname": "prevdoc_detail_docname",
"oldfieldtype": "Data",
+ "options": "Maintenance Schedule Detail",
"print_hide": 1,
"print_width": "160px",
"read_only": 1,
@@ -125,7 +128,8 @@
],
"idx": 1,
"istable": 1,
- "modified": "2020-09-18 17:26:09.703215",
+ "links": [],
+ "modified": "2021-04-19 16:08:10.671163",
"modified_by": "Administrator",
"module": "Maintenance",
"name": "Maintenance Visit Purpose",