diff --git a/vsd_fleet_ms/hooks.py b/vsd_fleet_ms/hooks.py index 4608ccc..a27f2e8 100644 --- a/vsd_fleet_ms/hooks.py +++ b/vsd_fleet_ms/hooks.py @@ -66,9 +66,11 @@ # before_install = "vsd_fleet_ms.install.before_install" after_install = [ "vsd_fleet_ms.utils.service_job_card_tyre_fields.ensure_service_job_card_tyre_fields", + "vsd_fleet_ms.utils.trips_service_job_card_fields.ensure_trips_service_job_card_fields", ] after_migrate = [ "vsd_fleet_ms.utils.service_job_card_tyre_fields.ensure_service_job_card_tyre_fields", + "vsd_fleet_ms.utils.trips_service_job_card_fields.ensure_trips_service_job_card_fields", ] # Uninstallation @@ -115,51 +117,6 @@ # } # } doc_events = { - "Trips": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Fuel Requests": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Cargo Registration": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Transportation Order": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Requested Payment": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Sales Invoice": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Sales Order": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Purchase Invoice": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Purchase Order": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Purchase Receipt": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Delivery Note": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Stock Entry": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Journal Entry": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Payment Entry": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, - "Quotation": { - "validate": "vsd_fleet_ms.utils.fleet_company_fields.set_company_from_transport_settings", - }, "Service Job Card": { "on_submit": "vsd_fleet_ms.utils.tyre_service_integration.create_tyre_movement_from_service_job_card" } diff --git a/vsd_fleet_ms/tyre_management/doctype/tyre_master/tyre_master.py b/vsd_fleet_ms/tyre_management/doctype/tyre_master/tyre_master.py index a7eca18..2858c50 100644 --- a/vsd_fleet_ms/tyre_management/doctype/tyre_master/tyre_master.py +++ b/vsd_fleet_ms/tyre_management/doctype/tyre_master/tyre_master.py @@ -7,6 +7,19 @@ class TyreMaster(Document): def validate(self): + last_ledger = frappe.get_all( + "Tyre Ledger", + filters={"tyre": self.name}, + fields=["transaction_type", "movement_type"], + order_by="creation desc", + limit=1, + ) + + if last_ledger: + ledger_row = last_ledger[0] + if ledger_row.get("movement_type") == "Scrap" or ledger_row.get("transaction_type") == "Scrap": + self.status = "Scrapped" + if self.status == "Scrapped": self.current_vehicle_type = "" self.current_vehicle = "" diff --git a/vsd_fleet_ms/tyre_management/doctype/tyre_movement/tyre_movement.py b/vsd_fleet_ms/tyre_management/doctype/tyre_movement/tyre_movement.py index 489b055..9d4e26f 100644 --- a/vsd_fleet_ms/tyre_management/doctype/tyre_movement/tyre_movement.py +++ b/vsd_fleet_ms/tyre_management/doctype/tyre_movement/tyre_movement.py @@ -84,6 +84,12 @@ def on_submit(self): self.update_tyre_master(tyre) self.create_ledger_entry() + def on_cancel(self): + self.delete_ledger_entries() + tyre = frappe.get_doc("Tyre Master", self.tyre_serial) + self.restore_tyre_master_from_ledger(tyre) + tyre.save(ignore_permissions=True) + def update_tyre_master(self, tyre): movement_type = self.movement_type @@ -142,3 +148,67 @@ def create_ledger_entry(self): ledger.odometer_km = self.odometer_km ledger.remarks = self.remarks ledger.insert(ignore_permissions=True) + + def delete_ledger_entries(self): + ledger_names = frappe.get_all( + "Tyre Ledger", + filters={ + "reference_doctype": self.doctype, + "reference_name": self.name, + }, + pluck="name", + ) + + for ledger_name in ledger_names: + frappe.delete_doc("Tyre Ledger", ledger_name, ignore_permissions=True) + + def restore_tyre_master_from_ledger(self, tyre): + last_movement = frappe.get_all( + "Tyre Ledger", + filters={ + "tyre": self.tyre_serial, + "transaction_type": "Movement", + }, + fields=[ + "movement_type", + "from_vehicle_type", + "from_vehicle", + "from_position", + "to_vehicle_type", + "to_vehicle", + "to_position", + ], + order_by="posting_date desc, creation desc", + limit=1, + ) + + if not last_movement: + tyre.status = "In Store" + tyre.current_vehicle_type = "" + tyre.current_vehicle = "" + tyre.position = "" + return + + movement = last_movement[0] + movement_type = movement.get("movement_type") + + if movement_type in ["Installation", "Positional Change", "Vehicle Transfer", "Return from Repair"]: + tyre.status = "In Service" + tyre.current_vehicle_type = movement.get("to_vehicle_type") or "" + tyre.current_vehicle = movement.get("to_vehicle") or "" + tyre.position = movement.get("to_position") or "" + elif movement_type == "Removal": + tyre.status = "In Store" + tyre.current_vehicle_type = "" + tyre.current_vehicle = "" + tyre.position = "" + elif movement_type == "Send for Repair": + tyre.status = "Under Repair" + tyre.current_vehicle_type = "" + tyre.current_vehicle = "" + tyre.position = "" + elif movement_type == "Scrap": + tyre.status = "Scrapped" + tyre.current_vehicle_type = "" + tyre.current_vehicle = "" + tyre.position = "" diff --git a/vsd_fleet_ms/utils/document_links.py b/vsd_fleet_ms/utils/document_links.py new file mode 100644 index 0000000..82fb98c --- /dev/null +++ b/vsd_fleet_ms/utils/document_links.py @@ -0,0 +1,13 @@ +import frappe + + +def _joined_refs(values): + refs = sorted({value for value in values if value}) + return ", ".join(refs) + + +def sync_cargo_registration_links(doc): + manifests = {row.manifest_number for row in (doc.cargo_details or []) if row.manifest_number} + trips = {row.created_trip for row in (doc.cargo_details or []) if row.created_trip} + doc.manifest = next(iter(manifests)) if len(manifests) == 1 else "" + doc.trip = next(iter(trips)) if len(trips) == 1 else "" diff --git a/vsd_fleet_ms/utils/trips_service_job_card_fields.py b/vsd_fleet_ms/utils/trips_service_job_card_fields.py new file mode 100644 index 0000000..8bf1ae0 --- /dev/null +++ b/vsd_fleet_ms/utils/trips_service_job_card_fields.py @@ -0,0 +1,53 @@ +import frappe +from frappe.custom.doctype.custom_field.custom_field import create_custom_fields + + +def ensure_trips_service_job_card_fields(): + """Create ServiceMS-linked fields on Trips only when ServiceMS exists. + + Safe to run repeatedly on migrate/install and on sites where ServiceMS is absent. + """ + if "servicems" not in frappe.get_installed_apps(): + return + + if not frappe.db.exists("DocType", "Service Job Card"): + return + + if not frappe.db.exists("DocType", "Trips"): + return + + create_custom_fields( + { + "Trips": [ + { + "fieldname": "service_job_card", + "label": "Service Job Card", + "fieldtype": "Link", + "options": "Service Job Card", + "insert_after": "costing_section", + }, + { + "fieldname": "column_break_service_job_card", + "fieldtype": "Column Break", + "insert_after": "service_job_card", + }, + { + "fieldname": "service_charges", + "label": "Service Charges", + "fieldtype": "Currency", + "fetch_from": "service_job_card.service_charges", + "read_only": 1, + "insert_after": "column_break_service_job_card", + }, + { + "fieldname": "spares_cost", + "label": "Spares Cost", + "fieldtype": "Currency", + "fetch_from": "service_job_card.spares_cost", + "read_only": 1, + "insert_after": "service_charges", + }, + ] + }, + update=True, + ) diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/bulk_cargo/bulk_cargo.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/bulk_cargo/bulk_cargo.py index 7fb750f..64a7517 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/bulk_cargo/bulk_cargo.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/bulk_cargo/bulk_cargo.py @@ -2,8 +2,6 @@ from frappe import _ from frappe.model.document import Document from frappe.utils import nowdate, flt -from vsd_fleet_ms.utils.fleet_company_fields import get_transport_company - class BulkCargo(Document): def validate(self): """Called on Save; calculate totals but allow empty child table""" @@ -150,15 +148,16 @@ def create_sales_invoice(name): "customer": bulk_cargo.customer_name, "currency": frappe.defaults.get_global_default("currency"), # <-- fixed here "posting_date": nowdate(), - "company": get_transport_company(), + "company": bulk_cargo.company, "items": items }) sales_invoice.insert(ignore_permissions=True) sales_invoice.save() - frappe.db.set_value("Bulk Cargo", name, "sales_invoice_id", sales_invoice.name) - frappe.db.commit() + bulk_cargo = frappe.get_doc("Bulk Cargo", name) + bulk_cargo.sales_invoice_id = sales_invoice.name + bulk_cargo.save(ignore_permissions=True) return {"status": "success", "invoice_name": sales_invoice.name, "rate": rate} diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.js b/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.js index db5ca68..1b646bc 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.js +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.js @@ -3,7 +3,6 @@ frappe.ui.form.on('Cargo Registration', { onload: function(frm){ - setFleetCompanyDefault(frm); if(!frm.doc.posting_date) { frm.set_value('posting_date', frappe.datetime.nowdate()); } @@ -58,17 +57,6 @@ frappe.ui.form.on('Cargo Registration', { }, }); -const setFleetCompanyDefault = (frm) => { - if (!frm.is_new()) return; - frappe.db.get_single_value("Transport Settings", "company").then((company) => { - const fallback = (frappe.boot && frappe.boot.sysdefaults && frappe.boot.sysdefaults.company) || ""; - const target_company = company || fallback; - if (target_company) { - frm.set_value("company", target_company); - } - }); -}; - frappe.ui.form.on('Cargo Detail', { form_render: function (frm, cdt, cdn) { const container = document.querySelector('[data-fieldname="assign_manifest"]'); diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.json b/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.json index 143bb47..54dc8e7 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.json +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.json @@ -14,6 +14,8 @@ "transport_type", "naming_series", "company", + "manifest", + "trip", "section_break_fuqjo", "cargo_details", "section_break_er7n8", @@ -60,6 +62,22 @@ "options": "Company", "set_only_once": 1 }, + { + "allow_on_submit": 1, + "fieldname": "manifest", + "fieldtype": "Link", + "label": "Manifest", + "options": "Manifest", + "read_only": 1 + }, + { + "allow_on_submit": 1, + "fieldname": "trip", + "fieldtype": "Link", + "label": "Trip", + "options": "Trips", + "read_only": 1 + }, { "fieldname": "section_break_fuqjo", "fieldtype": "Section Break" @@ -171,4 +189,4 @@ "track_changes": 1, "track_seen": 1, "track_views": 1 -} \ No newline at end of file +} diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.py index fd4c8dc..d1c8fc3 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/cargo_registration/cargo_registration.py @@ -12,10 +12,12 @@ from frappe.utils import nowdate, cstr, cint, flt, comma_or, now from frappe import _, msgprint from vsd_fleet_ms.utils.dimension import set_dimension +from vsd_fleet_ms.utils.document_links import sync_cargo_registration_links from vsd_fleet_ms.vsd_fleet_ms.doctype.requested_payment.requested_payment import request_funds class CargoRegistration(Document): def before_save(self): + sync_cargo_registration_links(self) if self.get('requested_fund'): for row in self.get('requested_fund'): if row.request_status == "Requested": diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.js b/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.js index 626d6e8..28b7f01 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.js +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.js @@ -3,7 +3,6 @@ frappe.ui.form.on('Fuel Requests', { onload: function (frm) { - setFleetCompanyDefault(frm); //Load the approve and reject buttons var html = ' '; html += ''; @@ -13,13 +12,13 @@ frappe.ui.form.on('Fuel Requests', { refresh: function (frm, cdt, cdn) { if (frm.doc.requested_fuel.length > 0 && frm.doc.approved_requests.length < 1 && frm.doc.status != "Waiting Approval"){ - frappe.db.set_value(frm.doc.doctype,frm.doc.name,"status","Waiting Approval") + frm.set_value("status", "Waiting Approval"); } if (frm.doc.requested_fuel.length > 0 && frm.doc.approved_requests.length > 0 && frm.doc.status != "Partially Processed"){ - frappe.db.set_value(frm.doc.doctype,frm.doc.name,"status","Partially Processed") + frm.set_value("status", "Partially Processed"); } if (frm.doc.requested_fuel.length < 1 && frm.doc.approved_requests.length > 0 && frm.doc.status != "Fully Processed"){ - frappe.db.set_value(frm.doc.doctype,frm.doc.name,"status","Fully Processed") + frm.set_value("status", "Fully Processed"); } frm.events.show_hide_sections(frm); @@ -130,17 +129,6 @@ cur_frm.cscript.approve_request = function (frm) { } }; -const setFleetCompanyDefault = (frm) => { - if (!frm.is_new()) return; - frappe.db.get_single_value("Transport Settings", "company").then((company) => { - const fallback = (frappe.boot && frappe.boot.sysdefaults && frappe.boot.sysdefaults.company) || ""; - const target_company = company || fallback; - if (target_company) { - frm.set_value("company", target_company); - } - }); -}; - //For reject button cur_frm.cscript.reject_request = function (frm) { //cur_frm.cscript.populate_child(cur_frm.doc.reference_doctype, cur_frm.doc.reference_docname); @@ -183,4 +171,3 @@ cur_frm.cscript.reject_request = function (frm) { show_alert("Error: Please select requests to process."); } }; - diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.py index 9968324..2929aa6 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.py @@ -10,12 +10,8 @@ from frappe import _, msgprint from frappe.model.mapper import get_mapped_doc from frappe.utils import nowdate -from vsd_fleet_ms.utils.fleet_company_fields import get_transport_company - class FuelRequests(Document): def onload(self): - if not self.company: - self.company = get_transport_company(self.company) trip = frappe.get_doc(self.reference_doctype, self.reference_docname) if not self.main_route: self.set("main_route", trip.route) @@ -256,7 +252,5 @@ def make_stock_entry(source_name, target_doc=None): }, target_doc, ) - source_company = frappe.db.get_value("Fuel Requests", source_name, "company") - doc.company = get_transport_company(source_company) + doc.company = frappe.db.get_value("Fuel Requests", source_name, "company") return doc - diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/manifest/manifest.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/manifest/manifest.py index 841f76a..cbcf347 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/manifest/manifest.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/manifest/manifest.py @@ -6,6 +6,7 @@ from frappe.query_builder import DocType from frappe.model.document import Document import datetime +from vsd_fleet_ms.utils.document_links import sync_cargo_registration_links class Manifest(Document): def onload(self): @@ -66,14 +67,13 @@ def validate_capacity(self): # frappe.throw(str(default_capacity)) # Perform validation total_capacity = truck_capacity + total_trailer_capacity - frappe.db.set_value("Manifest", self.name, "consolidated_weight", total_capacity) + self.consolidated_weight = total_capacity if total_capacity > float(default_capacity): frappe.throw( f"The combined capacity of the truck ({truck_capacity}) and trailers ({total_trailer_capacity}) " f"exceeds the default limit of {default_capacity}." ) - self.consolidated_weight = total_capacity def on_submit(self): self.set_truck_dimension() @@ -268,6 +268,7 @@ def add_to_existing_manifest(args_array): for row in cargo_registration.cargo_details: if row.name == args_dict.get('cargo_id'): row.manifest_number = args_dict.get('manifest') + sync_cargo_registration_links(cargo_registration) cargo_registration.save() break @@ -307,6 +308,7 @@ def create_new_manifest(args_array): for row in cargo_registration.cargo_details: if row.name == args_dict.get('cargo_id'): row.manifest_number = manifest.name + sync_cargo_registration_links(cargo_registration) cargo_registration.save() break diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/manifest/manifest_dashboard.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/manifest/manifest_dashboard.py new file mode 100644 index 0000000..0458370 --- /dev/null +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/manifest/manifest_dashboard.py @@ -0,0 +1,13 @@ +from frappe import _ + + +def get_data(): + return { + "fieldname": "manifest", + "transactions": [ + { + "label": _("Reference"), + "items": ["Cargo Registration"], + }, + ], + } diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.js b/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.js index 9824428..f35a835 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.js +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.js @@ -3,7 +3,6 @@ frappe.ui.form.on('Requested Payment', { onload: function(frm){ - setFleetCompanyDefault(frm); //Load the approve and reject buttons var html = ' '; html += '' @@ -191,16 +190,6 @@ frappe.ui.form.on('Requested Payment', { } }); -const setFleetCompanyDefault = (frm) => { - if (!frm.is_new()) return; - frappe.db.get_single_value("Transport Settings", "company").then((company) => { - const fallback = (frappe.boot && frappe.boot.sysdefaults && frappe.boot.sysdefaults.company) || ""; - const target_company = company || fallback; - if (target_company) { - frm.set_value("company", target_company); - } - }); -}; frappe.ui.form.on('Requested Fund Details', { form_render (frm, cdt, cdn) { @@ -647,4 +636,3 @@ cur_frm.cscript.populate_child = function(reference_doctype, reference_docname){ } }); }; - diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.py index a4eea0b..b9b7230 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/requested_payment/requested_payment.py @@ -17,8 +17,6 @@ ) from erpnext.controllers.accounts_controller import set_balance_in_account_currency from erpnext.accounts.doctype.budget.budget import validate_expense_against_budget -from vsd_fleet_ms.utils.fleet_company_fields import get_transport_company - class RequestedPayment(Document): def onload(self): @@ -717,8 +715,7 @@ def make_payment(source_name, target_doc=None, ignore_permissions=False): pe.mode_of_payment = "Cash" pe.party_type = "Employee" pe.allocate_payment_amount = 1 - source_company = frappe.db.get_value("Requested Payment", source_name, "company") - pe.company = get_transport_company(source_company) + pe.company = frappe.db.get_value("Requested Payment", source_name, "company") return pe diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/round_trip/round_trip.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/round_trip/round_trip.py index 5996e1f..3060910 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/round_trip/round_trip.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/round_trip/round_trip.py @@ -5,9 +5,23 @@ from frappe.model.document import Document class RoundTrip(Document): - def after_insert(self): - for trips in self.trip_details: - trip = frappe.get_doc("Trips",trips.trip_id) + def before_save(self): + self.sync_trip_links() + + def sync_trip_links(self): + current_trip_ids = {row.trip_id for row in (self.trip_details or []) if row.trip_id} + existing_trip_ids = set( + frappe.get_all("Trips", filters={"round_trip": self.name}, pluck="name") + ) + + for trip_id in existing_trip_ids - current_trip_ids: + trip = frappe.get_doc("Trips", trip_id) + if trip.round_trip: + trip.round_trip = "" + trip.save() + + for trip_id in current_trip_ids: + trip = frappe.get_doc("Trips", trip_id) if trip.round_trip != self.name: trip.round_trip = self.name trip.save() diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/transport_settings/transport_settings.json b/vsd_fleet_ms/vsd_fleet_ms/doctype/transport_settings/transport_settings.json index 28f15b9..98b75b5 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/transport_settings/transport_settings.json +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/transport_settings/transport_settings.json @@ -7,7 +7,6 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "company", "vehicle_fuel_parent_warehouse", "sales_item_group", "fuel_item_group", @@ -28,12 +27,6 @@ "accounting_dimension" ], "fields": [ - { - "fieldname": "company", - "fieldtype": "Link", - "label": "Company", - "options": "Company" - }, { "fieldname": "vehicle_fuel_parent_warehouse", "fieldtype": "Link", diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/transportation_order/transportation_order.js b/vsd_fleet_ms/vsd_fleet_ms/doctype/transportation_order/transportation_order.js index 01757c6..77d461a 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/transportation_order/transportation_order.js +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/transportation_order/transportation_order.js @@ -3,7 +3,6 @@ frappe.ui.form.on('Transportation Order', { onload: function (frm) { - setFleetCompanyDefault(frm); frm.get_field("assign_transport").grid.cannot_add_rows = true; $("*[data-fieldname='assign_transport']").find(".grid-remove-rows").hide(); $("*[data-fieldname='assign_transport']").find(".grid-remove-all-rows").hide(); @@ -228,17 +227,6 @@ frappe.ui.form.on('Transportation Order', { }, }); -const setFleetCompanyDefault = (frm) => { - if (!frm.is_new()) return; - frappe.db.get_single_value("Transport Settings", "company").then((company) => { - const fallback = (frappe.boot && frappe.boot.sysdefaults && frappe.boot.sysdefaults.company) || ""; - const target_company = company || fallback; - if (target_company) { - frm.set_value("company", target_company); - } - }); -}; - frappe.ui.form.on("Transport Assignments", { form_render: function (frm, cdt, cdn) { 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 8342dc8..d58c16e 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.js +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.js @@ -3,7 +3,6 @@ frappe.ui.form.on("Trips", { onload: function (frm) { - setFleetCompanyDefault(frm); }, refresh: function (frm) { approved_total(); @@ -13,7 +12,7 @@ frappe.ui.form.on("Trips", { set_service_ms_costing_visibility(frm); if (frm.doc.trip_completed == 0 && frm.doc.trip_status != "Breakdown") { frm.add_custom_button( - __("Complete Trip"), + __("Release Truck {0}", [frm.doc.truck_number]), function () { frm.set_value("trip_completed", 1); frm.set_value("trip_completed_date", frappe.datetime.nowdate()); @@ -256,17 +255,6 @@ frappe.ui.form.on("Trips", { }, }); -const setFleetCompanyDefault = (frm) => { - if (!frm.is_new()) return; - frappe.db.get_single_value("Transport Settings", "company").then((company) => { - const fallback = (frappe.boot && frappe.boot.sysdefaults && frappe.boot.sysdefaults.company) || ""; - const target_company = company || fallback; - if (target_company) { - frm.set_value("company", target_company); - } - }); -}; - function set_service_ms_costing_visibility(frm) { frappe.db .get_single_value("Transport Settings", "enable_service_ms") @@ -281,10 +269,18 @@ function set_service_ms_costing_visibility(frm) { ]; fields.forEach((fieldname) => { - frm.set_df_property(fieldname, "hidden", is_enabled ? 0 : 1); + if (frm.fields_dict && frm.fields_dict[fieldname]) { + frm.set_df_property(fieldname, "hidden", is_enabled ? 0 : 1); + } }); - if (is_enabled && !frm.doc.service_job_card && frm.doc.docstatus == 0) { + if ( + is_enabled && + frm.fields_dict && + frm.fields_dict.service_job_card && + !frm.doc.service_job_card && + frm.doc.docstatus == 0 + ) { frappe.show_alert({ message: __("Service MS is enabled. Select Service Job Card in Costing tab."), indicator: "blue", 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 fbdea4f..1475029 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.json +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.json @@ -84,10 +84,6 @@ "connections_tab", "costing_tab", "costing_section", - "service_job_card", - "column_break_qtmsn", - "service_charges", - "spares_cost", "vehicle_breakdown_tab", "breakdown_date", "location", @@ -535,30 +531,6 @@ "fieldtype": "Section Break", "label": "Costing Details" }, - { - "fieldname": "service_job_card", - "fieldtype": "Link", - "label": "Service Job Card", - "options": "Service Job Card" - }, - { - "fieldname": "column_break_qtmsn", - "fieldtype": "Column Break" - }, - { - "fetch_from": "service_job_card.service_charges", - "fieldname": "service_charges", - "fieldtype": "Currency", - "label": "Service Charges", - "read_only": 1 - }, - { - "fetch_from": "service_job_card.spares_cost", - "fieldname": "spares_cost", - "fieldtype": "Currency", - "label": "Spares Cost", - "read_only": 1 - }, { "fieldname": "section_break_2erx7", "fieldtype": "Section Break" 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 8f759ce..12924dc 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips.py @@ -12,7 +12,7 @@ from frappe.utils import nowdate, now, cint from frappe import _, msgprint from vsd_fleet_ms.utils.dimension import set_dimension -from vsd_fleet_ms.utils.fleet_company_fields import get_transport_company +from vsd_fleet_ms.utils.document_links import sync_cargo_registration_links from erpnext.setup.utils import get_exchange_rate from vsd_fleet_ms.vsd_fleet_ms.doctype.requested_payment.requested_payment import request_funds @@ -28,8 +28,6 @@ def on_submit(self): frappe.throw(_("Stock Out Entry is not set")) def onload(self): - if not self.company: - self.company = get_transport_company(self.company) if not self.fuel_stock_out: self.fuel_stock_out = self.total_fuel @@ -148,7 +146,7 @@ def validate_fuel_requests(self): else: fuel_request = frappe.new_doc("Fuel Requests") fuel_request.update({ - "company": get_transport_company(self.company), + "company": self.company, "truck_plate_number": self.get("vehicle_plate_number"), "customer": self.get("customer"), "truck": self.get("vehicle_plate_number"), @@ -339,6 +337,7 @@ def create_vehicle_trip_from_manifest(args_array): for row in cargo_registration.cargo_details: if row.manifest_number == manifest.name: row.created_trip = vehicle_trip.name + sync_cargo_registration_links(cargo_registration) cargo_registration.save() break diff --git a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips_dashboard.py b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips_dashboard.py index cc59cd1..dab51ae 100644 --- a/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips_dashboard.py +++ b/vsd_fleet_ms/vsd_fleet_ms/doctype/trips/trips_dashboard.py @@ -2,7 +2,7 @@ def get_data(): return { - 'fieldname': 'purchase_invoice', + 'fieldname': 'trip', 'non_standard_fieldnames': { 'Requested Payment': 'reference_docname', 'Fuel Requests': 'reference_docname', @@ -14,7 +14,7 @@ def get_data(): 'transactions': [ { 'label': _('Reference'), - 'items': ['Requested Payment', 'Fuel Requests'] + 'items': ['Cargo Registration', 'Requested Payment', 'Fuel Requests'] }, ] - } \ No newline at end of file + }