[fix] making time log entry easier, to time not mandatory while making time log and Finish button
diff --git a/erpnext/projects/doctype/time_log/time_log.js b/erpnext/projects/doctype/time_log/time_log.js
index 7648a53..10e3bc7 100644
--- a/erpnext/projects/doctype/time_log/time_log.js
+++ b/erpnext/projects/doctype/time_log/time_log.js
@@ -1,111 +1,105 @@
// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
// License: GNU General Public License v3. See license.txt
-frappe.provide("erpnext.projects");
-
-frappe.ui.form.on("Time Log", "onload", function(frm) {
- if (frm.doc.__islocal) {
- if (frm.doc.for_manufacturing) {
- frappe.ui.form.trigger("Time Log", "production_order");
+frappe.ui.form.on("Time Log", {
+ onload: function(frm) {
+ if (frm.doc.__islocal) {
+ if (frm.doc.for_manufacturing) {
+ frappe.ui.form.trigger("Time Log", "production_order");
+ }
+ if (frm.doc.from_time && frm.doc.to_time) {
+ frappe.ui.form.trigger("Time Log", "to_time");
+ }
}
- if (frm.doc.from_time && frm.doc.to_time) {
- frappe.ui.form.trigger("Time Log", "to_time");
- }
- }
-});
-
-frappe.ui.form.on("Time Log", "refresh", function(frm) {
- // set default user if created
- if (frm.doc.__islocal && !frm.doc.user) {
- frm.set_value("user", user);
- }
-
- frm.toggle_reqd("activity_type", !frm.doc.for_manufacturing);
-});
-
-
-// set to time if hours is updated
-frappe.ui.form.on("Time Log", "hours", function(frm) {
- if(!frm.doc.from_time) {
- frm.set_value("from_time", frappe.datetime.now_datetime());
- }
- var d = moment(frm.doc.from_time);
- d.add(frm.doc.hours, "hours");
- frm._setting_hours = true;
- frm.set_value("to_time", d.format(moment.defaultDatetimeFormat));
- frm._setting_hours = false;
-});
-
-// clear production order if making time log
-frappe.ui.form.on("Time Log", "before_save", function(frm) {
- frm.doc.production_order && frappe.model.remove_from_locals("Production Order",
- frm.doc.production_order);
-});
-
-// set hours if to_time is updated
-frappe.ui.form.on("Time Log", "to_time", function(frm) {
- if(frm._setting_hours) return;
- frm.set_value("hours", moment(cur_frm.doc.to_time).diff(moment(cur_frm.doc.from_time),
- "seconds") / 3600);
-
-});
-
-var calculate_cost = function(frm) {
- frm.set_value("costing_amount", frm.doc.costing_rate * frm.doc.hours);
- if (frm.doc.billable==1){
- frm.set_value("billing_amount", (frm.doc.billing_rate * frm.doc.hours) + frm.doc.additional_cost);
- }
-}
-
-var get_activity_cost = function(frm) {
- if (frm.doc.activity_type){
- return frappe.call({
- method: "erpnext.projects.doctype.time_log.time_log.get_activity_cost",
- args: {
- "employee": frm.doc.employee,
- "activity_type": frm.doc.activity_type
- },
- callback: function(r) {
- if(!r.exc && r.message) {
- frm.set_value("costing_rate", r.message.costing_rate);
- frm.set_value("billing_rate", r.message.billing_rate);
- calculate_cost(frm);
+ frm.set_query('task', function() {
+ return {
+ filters:{
+ 'project': frm.doc.project
}
}
});
- }
-}
+ },
+ refresh: function(frm) {
+ // set default user if created
+ if (frm.doc.__islocal && !frm.doc.user) {
+ frm.set_value("user", user);
+ }
+ if (frm.doc.status==='In Progress' && !frm.is_new()) {
+ frm.add_custom_button(__('Finish'), function() {
+ frappe.prompt({
+ fieldtype: 'Datetime',
+ fieldname: 'to_time',
+ label: __('End Time'),
+ 'default': dateutil.now_datetime()
+ }, function(value) {
+ frm.set_value('to_time', value.to_time);
+ frm.save();
+ });
+ }).addClass('btn-primary');
+ }
-frappe.ui.form.on("Time Log", "hours", function(frm) {
- calculate_cost(frm);
-});
-frappe.ui.form.on("Time Log", "additional_cost", function(frm) {
- calculate_cost(frm);
-});
+ frm.toggle_reqd("activity_type", !frm.doc.for_manufacturing);
+ },
+ hours: function(frm) {
+ if(!frm.doc.from_time) {
+ frm.set_value("from_time", frappe.datetime.now_datetime());
+ }
+ var d = moment(frm.doc.from_time);
+ d.add(frm.doc.hours, "hours");
+ frm._setting_hours = true;
+ frm.set_value("to_time", d.format(moment.defaultDatetimeFormat));
+ frm._setting_hours = false;
-frappe.ui.form.on("Time Log", "activity_type", function(frm) {
- get_activity_cost(frm);
-});
-
-frappe.ui.form.on("Time Log", "employee", function(frm) {
- get_activity_cost(frm);
-});
-
-frappe.ui.form.on("Time Log", "billable", function(frm) {
- if (frm.doc.billable==1) {
- calculate_cost(frm);
- }
- else {
- frm.set_value("billing_amount", 0);
- frm.set_value("additional_cost", 0);
- }
-});
-
-cur_frm.fields_dict['task'].get_query = function(doc) {
- return {
- filters:{
- 'project': doc.project
+ frm.trigger('calculate_cost');
+ },
+ before_save: function(frm) {
+ frm.doc.production_order && frappe.model.remove_from_locals("Production Order",
+ frm.doc.production_order);
+ },
+ to_time: function(frm) {
+ if(frm._setting_hours) return;
+ frm.set_value("hours", moment(cur_frm.doc.to_time).diff(moment(cur_frm.doc.from_time),
+ "seconds") / 3600);
+ },
+ calculate_cost: function(frm) {
+ frm.set_value("costing_amount", frm.doc.costing_rate * frm.doc.hours);
+ if (frm.doc.billable==1){
+ frm.set_value("billing_amount", (frm.doc.billing_rate * frm.doc.hours) + frm.doc.additional_cost);
+ }
+ },
+ additional_cost: function(frm) {
+ frm.trigger('calculate_cost');
+ },
+ activity_type: function(frm) {
+ if (frm.doc.activity_type){
+ return frappe.call({
+ method: "erpnext.projects.doctype.time_log.time_log.get_activity_cost",
+ args: {
+ "employee": frm.doc.employee,
+ "activity_type": frm.doc.activity_type
+ },
+ callback: function(r) {
+ if(!r.exc && r.message) {
+ frm.set_value("costing_rate", r.message.costing_rate);
+ frm.set_value("billing_rate", r.message.billing_rate);
+ frm.trigger('calculate_cost');
+ }
+ }
+ });
+ }
+ },
+ employee: function(frm) {
+ frm.trigger('activity_type');
+ },
+ billable: function(frm) {
+ if (frm.doc.billable==1) {
+ frm.trigger('calculate_cost');
+ }
+ else {
+ frm.set_value("billing_amount", 0);
+ frm.set_value("additional_cost", 0);
}
}
-}
+
+});
diff --git a/erpnext/projects/doctype/time_log/time_log.json b/erpnext/projects/doctype/time_log/time_log.json
index 050fc54..ef61d41 100644
--- a/erpnext/projects/doctype/time_log/time_log.json
+++ b/erpnext/projects/doctype/time_log/time_log.json
@@ -89,7 +89,7 @@
},
{
"allow_on_submit": 0,
- "bold": 0,
+ "bold": 1,
"collapsible": 0,
"depends_on": "",
"fieldname": "project",
@@ -115,7 +115,7 @@
},
{
"allow_on_submit": 0,
- "bold": 0,
+ "bold": 1,
"collapsible": 0,
"depends_on": "",
"fieldname": "task",
@@ -153,7 +153,7 @@
"label": "Status",
"length": 0,
"no_copy": 0,
- "options": "Draft\nSubmitted\nBatched for Billing\nBilled\nCancelled",
+ "options": "In Progress\nTo Submit\nSubmitted\nBatched for Billing\nBilled\nCancelled",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
@@ -190,8 +190,9 @@
},
{
"allow_on_submit": 0,
- "bold": 0,
+ "bold": 1,
"collapsible": 0,
+ "default": "now",
"fieldname": "from_time",
"fieldtype": "Datetime",
"hidden": 0,
@@ -239,7 +240,7 @@
},
{
"allow_on_submit": 0,
- "bold": 0,
+ "bold": 1,
"collapsible": 0,
"fieldname": "to_time",
"fieldtype": "Datetime",
@@ -256,7 +257,7 @@
"print_hide_if_no_value": 0,
"read_only": 0,
"report_hide": 0,
- "reqd": 1,
+ "reqd": 0,
"search_index": 0,
"set_only_once": 0,
"unique": 0
@@ -934,7 +935,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-04-15 07:51:03.097280",
+ "modified": "2016-04-29 03:45:50.096299",
"modified_by": "Administrator",
"module": "Projects",
"name": "Time Log",
diff --git a/erpnext/projects/doctype/time_log/time_log.py b/erpnext/projects/doctype/time_log/time_log.py
index e2641eb..9545bd7 100644
--- a/erpnext/projects/doctype/time_log/time_log.py
+++ b/erpnext/projects/doctype/time_log/time_log.py
@@ -45,16 +45,19 @@
def set_status(self):
self.status = {
- 0: "Draft",
+ 0: "To Submit",
1: "Submitted",
2: "Cancelled"
}[self.docstatus or 0]
+ if not self.to_time:
+ self.status = 'In Progress'
+
if self.time_log_batch:
- self.status="Batched for Billing"
+ self.status= "Batched for Billing"
if self.sales_invoice:
- self.status="Billed"
+ self.status= "Billed"
def set_title(self):
"""Set default title for the Time Log"""
@@ -88,8 +91,8 @@
existing = frappe.db.sql("""select name, from_time, to_time from `tabTime Log`
where `{0}`=%(val)s and
(
- (%(from_time)s > from_time and %(from_time)s < to_time) or
- (%(to_time)s > from_time and %(to_time)s < to_time) or
+ (%(from_time)s > from_time and %(from_time)s < to_time) or
+ (%(to_time)s > from_time and %(to_time)s < to_time) or
(%(from_time)s <= from_time and %(to_time)s >= to_time))
and name!=%(name)s
and docstatus < 2""".format(fieldname),
@@ -233,7 +236,7 @@
self.billing_amount = self.billing_rate * self.hours
else:
self.billing_amount = 0
-
+
if self.additional_cost and self.billable:
self.billing_amount += self.additional_cost
@@ -247,11 +250,11 @@
elif self.project:
frappe.get_doc("Project", self.project).update_project()
-
+
def has_webform_permission(doc):
project_user = frappe.db.get_value("Project User", {"parent": doc.project, "user":frappe.session.user} , "user")
if project_user:
- return True
+ return True
@frappe.whitelist()
diff --git a/erpnext/projects/doctype/time_log/time_log_list.js b/erpnext/projects/doctype/time_log/time_log_list.js
index 5396928..e9e7d05 100644
--- a/erpnext/projects/doctype/time_log/time_log_list.js
+++ b/erpnext/projects/doctype/time_log/time_log_list.js
@@ -4,9 +4,15 @@
// render
frappe.listview_settings['Time Log'] = {
add_fields: ["status", "billable", "activity_type", "task", "project", "hours", "for_manufacturing", "billing_amount"],
-
+
+ has_indicator_for_draft: true,
+
get_indicator: function(doc) {
- if (doc.status== "Batched for Billing") {
+ if (doc.status== "Draft") {
+ return [__("Draft"), "red", "status,=,Draft"]
+ } else if (doc.status== "In Progress") {
+ return [__("In Progress"), "orange", "status,=,In Progress"]
+ } else if (doc.status== "Batched for Billing") {
return [__("Batched for Billing"), "darkgrey", "status,=,Batched for Billing"]
} else if (doc.status== "Billed") {
return [__("Billed"), "green", "status,=,Billed"]
@@ -14,7 +20,7 @@
return [__("Billable"), "orange", "billable,=,1"]
}
},
-
+
selectable: true,
onload: function(me) {
me.page.add_menu_item(__("Make Time Log Batch"), function() {