diff --git a/erpnext/docs/assets/img/fleet-management/__init__.py b/erpnext/docs/assets/img/fleet-management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/docs/assets/img/fleet-management/expense-claim-3.1.png b/erpnext/docs/assets/img/fleet-management/expense-claim-3.1.png new file mode 100644 index 00000000000..6aa4d69d452 Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/expense-claim-3.1.png differ diff --git a/erpnext/docs/assets/img/fleet-management/expense-claim-3.2.png b/erpnext/docs/assets/img/fleet-management/expense-claim-3.2.png new file mode 100644 index 00000000000..93769881d2b Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/expense-claim-3.2.png differ diff --git a/erpnext/docs/assets/img/fleet-management/vehicle-1.1.png b/erpnext/docs/assets/img/fleet-management/vehicle-1.1.png new file mode 100644 index 00000000000..b40912d1d25 Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/vehicle-1.1.png differ diff --git a/erpnext/docs/assets/img/fleet-management/vehicle-1.2.png b/erpnext/docs/assets/img/fleet-management/vehicle-1.2.png new file mode 100644 index 00000000000..8a8695efcd3 Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/vehicle-1.2.png differ diff --git a/erpnext/docs/assets/img/fleet-management/vehicle-1.3.png b/erpnext/docs/assets/img/fleet-management/vehicle-1.3.png new file mode 100644 index 00000000000..8110454b42a Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/vehicle-1.3.png differ diff --git a/erpnext/docs/assets/img/fleet-management/vehicle-expenses.png b/erpnext/docs/assets/img/fleet-management/vehicle-expenses.png new file mode 100644 index 00000000000..166717c36d4 Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/vehicle-expenses.png differ diff --git a/erpnext/docs/assets/img/fleet-management/vehicle-log-2.1.png b/erpnext/docs/assets/img/fleet-management/vehicle-log-2.1.png new file mode 100644 index 00000000000..f859b422390 Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/vehicle-log-2.1.png differ diff --git a/erpnext/docs/assets/img/fleet-management/vehicle-log-2.2.png b/erpnext/docs/assets/img/fleet-management/vehicle-log-2.2.png new file mode 100644 index 00000000000..12d31874936 Binary files /dev/null and b/erpnext/docs/assets/img/fleet-management/vehicle-log-2.2.png differ diff --git a/erpnext/docs/user/manual/en/fleet_management/__init__.py b/erpnext/docs/user/manual/en/fleet_management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/docs/user/manual/en/fleet_management/index.md b/erpnext/docs/user/manual/en/fleet_management/index.md new file mode 100644 index 00000000000..8ae3b7cc5ae --- /dev/null +++ b/erpnext/docs/user/manual/en/fleet_management/index.md @@ -0,0 +1,64 @@ +Fleet Management module helps your Organization manage their fleet of vehicles and track their expenses. + +To use Fleet Management in ERPNext, + + 1. Set Up a Vehicle. + 2. Enter Vehicle Logs regularly. + 3. Make Expense Claims for Vehicle Expenses. + 4. View Reports for Vehicle Expenses. + +### Vehicle Set Up + +The Vehicle Set Up allows you to define the different types of Vehicles in your Organization.It acts as the Vehicle Master for Fleet Management. + +To create a new Vehicle go to: + +ERPNext > Vehicle + +* Enter License Plate,Make,Model,Odometer Value,Fuel Type and Fuel UOM for a quick entry. + + Vehicle + +* Enter details like Insurance,Chassis,Vehicle Value,Location and Employee. + + Vehicle + +* Enter Vehicle attributes like color,wheels,doors and last carbon check + + Vehicle + +### Vehicle Log + +Vehicle Log is used to enter Odometer readings,Fuel Expenses and Service Expense details. + +To create a new Vehicle Log go to: + +ERPNext > Vehicle Log + +* Enter License Plate,Employee,Date,Odometer reading for a quick entry. + + Vehicle Log + +* Enter Refuelling details,Service details if applicable. + + Vehicle Log + +### Make Expense Claim + +* Click on Make Expense Claim button .This button appears only in case of Submitted Vehicle Logs. + + Vehicle Log + +When you click on 'Make Expense Claim', + + 1. The date,employee,expense total are copied over to the created Expense Claim. + 2. The sum of Fuel Expenses and Service Expenses is copied over to Expense Claim Amount. + 3. Employee can submit the Expense Claim for further processing. + + Vehicle Log + +### Vehicle Expenses Report + +* To track and monitor Vehicle Expenses you can use the Vehicle Expenses report.This report gives a one stop view of all your vehicle expenses month wise. + + Vehicle Log diff --git a/erpnext/docs/user/manual/en/fleet_management/index.txt b/erpnext/docs/user/manual/en/fleet_management/index.txt new file mode 100644 index 00000000000..2da8e7bcf6e --- /dev/null +++ b/erpnext/docs/user/manual/en/fleet_management/index.txt @@ -0,0 +1,3 @@ +Vehicle +Vehicle Log +Vehicle Expenses \ No newline at end of file diff --git a/erpnext/fleet_management/__init__.py b/erpnext/fleet_management/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/fleet_management/doctype/__init__.py b/erpnext/fleet_management/doctype/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/fleet_management/doctype/vehicle/__init__.py b/erpnext/fleet_management/doctype/vehicle/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/fleet_management/doctype/vehicle/test_vehicle.py b/erpnext/fleet_management/doctype/vehicle/test_vehicle.py new file mode 100644 index 00000000000..643197780b9 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle/test_vehicle.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest +from frappe.utils import nowdate,flt, cstr,random_string +# test_records = frappe.get_test_records('Vehicle') + +class TestVehicle(unittest.TestCase): + def test_make_vehicle(self): + vehicle = frappe.get_doc({ + "doctype": "Vehicle", + "license_plate": random_string(10).upper(), + "make": "Maruti", + "model": "PCM", + "last_odometer":5000, + "acquisition_date":frappe.utils.nowdate(), + "location": "Mumbai", + "chassis_no": "1234ABCD", + "vehicle_value":frappe.utils.flt(500000) + }) + vehicle.insert() diff --git a/erpnext/fleet_management/doctype/vehicle/vehicle.js b/erpnext/fleet_management/doctype/vehicle/vehicle.js new file mode 100644 index 00000000000..f12c4346852 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle/vehicle.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Vehicle', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/fleet_management/doctype/vehicle/vehicle.json b/erpnext/fleet_management/doctype/vehicle/vehicle.json new file mode 100644 index 00000000000..5dec1e3bcf9 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle/vehicle.json @@ -0,0 +1,764 @@ +{ + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "field:license_plate", + "beta": 0, + "creation": "2016-09-03 03:33:27.680331", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 1, + "fields": [ + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "license_plate", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "License Plate", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 1 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "make", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Make", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "model", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 1, + "label": "Model", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "vehicle_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "last_odometer", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 1, + "label": "Odometer Value (Last)", + "length": 0, + "no_copy": 1, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 1, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "acquisition_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Acquisition Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "location", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Location", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_8", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "chassis_no", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Chassis No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "vehicle_value", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Vehicle Value", + "length": 0, + "no_copy": 0, + "options": "", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 1, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "insurance_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Insurance Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "insurance_company", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Insurance Company", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "policy_no", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 0, + "label": "Policy No", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_15", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "start_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Start Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "end_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "End Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "additional_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Additional Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "fuel_type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Fuel Type", + "length": 0, + "no_copy": 0, + "options": "Petrol\nDiesel\nNatural Gas\nElectric", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "Litre", + "fieldname": "uom", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Fuel UOM", + "length": 0, + "no_copy": 0, + "options": "UOM", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "carbon_check_date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Last Carbon Check", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_21", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "color", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Color", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "wheels", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Wheels", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "doors", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Doors", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Vehicle", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2016-09-20 11:39:45.446271", + "modified_by": "Administrator", + "module": "Fleet Management", + "name": "Vehicle", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Fleet Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 0, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "search_fields": "license_plate,location,model", + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "", + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/fleet_management/doctype/vehicle/vehicle.py b/erpnext/fleet_management/doctype/vehicle/vehicle.py new file mode 100644 index 00000000000..ef5bfe53cd1 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle/vehicle.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import getdate +from frappe.model.document import Document + +class Vehicle(Document): + def validate(self): + if getdate(self.start_date) > getdate(self.end_date): + frappe.throw(_("Insurance Start date should be less than Insurance End date")) \ No newline at end of file diff --git a/erpnext/fleet_management/doctype/vehicle/vehicle_dashboard.py b/erpnext/fleet_management/doctype/vehicle/vehicle_dashboard.py new file mode 100644 index 00000000000..2c1c4c31aa2 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle/vehicle_dashboard.py @@ -0,0 +1,13 @@ +from frappe import _ + +data = { + 'heatmap': True, + 'heatmap_message': _('This is based on logs against this Vehicle. See timeline below for details'), + 'fieldname': 'license_plate', + 'transactions': [ + { + 'label': _('Logs'), + 'items': ['Vehicle Log'] + } + ] +} \ No newline at end of file diff --git a/erpnext/fleet_management/doctype/vehicle_log/__init__.py b/erpnext/fleet_management/doctype/vehicle_log/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/fleet_management/doctype/vehicle_log/test_vehicle_log.py b/erpnext/fleet_management/doctype/vehicle_log/test_vehicle_log.py new file mode 100644 index 00000000000..71c1d91a8d8 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle_log/test_vehicle_log.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest +from frappe.utils import nowdate,flt, cstr,random_string +# test_records = frappe.get_test_records('Vehicle Log') +class TestVehicleLog(unittest.TestCase): + def test_make_vehicle_log(self): + license_plate=random_string(10).upper() + employee_id=frappe.db.sql("""select name from `tabEmployee` order by modified desc limit 1""")[0][0] + vehicle = frappe.get_doc({ + "doctype": "Vehicle", + "license_plate": cstr(license_plate), + "make": "Maruti", + "model": "PCM", + "last_odometer":5000, + "acquisition_date":frappe.utils.nowdate(), + "location": "Mumbai", + "chassis_no": "1234ABCD", + "vehicle_value":frappe.utils.flt(500000) + }) + try: + vehicle.insert() + except frappe.DuplicateEntryError: + pass + vehicle_log = frappe.get_doc({ + "doctype": "Vehicle Log", + "license_plate": cstr(license_plate), + "employee":employee_id, + "date":frappe.utils.nowdate(), + "odometer":5010, + "fuel_qty":frappe.utils.flt(50), + "price": frappe.utils.flt(500) + }) + vehicle_log.insert() + vehicle_log.submit() \ No newline at end of file diff --git a/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.js b/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.js new file mode 100644 index 00000000000..1ccf3479f27 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.js @@ -0,0 +1,33 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on("Vehicle Log", { + refresh: function(frm,cdt,cdn) { + vehicle_log=frappe.model.get_doc(cdt,cdn); + if (vehicle_log.license_plate) { + frappe.call({ + method: "erpnext.fleet_management.doctype.vehicle_log.vehicle_log.get_make_model", + args: { + license_plate: vehicle_log.license_plate + }, + callback: function(r) { + frappe.model.set_value(cdt, cdn, ("model"), r.message[0]); + frappe.model.set_value(cdt, cdn, ("make"), r.message[1]); + } + }) + } + }, + expense_claim: function(frm){ + frappe.call({ + method: "erpnext.fleet_management.doctype.vehicle_log.vehicle_log.make_expense_claim", + args:{ + docname: frm.doc.name + }, + callback: function(r){ + var doc = frappe.model.sync(r.message); + frappe.set_route('Form', 'Expense Claim', r.message.name); + } + }) + } +}); + diff --git a/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.json b/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.json new file mode 100644 index 00000000000..93818527af9 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.json @@ -0,0 +1,634 @@ +{ + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "naming_series:", + "beta": 0, + "creation": "2016-09-03 14:14:51.788550", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 1, + "fields": [ + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "vehicle_section", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "options": "icon-user", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "naming_series", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Series", + "length": 0, + "no_copy": 1, + "options": "VLOG.", + "permlevel": 0, + "precision": "", + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "license_plate", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 1, + "in_list_view": 1, + "label": "License Plate", + "length": 0, + "no_copy": 0, + "options": "Vehicle", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "employee", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Employee", + "length": 0, + "no_copy": 0, + "options": "Employee", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_4", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_7", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "model", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Model", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "make", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Make", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "odometer_reading", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Odometer Reading", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "odometer", + "fieldtype": "Int", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Odometer", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "refuelling_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Refuelling Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "fuel_qty", + "fieldtype": "Float", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Fuel Qty", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "price", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Fuel Price", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_15", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "supplier", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Supplier", + "length": 0, + "no_copy": 0, + "options": "Supplier", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "invoice", + "fieldtype": "Data", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Invoice Ref", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 1, + "columns": 0, + "fieldname": "service_details", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Service_Details", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "service_detail", + "fieldtype": "Table", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Service Detail", + "length": 0, + "no_copy": 0, + "options": "Vehicle Service", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_20", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 1, + "bold": 0, + "collapsible": 0, + "columns": 0, + "depends_on": "eval:doc.docstatus==1", + "fieldname": "expense_claim", + "fieldtype": "Button", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Make Expense Claim", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Vehicle Log", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2016-09-17 15:44:02.397851", + "modified_by": "Administrator", + "module": "Fleet Management", + "name": "Vehicle Log", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Fleet Manager", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "", + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.py b/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.py new file mode 100644 index 00000000000..ceea4933f36 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle_log/vehicle_log.py @@ -0,0 +1,57 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import flt, cstr +from frappe.model.mapper import get_mapped_doc +from frappe.model.document import Document + +class VehicleLog(Document): + def validate(self): + last_odometer=frappe.db.get_value("Vehicle", self.license_plate, "last_odometer") + if flt(self.odometer) < flt(last_odometer): + frappe.throw(_("Current Odometer reading entered should be greater than initial Vehicle Odometer {0}").format(last_odometer)) + for service_detail in self.service_detail: + if (service_detail.service_item or service_detail.type or service_detail.frequency or service_detail.expense_amount): + if not (service_detail.service_item and service_detail.type and service_detail.frequency and service_detail.expense_amount): + frappe.throw(_("Service Item,Type,frequency and expense amount are required")) + + def on_submit(self): + frappe.db.sql("update `tabVehicle` set last_odometer=%s where license_plate=%s", + (self.odometer, self.license_plate)) + +@frappe.whitelist() +def get_make_model(license_plate): + vehicle=frappe.get_doc("Vehicle",license_plate) + return (vehicle.make,vehicle.model) + +@frappe.whitelist() +def make_expense_claim(docname): + def check_exp_claim_exists(): + exp_claim = frappe.db.sql("""select name from `tabExpense Claim` where vehicle_log=%s""",vehicle_log.name) + return exp_claim[0][0] if exp_claim else "" + def calc_service_exp(): + total_exp_amt=0 + exp_claim = check_exp_claim_exists() + if exp_claim: + frappe.throw(_("Expense Claim {0} already exists for the Vehicle Log").format(exp_claim)) + for serdetail in vehicle_log.service_detail: + total_exp_amt = total_exp_amt + serdetail.expense_amount + return total_exp_amt + + vehicle_log = frappe.get_doc("Vehicle Log", docname) + exp_claim = frappe.new_doc("Expense Claim") + exp_claim.employee=vehicle_log.employee + exp_claim.vehicle_log=vehicle_log.name + exp_claim.remark=_("Expense Claim for Vehicle Log {0}").format(vehicle_log.name) + fuel_price=vehicle_log.price + total_claim_amt=calc_service_exp() + fuel_price + exp_claim.append("expenses",{ + "expense_date":vehicle_log.date, + "description":_("Vehicle Expenses"), + "claim_amount":total_claim_amt + }) + return exp_claim.as_dict() diff --git a/erpnext/fleet_management/doctype/vehicle_service/__init__.py b/erpnext/fleet_management/doctype/vehicle_service/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/fleet_management/doctype/vehicle_service/vehicle_service.json b/erpnext/fleet_management/doctype/vehicle_service/vehicle_service.json new file mode 100644 index 00000000000..6b80efccd35 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle_service/vehicle_service.json @@ -0,0 +1,144 @@ +{ + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "beta": 0, + "creation": "2016-09-03 19:20:14.561962", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "Document", + "editable_grid": 1, + "fields": [ + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "service_item", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Service Item", + "length": 0, + "no_copy": 0, + "options": "\nBrake Oil\nBrake Pad\nClutch Plate\nEngine Oil\nOil Change\nWheels", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "type", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Type", + "length": 0, + "no_copy": 0, + "options": "\nInspection\nService\nChange", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "frequency", + "fieldtype": "Select", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Frequency", + "length": 0, + "no_copy": 0, + "options": "\nMileage\nMonthly\nQuarterly\nHalf Yearly\nYearly", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "expense_amount", + "fieldtype": "Currency", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "label": "Expense", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 0, + "issingle": 0, + "istable": 1, + "max_attachments": 0, + "modified": "2016-09-20 07:29:50.852748", + "modified_by": "Administrator", + "module": "Fleet Management", + "name": "Vehicle Service", + "name_case": "", + "owner": "Administrator", + "permissions": [], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "sort_field": "modified", + "sort_order": "DESC", + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/fleet_management/doctype/vehicle_service/vehicle_service.py b/erpnext/fleet_management/doctype/vehicle_service/vehicle_service.py new file mode 100644 index 00000000000..18ed7821382 --- /dev/null +++ b/erpnext/fleet_management/doctype/vehicle_service/vehicle_service.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class VehicleService(Document): + pass diff --git a/erpnext/fleet_management/report/__init__.py b/erpnext/fleet_management/report/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/fleet_management/report/vehicle_expenses/__init__.py b/erpnext/fleet_management/report/vehicle_expenses/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.js b/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.js new file mode 100644 index 00000000000..8a05c811ac7 --- /dev/null +++ b/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.js @@ -0,0 +1,41 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt +frappe.require("assets/erpnext/js/financial_statements.js", function() { + frappe.query_reports["Vehicle Expenses"] = { + "filters": [ + { + "fieldname": "fiscal_year", + "label": __("Fiscal Year"), + "fieldtype": "Link", + "options": "Fiscal Year", + "default": frappe.defaults.get_user_default("fiscal_year"), + "reqd": 1, + "on_change": function(query_report) { + var fiscal_year = query_report.get_values().fiscal_year; + if (!fiscal_year) { + return; + } + frappe.model.with_doc("Fiscal Year", fiscal_year, function(r) { + var fy = frappe.model.get_doc("Fiscal Year", fiscal_year); + frappe.query_report_filters_by_name.from_date.set_input(fy.year_start_date); + frappe.query_report_filters_by_name.to_date.set_input(fy.year_end_date); + query_report.trigger_refresh(); + }); + } + }, + { + "fieldname": "from_date", + "label": __("From Date"), + "fieldtype": "Date", + "default": frappe.defaults.get_user_default("year_start_date"), + }, + { + "fieldname": "to_date", + "label": __("To Date"), + "fieldtype": "Date", + "default": frappe.defaults.get_user_default("year_end_date"), + } + ] + } +}); + diff --git a/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.json b/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.json new file mode 100644 index 00000000000..380c873df3e --- /dev/null +++ b/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.json @@ -0,0 +1,18 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2016-09-09 03:33:40.605734", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2016-09-18 08:54:12.080753", + "modified_by": "Administrator", + "module": "Fleet Management", + "name": "Vehicle Expenses", + "owner": "Administrator", + "ref_doctype": "Vehicle", + "report_name": "Vehicle Expenses", + "report_type": "Script Report" +} \ No newline at end of file diff --git a/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.py b/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.py new file mode 100644 index 00000000000..717a94f271c --- /dev/null +++ b/erpnext/fleet_management/report/vehicle_expenses/vehicle_expenses.py @@ -0,0 +1,81 @@ +# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe import _ +from frappe.utils import flt,cstr +from erpnext.accounts.report.financial_statements import get_period_list + +def execute(filters=None): + period_list = get_period_list(2016, 2016,"Monthly") + for period in period_list: + pass + columns, data = [], [] + columns=get_columns() + data=get_log_data(filters) + chart=get_chart_data(data,period_list) + return columns,data,None,chart + +def get_columns(): + columns = [_("License") + ":Link/Vehicle:100", _("Make") + ":data:50", + _("Model") + ":data:50", _("Location") + ":data:100", + _("Log") + ":Link/Vehicle Log:100", _("Odometer") + ":Int:80", + _("Date") + ":Date:100", _("Fuel Qty") + ":Float:80", + _("Fuel Price") + ":Float:100",_("Service Expense") + ":Float:100" + ] + return columns + +def get_log_data(filters): + conditions="" + if filters.from_date: + conditions += " and date >= %(from_date)s" + if filters.to_date: + conditions += " and date <= %(to_date)s" + data = frappe.db.sql("""select vhcl.license_plate as "License",vhcl.make as "Make",vhcl.model as "Model", + vhcl.location as "Location",log.name as "Log",log.odometer as "Odometer",log.date as "Date", + log.fuel_qty as "Fuel Qty",log.price as "Fuel Price" + from `tabVehicle` vhcl,`tabVehicle Log` log + where vhcl.license_plate = log.license_plate and log.docstatus = 1 %s + order by date""" % (conditions,),filters, as_dict=1) + dl=list(data) + for row in dl: + row["Service Expense"]= get_service_expense(row["Log"]) + return dl + +def get_service_expense(logname): + expense_amount = frappe.db.sql("""select sum(expense_amount) + from `tabVehicle Log` log,`tabVehicle Service` ser + where ser.parent=log.name and log.name=%s""",logname) + return flt(expense_amount[0][0]) if expense_amount else 0 + +def get_chart_data(data,period_list): + fuel_exp_data,service_exp_data,fueldata,servicedata = [],[],[],[] + service_exp_data = [] + fueldata = [] + for period in period_list: + total_fuel_exp=0 + total_ser_exp=0 + for row in data: + if row["Date"] <= period.to_date and row["Date"] >= period.from_date: + total_fuel_exp+=flt(row["Fuel Price"]) + total_ser_exp+=flt(row["Service Expense"]) + fueldata.append([period.key,total_fuel_exp]) + servicedata.append([period.key,total_ser_exp]) + + x_intervals = ['x'] + [period.key for period in period_list] + fuel_exp_data= [row[1] for row in fueldata] + service_exp_data= [row[1] for row in servicedata] + columns = [x_intervals] + if fuel_exp_data: + columns.append(["Fuel Expenses"]+ fuel_exp_data) + if service_exp_data: + columns.append(["Service Expenses"]+ service_exp_data) + chart = { + "data": { + 'x': 'x', + 'columns': columns + } + } + chart["chart_type"] = "line" + return chart \ No newline at end of file diff --git a/erpnext/hr/doctype/expense_claim/expense_claim.json b/erpnext/hr/doctype/expense_claim/expense_claim.json index 035f7de23b1..f2a14c533dd 100644 --- a/erpnext/hr/doctype/expense_claim/expense_claim.json +++ b/erpnext/hr/doctype/expense_claim/expense_claim.json @@ -3,16 +3,19 @@ "allow_import": 1, "allow_rename": 0, "autoname": "naming_series:", + "beta": 0, "creation": "2013-01-10 16:34:14", "custom": 0, "docstatus": 0, "doctype": "DocType", "document_type": "Setup", + "editable_grid": 0, "fields": [ { "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "default": "EXP", "fieldname": "naming_series", "fieldtype": "Select", @@ -40,6 +43,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "default": "Draft", "depends_on": "eval:!doc.__islocal", "fieldname": "approval_status", @@ -69,6 +73,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "description": "A user with \"Expense Approver\" role", "fieldname": "exp_approver", "fieldtype": "Link", @@ -98,6 +103,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "column_break0", "fieldtype": "Column Break", "hidden": 0, @@ -123,6 +129,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "total_claimed_amount", "fieldtype": "Currency", "hidden": 0, @@ -151,6 +158,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "total_sanctioned_amount", "fieldtype": "Currency", "hidden": 0, @@ -179,6 +187,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "expense_details", "fieldtype": "Section Break", "hidden": 0, @@ -204,6 +213,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "expenses", "fieldtype": "Table", "hidden": 0, @@ -231,6 +241,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "sb1", "fieldtype": "Section Break", "hidden": 0, @@ -255,6 +266,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "default": "Today", "fieldname": "posting_date", "fieldtype": "Date", @@ -282,6 +294,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "employee", "fieldtype": "Link", "hidden": 0, @@ -309,6 +322,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "employee_name", "fieldtype": "Data", "hidden": 0, @@ -336,6 +350,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "company", "fieldtype": "Link", "hidden": 0, @@ -363,6 +378,34 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, + "fieldname": "vehicle_log", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "label": "Vehicle Log", + "length": 0, + "no_copy": 0, + "options": "Vehicle Log", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 1, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, "fieldname": "cb1", "fieldtype": "Column Break", "hidden": 0, @@ -386,6 +429,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "total_amount_reimbursed", "fieldtype": "Currency", "hidden": 0, @@ -412,6 +456,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "remark", "fieldtype": "Small Text", "hidden": 0, @@ -438,6 +483,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "project", "fieldtype": "Link", "hidden": 0, @@ -464,6 +510,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "task", "fieldtype": "Link", "hidden": 0, @@ -490,6 +537,7 @@ "allow_on_submit": 1, "bold": 0, "collapsible": 0, + "columns": 0, "default": "{employee_name}", "fieldname": "title", "fieldtype": "Data", @@ -516,6 +564,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "email_id", "fieldtype": "Data", "hidden": 1, @@ -542,6 +591,7 @@ "allow_on_submit": 0, "bold": 0, "collapsible": 0, + "columns": 0, "fieldname": "amended_from", "fieldtype": "Link", "hidden": 0, @@ -571,6 +621,7 @@ "hide_toolbar": 0, "icon": "icon-money", "idx": 1, + "image_view": 0, "in_create": 0, "in_dialog": 0, "is_submittable": 1, @@ -578,7 +629,7 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2016-03-03 04:00:28.190351", + "modified": "2016-09-22 05:17:31.428020", "modified_by": "Administrator", "module": "HR", "name": "Expense Claim", @@ -668,11 +719,13 @@ "write": 1 } ], + "quick_entry": 0, "read_only": 0, "read_only_onload": 0, "search_fields": "approval_status,employee,employee_name", "sort_field": "modified", "sort_order": "DESC", "timeline_field": "employee", - "title_field": "title" + "title_field": "title", + "track_seen": 0 } \ No newline at end of file diff --git a/erpnext/modules.txt b/erpnext/modules.txt index 609a3fe5563..4daf0eb5918 100644 --- a/erpnext/modules.txt +++ b/erpnext/modules.txt @@ -1,6 +1,7 @@ Accounts CRM Buying +Fleet Management Projects Selling Setup