137 lines
3.6 KiB
Python
137 lines
3.6 KiB
Python
|
# 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 time_diff_in_hours
|
||
|
|
||
|
|
||
|
def get_columns():
|
||
|
return [
|
||
|
{
|
||
|
"label": _("Employee ID"),
|
||
|
"fieldtype": "Link",
|
||
|
"fieldname": "employee",
|
||
|
"options": "Employee",
|
||
|
"width": 300
|
||
|
},
|
||
|
{
|
||
|
"label": _("Employee Name"),
|
||
|
"fieldtype": "data",
|
||
|
"fieldname": "employee_name",
|
||
|
"hidden": 1,
|
||
|
"width": 200
|
||
|
},
|
||
|
{
|
||
|
"label": _("Timesheet"),
|
||
|
"fieldtype": "Link",
|
||
|
"fieldname": "timesheet",
|
||
|
"options": "Timesheet",
|
||
|
"width": 150
|
||
|
},
|
||
|
{
|
||
|
"label": _("Total Billable Hours"),
|
||
|
"fieldtype": "Int",
|
||
|
"fieldname": "total_billable_hours",
|
||
|
"width": 50
|
||
|
},
|
||
|
{
|
||
|
"label": _("Total Hours"),
|
||
|
"fieldtype": "Int",
|
||
|
"fieldname": "total_hours",
|
||
|
"width": 50
|
||
|
},
|
||
|
{
|
||
|
"label": _("Amount"),
|
||
|
"fieldtype": "Int",
|
||
|
"fieldname": "amount",
|
||
|
"width": 100
|
||
|
}
|
||
|
]
|
||
|
|
||
|
def get_data(filters):
|
||
|
data = []
|
||
|
|
||
|
if "employee" in filters:
|
||
|
record= frappe.db.sql('''SELECT
|
||
|
employee, employee_name, name, total_billable_hours, total_hours, total_billable_amount
|
||
|
FROM
|
||
|
`tabTimesheet`
|
||
|
WHERE
|
||
|
employee = %s and (start_date <= %s and end_date >= %s)''',(filters.employee, filters.to_date, filters.from_date),
|
||
|
as_dict=1
|
||
|
)
|
||
|
|
||
|
elif "project" in filters:
|
||
|
record= frappe.db.sql('''SELECT
|
||
|
employee, employee_name, name, total_billable_hours, total_hours, total_billable_amount
|
||
|
FROM
|
||
|
`tabTimesheet`
|
||
|
WHERE
|
||
|
start_date <= %s and end_date >= %s''',(filters.to_date, filters.from_date),
|
||
|
as_dict=1
|
||
|
)
|
||
|
else:
|
||
|
record = {}
|
||
|
|
||
|
|
||
|
for entries in record:
|
||
|
|
||
|
timesheet_details_filter = {"parent": entries.name}
|
||
|
|
||
|
if "project" in filters:
|
||
|
timesheet_details_filter["project"] = filters.project
|
||
|
|
||
|
timesheet_details = frappe.get_all(
|
||
|
"Timesheet Detail",
|
||
|
filters = timesheet_details_filter,
|
||
|
fields=["*"]
|
||
|
)
|
||
|
|
||
|
total_hours = 0
|
||
|
total_billable_hours = 0
|
||
|
total_amount = 0
|
||
|
check_entries = False
|
||
|
|
||
|
for time in timesheet_details:
|
||
|
|
||
|
check_entries = True
|
||
|
|
||
|
time_start = time.from_time
|
||
|
time_end = frappe.utils.add_to_date(time.from_time, hours=time.hours)
|
||
|
|
||
|
from_date = frappe.utils.get_datetime(filters.from_date)
|
||
|
to_date = frappe.utils.get_datetime(filters.to_date)
|
||
|
|
||
|
if time_start <= from_date and time_end <= to_date:
|
||
|
total_hours, total_billable_hours, total_amount = get_billable_and_total_hours(time, time_end, from_date, total_hours, total_billable_hours, total_amount)
|
||
|
elif time_start >= from_date and time_end >= to_date:
|
||
|
total_hours, total_billable_hours, total_amount = get_billable_and_total_hours(time, to_date, time_start, total_hours, total_billable_hours, total_amount)
|
||
|
elif time_start >= from_date and time_end <= to_date:
|
||
|
total_hours, total_billable_hours, total_amount = get_billable_and_total_hours(time, time_end, time_start, total_hours, total_billable_hours, total_amount)
|
||
|
|
||
|
row = {
|
||
|
"employee": entries.employee,
|
||
|
"employee_name": entries.employee_name,
|
||
|
"timesheet": entries.name,
|
||
|
"total_billable_hours": total_billable_hours,
|
||
|
"total_hours": total_hours,
|
||
|
"amount": total_amount
|
||
|
}
|
||
|
|
||
|
if check_entries:
|
||
|
data.append(row)
|
||
|
check_entries = False
|
||
|
|
||
|
return data
|
||
|
|
||
|
|
||
|
def get_billable_and_total_hours(time, end, start, total_hours, total_billable_hours, total_amount):
|
||
|
total_hours += abs(time_diff_in_hours(end, start))
|
||
|
if time.billable:
|
||
|
total_billable_hours += abs(time_diff_in_hours(end, start))
|
||
|
total_amount += total_billable_hours * time.billing_rate
|
||
|
|
||
|
return total_hours, total_billable_hours, total_amount
|