fix: update Maintenance Schedule status on Maintenance Visit submit

This commit is contained in:
s-aga-r 2024-01-05 22:58:04 +05:30
parent 4d56f725fe
commit cd293a5173
4 changed files with 89 additions and 34 deletions

View File

@ -131,12 +131,11 @@ class MaintenanceSchedule(TransactionBase):
).format(self.owner, "<br>" + "<br>".join(no_email_sp)) ).format(self.owner, "<br>" + "<br>".join(no_email_sp))
) )
scheduled_date = frappe.db.sql( scheduled_date = frappe.db.get_all(
"""select scheduled_date from "Maintenance Schedule Detail",
`tabMaintenance Schedule Detail` where item_code=%s and {"parent": self.name, "item_code": d.item_code},
parent=%s""", ["scheduled_date"],
(d.item_code, self.name), as_list=False,
as_dict=1,
) )
for key in scheduled_date: for key in scheduled_date:
@ -450,15 +449,23 @@ def get_serial_nos_from_schedule(item_code, schedule=None):
def make_maintenance_visit(source_name, target_doc=None, item_name=None, s_id=None): def make_maintenance_visit(source_name, target_doc=None, item_name=None, s_id=None):
from frappe.model.mapper import get_mapped_doc from frappe.model.mapper import get_mapped_doc
def condition(doc):
if s_id:
return doc.name == s_id
elif item_name:
return doc.item_name == item_name
return True
def update_status_and_detail(source, target, parent): def update_status_and_detail(source, target, parent):
target.maintenance_type = "Scheduled" target.maintenance_type = "Scheduled"
target.maintenance_schedule_detail = s_id
def update_serial(source, target, parent): def update_serial(source, target, parent):
if source.serial_and_batch_bundle: if source.item_reference:
serial_nos = frappe.get_doc( if sbb := frappe.db.get_value(
"Serial and Batch Bundle", source.serial_and_batch_bundle "Maintenance Schedule Item", source.item_reference, "serial_and_batch_bundle"
).get_serial_nos() ):
serial_nos = frappe.get_doc("Serial and Batch Bundle", sbb).get_serial_nos()
if len(serial_nos) == 1: if len(serial_nos) == 1:
target.serial_no = serial_nos[0] target.serial_no = serial_nos[0]
@ -475,10 +482,13 @@ def make_maintenance_visit(source_name, target_doc=None, item_name=None, s_id=No
"validation": {"docstatus": ["=", 1]}, "validation": {"docstatus": ["=", 1]},
"postprocess": update_status_and_detail, "postprocess": update_status_and_detail,
}, },
"Maintenance Schedule Item": { "Maintenance Schedule Detail": {
"doctype": "Maintenance Visit Purpose", "doctype": "Maintenance Visit Purpose",
"condition": lambda doc: doc.item_name == item_name if item_name else True, "condition": condition,
"field_map": {"sales_person": "service_person"}, "field_map": {
"sales_person": "service_person",
"name": "maintenance_schedule_detail",
},
"postprocess": update_serial, "postprocess": update_serial,
}, },
}, },

View File

@ -56,7 +56,8 @@ class MaintenanceVisit(TransactionBase):
frappe.throw(_("Add Items in the Purpose Table"), title=_("Purposes Required")) frappe.throw(_("Add Items in the Purpose Table"), title=_("Purposes Required"))
def validate_maintenance_date(self): def validate_maintenance_date(self):
if self.maintenance_type == "Scheduled" and self.maintenance_schedule_detail: if self.maintenance_type == "Scheduled":
if self.maintenance_schedule_detail:
item_ref = frappe.db.get_value( item_ref = frappe.db.get_value(
"Maintenance Schedule Detail", self.maintenance_schedule_detail, "item_reference" "Maintenance Schedule Detail", self.maintenance_schedule_detail, "item_reference"
) )
@ -70,6 +71,24 @@ class MaintenanceVisit(TransactionBase):
frappe.throw( frappe.throw(
_("Date must be between {0} and {1}").format(format_date(start_date), format_date(end_date)) _("Date must be between {0} and {1}").format(format_date(start_date), format_date(end_date))
) )
else:
for purpose in self.purposes:
if purpose.maintenance_schedule_detail:
item_ref = frappe.db.get_value(
"Maintenance Schedule Detail", purpose.maintenance_schedule_detail, "item_reference"
)
if 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(
format_date(start_date), format_date(end_date)
)
)
def validate(self): def validate(self):
self.validate_serial_no() self.validate_serial_no()
@ -82,6 +101,7 @@ class MaintenanceVisit(TransactionBase):
if not cancel: if not cancel:
status = self.completion_status status = self.completion_status
actual_date = self.mntc_date actual_date = self.mntc_date
if self.maintenance_schedule_detail: if self.maintenance_schedule_detail:
frappe.db.set_value( frappe.db.set_value(
"Maintenance Schedule Detail", self.maintenance_schedule_detail, "completion_status", status "Maintenance Schedule Detail", self.maintenance_schedule_detail, "completion_status", status
@ -89,6 +109,21 @@ class MaintenanceVisit(TransactionBase):
frappe.db.set_value( frappe.db.set_value(
"Maintenance Schedule Detail", self.maintenance_schedule_detail, "actual_date", actual_date "Maintenance Schedule Detail", self.maintenance_schedule_detail, "actual_date", actual_date
) )
else:
for purpose in self.purposes:
if purpose.maintenance_schedule_detail:
frappe.db.set_value(
"Maintenance Schedule Detail",
purpose.maintenance_schedule_detail,
"completion_status",
status,
)
frappe.db.set_value(
"Maintenance Schedule Detail",
purpose.maintenance_schedule_detail,
"actual_date",
actual_date,
)
def update_customer_issue(self, flag): def update_customer_issue(self, flag):
if not self.maintenance_schedule: if not self.maintenance_schedule:

View File

@ -17,7 +17,8 @@
"work_details", "work_details",
"work_done", "work_done",
"prevdoc_doctype", "prevdoc_doctype",
"prevdoc_docname" "prevdoc_docname",
"maintenance_schedule_detail"
], ],
"fields": [ "fields": [
{ {
@ -49,6 +50,8 @@
"options": "Serial No" "options": "Serial No"
}, },
{ {
"fetch_from": "item_code.description",
"fetch_if_empty": 1,
"fieldname": "description", "fieldname": "description",
"fieldtype": "Text Editor", "fieldtype": "Text Editor",
"in_list_view": 1, "in_list_view": 1,
@ -56,7 +59,6 @@
"oldfieldname": "description", "oldfieldname": "description",
"oldfieldtype": "Small Text", "oldfieldtype": "Small Text",
"print_width": "300px", "print_width": "300px",
"reqd": 1,
"width": "300px" "width": "300px"
}, },
{ {
@ -103,12 +105,19 @@
{ {
"fieldname": "section_break_6", "fieldname": "section_break_6",
"fieldtype": "Section Break" "fieldtype": "Section Break"
},
{
"fieldname": "maintenance_schedule_detail",
"fieldtype": "Data",
"hidden": 1,
"label": "Maintenance Schedule Detail",
"options": "Maintenance Schedule Detail"
} }
], ],
"idx": 1, "idx": 1,
"istable": 1, "istable": 1,
"links": [], "links": [],
"modified": "2023-02-27 11:09:33.114458", "modified": "2024-01-05 21:46:53.239830",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Maintenance", "module": "Maintenance",
"name": "Maintenance Visit Purpose", "name": "Maintenance Visit Purpose",

View File

@ -14,9 +14,10 @@ class MaintenanceVisitPurpose(Document):
if TYPE_CHECKING: if TYPE_CHECKING:
from frappe.types import DF from frappe.types import DF
description: DF.TextEditor description: DF.TextEditor | None
item_code: DF.Link | None item_code: DF.Link | None
item_name: DF.Data | None item_name: DF.Data | None
maintenance_schedule_detail: DF.Data | None
parent: DF.Data parent: DF.Data
parentfield: DF.Data parentfield: DF.Data
parenttype: DF.Data parenttype: DF.Data