From 921484e1e0c0084022359b7d7ed80fd64127959c Mon Sep 17 00:00:00 2001 From: Lyeta-code Date: Fri, 20 Jun 2025 14:31:34 +0300 Subject: [PATCH] feat: synchronize truck and trip status updates --- .../vsd_fleet_ms/doctype/trips/trips.js | 18 +++--- .../vsd_fleet_ms/doctype/trips/trips.json | 12 ++-- .../vsd_fleet_ms/doctype/trips/trips.py | 58 ++++++++++++++++++- .../vsd_fleet_ms/doctype/truck/truck.json | 6 +- .../doctype/truck_log/truck_log.json | 2 +- 5 files changed, 76 insertions(+), 20 deletions(-) diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.js b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.js index dd4d267..4c7b8c8 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.js +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.js @@ -7,20 +7,16 @@ frappe.ui.form.on('Trips', { requested_total(); rejected_total(); fuel_amount(); - if (frm.doc.trip_completed == 0 && frm.doc.trip_status != "Breakdown") { + if (frm.doc.trip_completed == 0 && frm.doc.trip_status != "Brake down") { frm.add_custom_button(__("Complete Trip"), function () { frm.set_value("trip_completed", 1); frm.set_value("trip_completed_date", frappe.datetime.nowdate()); var truck = frm.doc.truck_number; - frm.save(); - if (frm.doc.transporter_type == "In House") { - frappe.db.set_value('Truck', truck, { - trans_ms_current_trip: '', - status: 'Idle' - }).then(r => { - frappe.msgprint(__(`Truck ${truck} is Available now`)); - }); - } + frm.save().then(() => { + if (frm.doc.transporter_type == "In House") { + frappe.msgprint(__(`Trip completed. Truck ${truck} status updated accordingly.`)); + } + }); }, __('Actions')); } if(frm.doc.trip_completed == 0 && frm.doc.trip_status == "Pending" && frm.doc.docstatus == 0){ @@ -41,7 +37,7 @@ frappe.ui.form.on('Trips', { }); }, __('Actions')); } - if(!frm.doc.resumption_trip && frm.doc.trip_status == "Breakdown" && frm.doc.status != "Re-Assigned"){ + if(!frm.doc.resumption_trip && frm.doc.trip_status == "Brake down" && frm.doc.status != "Re-Assigned"){ frm.add_custom_button(__('Allocate New Vehicle Trip'), function() { frappe.call({ method: 'vsd_fleet_ms.vsd_fleet_ms.doctype.trips.trips.create_resumption_trip', diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.json b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.json index a3dbd87..4ebd1e2 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.json +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.json @@ -175,7 +175,7 @@ "fieldname": "eta_end_of_trip", "fieldtype": "Data", "label": "ETA End Of Trip", - "read_only_depends_on": "eval:doc.trip_status == \"Breakdown\"" + "read_only_depends_on": "eval:doc.trip_status == \"Brake down\"" }, { "fieldname": "section_break_ld7mf", @@ -334,7 +334,7 @@ "fieldtype": "Table", "label": "Location Update", "options": "Truck Trip Location Update", - "read_only_depends_on": "eval:doc.trip_status == \"Breakdown\"" + "read_only_depends_on": "eval:doc.trip_status == \"Brake down\"" }, { "fieldname": "side_trips_tab", @@ -374,14 +374,14 @@ "fieldname": "phone_number", "fieldtype": "Data", "label": "Phone Number", - "read_only_depends_on": "eval:doc.trip_status == \"Breakdown\"" + "read_only_depends_on": "eval:doc.trip_status == \"Brake down\"" }, { "depends_on": "eval:doc.transporter_type == \"In House\"", "fieldname": "licence_number", "fieldtype": "Data", "label": "Licence Number", - "read_only_depends_on": "eval:doc.trip_status == \"Breakdown\"" + "read_only_depends_on": "eval:doc.trip_status == \"Brake down\"" }, { "fieldname": "section_break_7vc12", @@ -552,11 +552,11 @@ "fieldname": "trip_status", "fieldtype": "Select", "label": "Trip Status", - "options": "Pending\nCompleted\nBreakdown", + "options": "Pending\nCompleted\nBrake down", "read_only": 1 }, { - "depends_on": "eval:doc.trip_status == \"Breakdown\"", + "depends_on": "eval:doc.trip_status == \"Brake down\"", "fieldname": "vehicle_breakdown_tab", "fieldtype": "Tab Break", "label": "Vehicle Breakdown" diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.py index d798239..2790ff9 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.py @@ -17,6 +17,61 @@ from vsd_fleet_ms.vsd_fleet_ms.doctype.requested_payment.requested_payment import request_funds class Trips(Document): + def before_save(self): + if not self.date: + self.date = datetime.datetime.now() + # validate_requested_funds(self) + self.validate_main_route_inputs() + self.update_truck_status() + + def update_truck_status(self): + if self.transporter_type == "In House" and self.truck_number: + # Update truck status based on trip status + if self.trip_completed == 1: + # Check if truck has any other active trips before setting to Idle + other_active_trips = frappe.db.count('Trips', { + 'truck_number': self.truck_number, + 'trip_completed': 0, + 'name': ['!=', self.name], + 'docstatus': ['!=', 2] # Exclude cancelled trips + }) + + if other_active_trips == 0: + # Set truck to Idle when trip is completed and no other active trips + frappe.db.set_value('Truck', self.truck_number, { + 'status': 'Idle', + 'trans_ms_current_trip': '' + }) + else: + # If there are other active trips, just clear current trip reference + frappe.db.set_value('Truck', self.truck_number, { + 'trans_ms_current_trip': '' + }) + elif self.trip_status == "Brake down": + # Set truck status to Breakdown + frappe.db.set_value('Truck', self.truck_number, { + 'status': 'Breakdown', + 'trans_ms_current_trip': self.name + }) + else: + # Set truck to On Trip when assigned + frappe.db.set_value('Truck', self.truck_number, { + 'status': 'On Trip', + 'trans_ms_current_trip': self.name + }) + + def on_update(self): + # Update trip status based on completion + if self.trip_completed == 1 and self.trip_status != "Completed": + self.db_set("trip_status", "Completed") + # Update truck status when trip is completed + self.update_truck_status() + elif self.trip_status == "Brake down" and self.trip_completed == 1: + # If a breakdown trip is marked as completed, update status + self.db_set("trip_status", "Completed") + # Update truck status when breakdown trip is completed + self.update_truck_status() + def before_submit(self): self.set_driver() self.validate_request_status() @@ -125,6 +180,7 @@ def before_save(self): self.date = datetime.datetime.now() # validate_requested_funds(self) self.validate_main_route_inputs() + self.update_truck_status() def validate_fuel_requests(self): make_request = False @@ -453,7 +509,7 @@ def create_purchase_order(request_doc, item): @frappe.whitelist() def create_breakdown(docname): trip = frappe.get_doc("Trips", docname) - trip.trip_status = "Breakdown" + trip.trip_status = "Brake down" trip.status = "Not Re-Assigned" trip.breakdown_date = now() trip.save() diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/truck/truck.json b/vsd_fleet_ms/vsd_fleet_ms/doctype/truck/truck.json index d7bb012..6835339 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/truck/truck.json +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/truck/truck.json @@ -145,7 +145,7 @@ "fieldname": "status", "fieldtype": "Select", "label": "Status", - "options": "Idle\nUnder Maintenance\nOn Trip\nDisabled", + "options": "Idle\nUnder Maintenance\nOn Trip\nBreakdown\nDisabled", "read_only": 1 }, { @@ -302,6 +302,10 @@ "color": "Green", "title": "On Trip" }, + { + "color": "Orange", + "title": "Breakdown" + }, { "color": "Red", "title": "Disabled" diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/truck_log/truck_log.json b/vsd_fleet_ms/vsd_fleet_ms/doctype/truck_log/truck_log.json index 197b7af..88aba87 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/truck_log/truck_log.json +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/truck_log/truck_log.json @@ -27,7 +27,7 @@ "fieldtype": "Select", "in_list_view": 1, "label": "Vehicle Status", - "options": "Idle\nUnder Maintenance\nOn Trip\nDisabled", + "options": "Idle\nUnder Maintenance\nOn Trip\nBreakdown\nDisabled", "reqd": 1 }, {