213 lines
4.6 KiB
Python
213 lines
4.6 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
|