brotherton-erpnext/erpnext/hr/report/vehicle_expenses/vehicle_expenses.py
2022-03-28 18:52:46 +05:30

178 lines
4.5 KiB
Python

# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
from frappe import _
from frappe.utils import flt
from erpnext.accounts.report.financial_statements import get_period_list
def execute(filters=None):
filters = frappe._dict(filters or {})
columns = get_columns()
data = get_vehicle_log_data(filters)
chart = get_chart_data(data, filters)
return columns, data, None, chart
def get_columns():
return [
{
"fieldname": "vehicle",
"fieldtype": "Link",
"label": _("Vehicle"),
"options": "Vehicle",
"width": 150,
},
{"fieldname": "make", "fieldtype": "Data", "label": _("Make"), "width": 100},
{"fieldname": "model", "fieldtype": "Data", "label": _("Model"), "width": 80},
{"fieldname": "location", "fieldtype": "Data", "label": _("Location"), "width": 100},
{
"fieldname": "log_name",
"fieldtype": "Link",
"label": _("Vehicle Log"),
"options": "Vehicle Log",
"width": 100,
},
{"fieldname": "odometer", "fieldtype": "Int", "label": _("Odometer Value"), "width": 120},
{"fieldname": "date", "fieldtype": "Date", "label": _("Date"), "width": 100},
{"fieldname": "fuel_qty", "fieldtype": "Float", "label": _("Fuel Qty"), "width": 80},
{"fieldname": "fuel_price", "fieldtype": "Float", "label": _("Fuel Price"), "width": 100},
{"fieldname": "fuel_expense", "fieldtype": "Currency", "label": _("Fuel Expense"), "width": 150},
{
"fieldname": "service_expense",
"fieldtype": "Currency",
"label": _("Service Expense"),
"width": 150,
},
{
"fieldname": "employee",
"fieldtype": "Link",
"label": _("Employee"),
"options": "Employee",
"width": 150,
},
]
def get_vehicle_log_data(filters):
start_date, end_date = get_period_dates(filters)
conditions, values = get_conditions(filters)
data = frappe.db.sql(
"""
SELECT
vhcl.license_plate as vehicle, vhcl.make, vhcl.model,
vhcl.location, log.name as log_name, log.odometer,
log.date, log.employee, log.fuel_qty,
log.price as fuel_price,
log.fuel_qty * log.price as fuel_expense
FROM
`tabVehicle` vhcl,`tabVehicle Log` log
WHERE
vhcl.license_plate = log.license_plate
and log.docstatus = 1
and date between %(start_date)s and %(end_date)s
{0}
ORDER BY date""".format(
conditions
),
values,
as_dict=1,
)
for row in data:
row["service_expense"] = get_service_expense(row.log_name)
return data
def get_conditions(filters):
conditions = ""
start_date, end_date = get_period_dates(filters)
values = {"start_date": start_date, "end_date": end_date}
if filters.employee:
conditions += " and log.employee = %(employee)s"
values["employee"] = filters.employee
if filters.vehicle:
conditions += " and vhcl.license_plate = %(vehicle)s"
values["vehicle"] = filters.vehicle
return conditions, values
def get_period_dates(filters):
if filters.filter_based_on == "Fiscal Year" and filters.fiscal_year:
fy = frappe.db.get_value(
"Fiscal Year", filters.fiscal_year, ["year_start_date", "year_end_date"], as_dict=True
)
return fy.year_start_date, fy.year_end_date
else:
return filters.from_date, filters.to_date
def get_service_expense(logname):
expense_amount = frappe.db.sql(
"""
SELECT sum(expense_amount)
FROM
`tabVehicle Log` log, `tabVehicle Service` service
WHERE
service.parent=log.name and log.name=%s
""",
logname,
)
return flt(expense_amount[0][0]) if expense_amount else 0.0
def get_chart_data(data, filters):
period_list = get_period_list(
filters.fiscal_year,
filters.fiscal_year,
filters.from_date,
filters.to_date,
filters.filter_based_on,
"Monthly",
)
fuel_data, service_data = [], []
for period in period_list:
total_fuel_exp = 0
total_service_exp = 0
for row in data:
if row.date <= period.to_date and row.date >= period.from_date:
total_fuel_exp += flt(row.fuel_expense)
total_service_exp += flt(row.service_expense)
fuel_data.append([period.key, total_fuel_exp])
service_data.append([period.key, total_service_exp])
labels = [period.label for period in period_list]
fuel_exp_data = [row[1] for row in fuel_data]
service_exp_data = [row[1] for row in service_data]
datasets = []
if fuel_exp_data:
datasets.append({"name": _("Fuel Expenses"), "values": fuel_exp_data})
if service_exp_data:
datasets.append({"name": _("Service Expenses"), "values": service_exp_data})
chart = {
"data": {"labels": labels, "datasets": datasets},
"type": "line",
"fieldtype": "Currency",
}
return chart