fix: update status on visit cancel (#29389)
* fix: update status on cancelling visit
* test: updated test for cancelling visits
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
index 4d3c3f4..6e727e5 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
+++ b/erpnext/maintenance/doctype/maintenance_schedule/test_maintenance_schedule.py
@@ -4,6 +4,7 @@
import unittest
import frappe
+from frappe.utils import format_date
from frappe.utils.data import add_days, formatdate, today
from erpnext.maintenance.doctype.maintenance_schedule.maintenance_schedule import (
@@ -82,6 +83,13 @@
#checks if visit status is back updated in schedule
self.assertTrue(ms.schedules[1].completion_status, "Partially Completed")
+ self.assertEqual(format_date(visit.mntc_date), format_date(ms.schedules[1].actual_date))
+
+ #checks if visit status is updated on cancel
+ visit.cancel()
+ ms.reload()
+ self.assertTrue(ms.schedules[1].completion_status, "Pending")
+ self.assertEqual(ms.schedules[1].actual_date, None)
def test_serial_no_filters(self):
# Without serial no. set in schedule -> returns None
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
index d5d8753..6fe2466 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.py
@@ -4,7 +4,7 @@
import frappe
from frappe import _
-from frappe.utils import get_datetime
+from frappe.utils import format_date, get_datetime
from erpnext.utilities.transaction_base import TransactionBase
@@ -28,20 +28,24 @@
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(start_date, end_date))
+ frappe.throw(_("Date must be between {0} and {1}")
+ .format(format_date(start_date), format_date(end_date)))
+
def validate(self):
self.validate_serial_no()
self.validate_maintenance_date()
self.validate_purpose_table()
- def update_completion_status(self):
+ def update_status_and_actual_date(self, cancel=False):
+ status = "Pending"
+ actual_date = None
+ if not cancel:
+ status = self.completion_status
+ actual_date = self.mntc_date
if self.maintenance_schedule_detail:
- frappe.db.set_value('Maintenance Schedule Detail', self.maintenance_schedule_detail, 'completion_status', self.completion_status)
-
- def update_actual_date(self):
- if self.maintenance_schedule_detail:
- frappe.db.set_value('Maintenance Schedule Detail', self.maintenance_schedule_detail, 'actual_date', self.mntc_date)
+ frappe.db.set_value('Maintenance Schedule Detail', self.maintenance_schedule_detail, 'completion_status', status)
+ frappe.db.set_value('Maintenance Schedule Detail', self.maintenance_schedule_detail, 'actual_date', actual_date)
def update_customer_issue(self, flag):
if not self.maintenance_schedule:
@@ -102,12 +106,12 @@
def on_submit(self):
self.update_customer_issue(1)
frappe.db.set(self, 'status', 'Submitted')
- self.update_completion_status()
- self.update_actual_date()
+ self.update_status_and_actual_date()
def on_cancel(self):
self.check_if_last_visit()
frappe.db.set(self, 'status', 'Cancelled')
+ self.update_status_and_actual_date(cancel=True)
def on_update(self):
pass