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
+ }