Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 2 additions & 45 deletions vsd_fleet_ms/hooks.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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"
}
Expand Down
13 changes: 13 additions & 0 deletions vsd_fleet_ms/tyre_management/doctype/tyre_master/tyre_master.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 = ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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 = ""
13 changes: 13 additions & 0 deletions vsd_fleet_ms/utils/document_links.py
Original file line number Diff line number Diff line change
@@ -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 ""
53 changes: 53 additions & 0 deletions vsd_fleet_ms/utils/trips_service_job_card_fields.py
Original file line number Diff line number Diff line change
@@ -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,
)
9 changes: 4 additions & 5 deletions vsd_fleet_ms/vsd_fleet_ms/doctype/bulk_cargo/bulk_cargo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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"""
Expand Down Expand Up @@ -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}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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());
}
Expand Down Expand Up @@ -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"]');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
"transport_type",
"naming_series",
"company",
"manifest",
"trip",
"section_break_fuqjo",
"cargo_details",
"section_break_er7n8",
Expand Down Expand Up @@ -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"
Expand Down Expand Up @@ -171,4 +189,4 @@
"track_changes": 1,
"track_seen": 1,
"track_views": 1
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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":
Expand Down
19 changes: 3 additions & 16 deletions vsd_fleet_ms/vsd_fleet_ms/doctype/fuel_requests/fuel_requests.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

frappe.ui.form.on('Fuel Requests', {
onload: function (frm) {
setFleetCompanyDefault(frm);
//Load the approve and reject buttons
var html = '<button style="background-color: green; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.approve_request(\'' + frm + '\');">Approve</button> ';
html += '<button style="background-color: red; color: #FFF;" class="btn btn-default btn-xs" onclick="cur_frm.cscript.reject_request(\'' + frm + '\');">Reject</button>';
Expand All @@ -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);

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -183,4 +171,3 @@ cur_frm.cscript.reject_request = function (frm) {
show_alert("Error: Please select requests to process.");
}
};

Loading
Loading