mirror of
https://github.com/frappe/erpnext.git
synced 2026-09-17 18:45:20 +00:00
[Enhancement] Time log wages and multiple active salary structure
This commit is contained in:
@@ -1,16 +0,0 @@
|
||||
{
|
||||
"apply_user_permissions": 1,
|
||||
"creation": "2013-04-03 11:27:52",
|
||||
"docstatus": 0,
|
||||
"doctype": "Report",
|
||||
"idx": 1,
|
||||
"is_standard": "Yes",
|
||||
"modified": "2014-06-03 07:18:17.019543",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Projects",
|
||||
"name": "Daily Time Log Summary",
|
||||
"owner": "Administrator",
|
||||
"ref_doctype": "Time Log",
|
||||
"report_name": "Daily Time Log Summary",
|
||||
"report_type": "Script Report"
|
||||
}
|
||||
@@ -1,98 +0,0 @@
|
||||
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
# License: GNU General Public License v3. See license.txt
|
||||
|
||||
from __future__ import unicode_literals
|
||||
import frappe
|
||||
from frappe import _
|
||||
from frappe.utils import flt
|
||||
|
||||
def execute(filters=None):
|
||||
if not filters:
|
||||
filters = {}
|
||||
elif filters.get("from_date") or filters.get("to_date"):
|
||||
filters["from_time"] = "00:00:00"
|
||||
filters["to_time"] = "24:00:00"
|
||||
|
||||
columns = [_("Time Log") + ":Link/Time Log:120", _("Employee") + "::150", _("From Datetime") + "::140",
|
||||
_("To Datetime") + "::140", _("Hours") + "::70", _("Activity Type") + "::120", _("Task") + ":Link/Task:150",
|
||||
_("Task Subject") + "::180", _("Project") + ":Link/Project:120", _("Status") + "::70"]
|
||||
|
||||
user_map = get_user_map()
|
||||
employee_map = get_employee_map()
|
||||
task_map = get_task_map()
|
||||
|
||||
conditions = build_conditions(filters)
|
||||
time_logs = frappe.db.sql("""select * from `tabTime Log`
|
||||
where docstatus < 2 %s order by owner asc""" % (conditions, ), filters, as_dict=1)
|
||||
|
||||
if time_logs:
|
||||
users = [time_logs[0].owner]
|
||||
|
||||
data = []
|
||||
total_hours = total_employee_hours = count = 0
|
||||
for tl in time_logs:
|
||||
if tl.employee:
|
||||
employee=employee_map[tl.employee]
|
||||
else:
|
||||
employee=user_map[tl.owner]
|
||||
if tl.owner not in users:
|
||||
users.append(tl.owner)
|
||||
data.append(["", "", "", "Total", total_employee_hours, "", "", "", "", ""])
|
||||
total_employee_hours = 0
|
||||
|
||||
data.append([tl.name, employee, tl.from_time, tl.to_time, tl.hours,
|
||||
tl.activity_type, tl.task, task_map.get(tl.task), tl.project, tl.status])
|
||||
|
||||
count += 1
|
||||
total_hours += flt(tl.hours)
|
||||
total_employee_hours += flt(tl.hours)
|
||||
|
||||
if count == len(time_logs):
|
||||
data.append(["", "", "", "Total Hours", total_employee_hours, "", "", "", "", ""])
|
||||
|
||||
if total_hours:
|
||||
data.append(["", "", "", "Grand Total", total_hours, "", "", "", "", ""])
|
||||
|
||||
return columns, data
|
||||
|
||||
def get_user_map():
|
||||
users = frappe.db.sql("""select name,
|
||||
concat(first_name, if(last_name, (' ' + last_name), '')) as fullname
|
||||
from tabUser""", as_dict=1)
|
||||
user_map = {}
|
||||
for p in users:
|
||||
user_map.setdefault(p.name, []).append(p.fullname)
|
||||
|
||||
return user_map
|
||||
|
||||
def get_employee_map():
|
||||
employees = frappe.db.sql("""select name,
|
||||
employee_name as fullname
|
||||
from tabEmployee""", as_dict=1)
|
||||
employee_map = {}
|
||||
for p in employees:
|
||||
employee_map.setdefault(p.name, []).append(p.fullname)
|
||||
|
||||
return employee_map
|
||||
|
||||
def get_task_map():
|
||||
tasks = frappe.db.sql("""select name, subject from tabTask""", as_dict=1)
|
||||
task_map = {}
|
||||
for t in tasks:
|
||||
task_map.setdefault(t.name, []).append(t.subject)
|
||||
|
||||
return task_map
|
||||
|
||||
def build_conditions(filters):
|
||||
conditions = ""
|
||||
if filters.get("from_date"):
|
||||
conditions += " and from_time >= timestamp(%(from_date)s, %(from_time)s)"
|
||||
if filters.get("to_date"):
|
||||
conditions += " and to_time <= timestamp(%(to_date)s, %(to_time)s)"
|
||||
|
||||
from frappe.desk.reportview import build_match_conditions
|
||||
match_conditions = build_match_conditions("Time Log")
|
||||
if match_conditions:
|
||||
conditions += " and %s" % match_conditions
|
||||
|
||||
return conditions
|
||||
@@ -1,7 +1,7 @@
|
||||
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
|
||||
// License: GNU General Public License v3. See license.txt
|
||||
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
|
||||
// For license information, please see license.txt
|
||||
|
||||
frappe.query_reports["Daily Time Log Summary"] = {
|
||||
frappe.query_reports["Daily Time Sheet Summary"] = {
|
||||
"filters": [
|
||||
{
|
||||
"fieldname":"from_date",
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
"add_total_row": 0,
|
||||
"apply_user_permissions": 1,
|
||||
"creation": "2016-06-25 01:52:25.911238",
|
||||
"disabled": 0,
|
||||
"docstatus": 0,
|
||||
"doctype": "Report",
|
||||
"idx": 0,
|
||||
"is_standard": "Yes",
|
||||
"modified": "2016-06-25 01:52:31.214122",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Projects",
|
||||
"name": "Daily Time Sheet Summary",
|
||||
"owner": "Administrator",
|
||||
"ref_doctype": "Time Sheet",
|
||||
"report_name": "Daily Time Sheet Summary",
|
||||
"report_type": "Script Report"
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
# 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 _
|
||||
|
||||
def execute(filters=None):
|
||||
if not filters:
|
||||
filters = {}
|
||||
elif filters.get("from_date") or filters.get("to_date"):
|
||||
filters["from_time"] = "00:00:00"
|
||||
filters["to_time"] = "24:00:00"
|
||||
|
||||
columns = [_("Time Sheet") + ":Link/Time Sheet:120", _("Employee") + "::150", _("From Datetime") + "::140",
|
||||
_("To Datetime") + "::140", _("Hours") + "::70", _("Activity Type") + "::120", _("Task") + ":Link/Task:150",
|
||||
_("Project") + ":Link/Project:120", _("Status") + "::70"]
|
||||
|
||||
conditions = "ts.docstatus = 1"
|
||||
if filters.get("from_date"):
|
||||
conditions += " and tsd.from_time >= timestamp(%(from_date)s, %(from_time)s)"
|
||||
if filters.get("to_date"):
|
||||
conditions += " and tsd.to_time <= timestamp(%(to_date)s, %(to_time)s)"
|
||||
|
||||
data = get_data(conditions, filters)
|
||||
|
||||
return columns, data
|
||||
|
||||
def get_data(conditions, filters):
|
||||
time_sheet = frappe.db.sql(""" select ts.name, ts.employee, tsd.from_time, tsd.to_time, tsd.hours,
|
||||
tsd.activity_type, tsd.task, tsd.project, ts.status from `tabTime Sheet Detail` tsd,
|
||||
`tabTime Sheet` ts where ts.name = tsd.parent and %s order by ts.name"""%(conditions), filters, as_list=1)
|
||||
|
||||
return time_sheet
|
||||
Reference in New Issue
Block a user