added templates for projects
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 1ae0a95..03919bc 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -74,3 +74,4 @@
erpnext.patches.v4_2.delete_old_print_formats #2014-07-29
erpnext.patches.v4_2.toggle_rounded_total #2014-07-30
erpnext.patches.v4_2.fix_account_master_type
+erpnext.patches.v4_2.update_project_milestones
diff --git a/erpnext/patches/v4_2/update_project_milestones.py b/erpnext/patches/v4_2/update_project_milestones.py
new file mode 100644
index 0000000..24a520e
--- /dev/null
+++ b/erpnext/patches/v4_2/update_project_milestones.py
@@ -0,0 +1,7 @@
+import frappe
+
+def execute():
+ for project in frappe.db.sql_list("select name from tabProject"):
+ p = frappe.get_doc("Project", project)
+ p.update_milestones_completed()
+ p.db_set("percent_milestones_completed", p.percent_milestones_completed)
diff --git a/erpnext/projects/doctype/project/project.js b/erpnext/projects/doctype/project/project.js
index 5d89986..9b2c6d0 100644
--- a/erpnext/projects/doctype/project/project.js
+++ b/erpnext/projects/doctype/project/project.js
@@ -4,7 +4,7 @@
// show tasks
cur_frm.cscript.refresh = function(doc) {
if(!doc.__islocal) {
- cur_frm.appframe.add_button(__("Gantt Chart"), function() {
+ cur_frm.add_custom_button(__("Gantt Chart"), function() {
frappe.route_options = {"project": doc.name}
frappe.set_route("Gantt", "Task");
}, "icon-tasks");
@@ -19,4 +19,4 @@
return{
query: "erpnext.controllers.queries.customer_query"
}
-}
\ No newline at end of file
+}
diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json
index c894bb8..b20914c 100644
--- a/erpnext/projects/doctype/project/project.json
+++ b/erpnext/projects/doctype/project/project.json
@@ -137,6 +137,13 @@
"search_index": 0
},
{
+ "fieldname": "percent_milestones_completed",
+ "fieldtype": "Percent",
+ "label": "% Milestones Completed",
+ "permlevel": 0,
+ "read_only": 1
+ },
+ {
"fieldname": "section_break0",
"fieldtype": "Section Break",
"label": "Project Details",
@@ -158,7 +165,7 @@
"fieldname": "percent_complete",
"fieldtype": "Percent",
"in_list_view": 1,
- "label": "Percent Complete",
+ "label": "% Tasks Completed",
"permlevel": 0,
"read_only": 1
},
@@ -259,7 +266,7 @@
"icon": "icon-puzzle-piece",
"idx": 1,
"max_attachments": 4,
- "modified": "2014-06-24 12:44:19.530707",
+ "modified": "2014-08-04 03:22:11.416219",
"modified_by": "Administrator",
"module": "Projects",
"name": "Project",
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 4a14c55..547e12a 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -26,6 +26,13 @@
if getdate(self.completion_date) < getdate(self.project_start_date):
frappe.throw(_("Expected Completion Date can not be less than Project Start Date"))
+ self.update_milestones_completed()
+
+ def update_milestones_completed(self):
+ if self.project_milestones:
+ completed = filter(lambda x: x.status=="Completed", self.project_milestones)
+ self.percent_milestones_completed = len(completed) * 100 / len(self.project_milestones)
+
def on_update(self):
self.add_calendar_event()
@@ -38,6 +45,7 @@
frappe.db.set_value("Project", self.name, "percent_complete",
int(float(completed) / total * 100))
+
def add_calendar_event(self):
# delete any earlier event for this project
delete_events(self.doctype, self.name)
diff --git a/erpnext/projects/doctype/project/project_list.html b/erpnext/projects/doctype/project/project_list.html
new file mode 100644
index 0000000..42af477
--- /dev/null
+++ b/erpnext/projects/doctype/project/project_list.html
@@ -0,0 +1,38 @@
+<div class="row" style="max-height: 30px;">
+ <div class="col-xs-10">
+ <div class="text-ellipsis">
+ {%= list.get_avatar_and_id(doc) %}
+ <span class="label label-{%= frappe.utils.guess_style(doc.status) %} filterable"
+ data-filter="status,=,{%= doc.status %}">
+ {%= doc.status %}
+ </span>
+ <span class="label label-{%= frappe.utils.guess_style(doc.priority) %} filterable"
+ data-filter="priority,=,{%= doc.priority %}">
+ {%= doc.priority %}
+ </span>
+ {% if(doc.status==="Open" && doc.completion_date
+ && frappe.datetime.get_diff(doc.completion_date) <= 0) { %}
+ <span class="label label-danger filterable"
+ data-filter="completion_date,>=,Today"
+ title="{%= doc.get_formatted("completion_date") %}">
+ {%= __("Overdue") %}
+ </span>
+ {% } else if(doc.completion_date) { %}
+ <span class="label label-default filterable"
+ data-filter="completion_date,=,{%= doc.completion_date %}"
+ title="{%= __("Due Date") %}">
+ {%= doc.get_formatted("completion_date") %}
+ </span>
+ {% } %}
+ </div>
+ </div>
+ <div class="col-xs-1 text-right">
+ {% var completed = doc.percent_complete, title = __("% Tasks Completed") %}
+ {% include "templates/form_grid/includes/progress.html" %}
+ </div>
+ <div class="col-xs-1 text-right">
+ {% var completed = doc.percent_milestones_completed,
+ title = __("% Milestones Achieved") %}
+ {% include "templates/form_grid/includes/progress.html" %}
+ </div>
+</div>
diff --git a/erpnext/projects/doctype/project/project_list.js b/erpnext/projects/doctype/project/project_list.js
new file mode 100644
index 0000000..dd0ac60
--- /dev/null
+++ b/erpnext/projects/doctype/project/project_list.js
@@ -0,0 +1,5 @@
+frappe.listview_settings['Project'] = {
+ add_fields: ["status", "priority", "is_active", "percent_complete",
+ "percent_milestones_completed", "completion_date"],
+ filters:[["status","=", "Open"]]
+};
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index 6b0b237..7ca502d 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -62,8 +62,10 @@
data = frappe.db.sql("""select name, exp_start_date, exp_end_date,
subject, status, project from `tabTask`
- where ((exp_start_date between '%(start)s' and '%(end)s') \
- or (exp_end_date between '%(start)s' and '%(end)s'))
+ where ((ifnull(exp_start_date, '0000-00-00')!= '0000-00-00') \
+ and (exp_start_date between '%(start)s' and '%(end)s') \
+ or ((ifnull(exp_start_date, '0000-00-00')!= '0000-00-00') \
+ and exp_end_date between '%(start)s' and '%(end)s'))
%(conditions)s""" % {
"start": start,
"end": end,
diff --git a/erpnext/projects/doctype/task/task_list.html b/erpnext/projects/doctype/task/task_list.html
new file mode 100644
index 0000000..0d95055
--- /dev/null
+++ b/erpnext/projects/doctype/task/task_list.html
@@ -0,0 +1,34 @@
+<div class="row" style="max-height: 30px;">
+ <div class="col-xs-12">
+ <div class="text-ellipsis">
+ {%= list.get_avatar_and_id(doc) %}
+ {% if(doc.project) { %}
+ <span class="filterable" style="margin-right: 8px;"
+ data-filter="project,=,{%= doc.project %}">
+ {%= doc.project %}</span>
+ {% } %}
+ <span class="label label-{%= frappe.utils.guess_style(doc.status) %} filterable"
+ data-filter="status,=,{%= doc.status %}">
+ {%= doc.status %}
+ </span>
+ <span class="label label-{%= frappe.utils.guess_style(doc.priority) %} filterable"
+ data-filter="priority,=,{%= doc.priority %}">
+ {%= doc.priority %}
+ </span>
+ {% if(doc.status==="Open" && doc.exp_end_date
+ && frappe.datetime.get_diff(doc.exp_end_date) <= 0) { %}
+ <span class="label label-danger filterable"
+ data-filter="exp_end_date,>=,Today"
+ title="{%= doc.get_formatted("exp_end_date") %}">
+ {%= __("Overdue") %}
+ </span>
+ {% } else if(doc.exp_end_date) { %}
+ <span class="label label-default filterable"
+ data-filter="exp_end_date,=,{%= doc.exp_end_date %}"
+ title="{%= __("Due Date") %}">
+ {%= doc.get_formatted("exp_end_date") %}
+ </span>
+ {% } %}
+ </div>
+ </div>
+</div>
diff --git a/erpnext/projects/doctype/task/task_list.js b/erpnext/projects/doctype/task/task_list.js
new file mode 100644
index 0000000..4406085
--- /dev/null
+++ b/erpnext/projects/doctype/task/task_list.js
@@ -0,0 +1,4 @@
+frappe.listview_settings['Task'] = {
+ add_fields: ["project", "status", "priority", "exp_end_date"],
+ filters:[["status","=", "Open"]]
+};
diff --git a/erpnext/projects/doctype/time_log/time_log.js b/erpnext/projects/doctype/time_log/time_log.js
index eb5fc09..d4d109d 100644
--- a/erpnext/projects/doctype/time_log/time_log.js
+++ b/erpnext/projects/doctype/time_log/time_log.js
@@ -3,12 +3,27 @@
frappe.provide("erpnext.projects");
-erpnext.projects.TimeLog = frappe.ui.form.Controller.extend({
- onload: function() {
- this.frm.set_query("task", erpnext.queries.task);
- }
+frappe.ui.form.on("Time Log", "onload", function(frm) {
+ frm.set_query("task", erpnext.queries.task);
});
-cur_frm.cscript = new erpnext.projects.TimeLog({frm: cur_frm});
+// 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;
+});
-cur_frm.add_fetch('task','project','project');
\ No newline at end of file
+// 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),
+ "hours"));
+});
+
+cur_frm.add_fetch('task','project','project');
diff --git a/erpnext/projects/doctype/time_log/time_log.json b/erpnext/projects/doctype/time_log/time_log.json
index daeddba..157be0c 100644
--- a/erpnext/projects/doctype/time_log/time_log.json
+++ b/erpnext/projects/doctype/time_log/time_log.json
@@ -27,6 +27,14 @@
"reqd": 1
},
{
+ "fieldname": "hours",
+ "fieldtype": "Float",
+ "in_list_view": 1,
+ "label": "Hours",
+ "permlevel": 0,
+ "read_only": 0
+ },
+ {
"fieldname": "to_time",
"fieldtype": "Datetime",
"in_list_view": 1,
@@ -36,14 +44,6 @@
"reqd": 1
},
{
- "fieldname": "hours",
- "fieldtype": "Float",
- "in_list_view": 1,
- "label": "Hours",
- "permlevel": 0,
- "read_only": 1
- },
- {
"fieldname": "column_break_3",
"fieldtype": "Column Break",
"permlevel": 0,
@@ -152,7 +152,7 @@
"icon": "icon-time",
"idx": 1,
"is_submittable": 1,
- "modified": "2014-05-27 03:49:21.143356",
+ "modified": "2014-08-04 05:23:15.740050",
"modified_by": "Administrator",
"module": "Projects",
"name": "Time Log",
diff --git a/erpnext/projects/doctype/time_log/time_log_list.html b/erpnext/projects/doctype/time_log/time_log_list.html
new file mode 100644
index 0000000..ee0b96f2
--- /dev/null
+++ b/erpnext/projects/doctype/time_log/time_log_list.html
@@ -0,0 +1,25 @@
+<div class="row" style="max-height: 30px;">
+ <div class="col-xs-12">
+ <div class="text-ellipsis">
+ {%= list.get_avatar_and_id(doc) %}
+ {% if(doc.billable) { %}
+ <span style="margin-right: 8px;"
+ title="{%= __("Billable") %}" class="filterable"
+ data-filter="billable,=,Yes">
+ <i class="icon-money text-muted"></i>
+ </span>
+ {% } %}
+ <span class="label label-info filterable" style="margin-right: 8px;"
+ data-filter="activity_type,=,{%= doc.activity_type %}">
+ {%= doc.activity_type %}</span>
+ <span style="margin-right: 8px;" class="text-muted">
+ ({%= doc.hours + " " + __("hours") %})
+ </span>
+ {% if(doc.project) { %}
+ <span class="filterable" style="margin-right: 8px;"
+ data-filter="project,=,{%= doc.project %}">
+ {%= doc.project %}</span>
+ {% } %}
+ </div>
+ </div>
+</div>
diff --git a/erpnext/projects/doctype/time_log/time_log_list.js b/erpnext/projects/doctype/time_log/time_log_list.js
index a40297f..6641174 100644
--- a/erpnext/projects/doctype/time_log/time_log_list.js
+++ b/erpnext/projects/doctype/time_log/time_log_list.js
@@ -3,10 +3,10 @@
// render
frappe.listview_settings['Time Log'] = {
- add_fields: ["`tabTime Log`.`status`", "`tabTime Log`.`billable`", "`tabTime Log`.`activity_type`"],
+ add_fields: ["status", "billable", "activity_type", "task", "project", "hours"],
selectable: true,
onload: function(me) {
- me.appframe.add_button(__("Make Time Log Batch"), function() {
+ me.appframe.add_primary_action(__("Make Time Log Batch"), function() {
var selected = me.get_checked_items() || [];
if(!selected.length) {
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch_list.html b/erpnext/projects/doctype/time_log_batch/time_log_batch_list.html
new file mode 100644
index 0000000..4a34f1c
--- /dev/null
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch_list.html
@@ -0,0 +1,15 @@
+<div class="row" style="max-height: 30px;">
+ <div class="col-xs-12">
+ <div class="text-ellipsis">
+ {%= list.get_avatar_and_id(doc) %}
+ <span class="label label-{%= doc.status=="Billed" ? "success" :
+ frappe.utils.guess_style(doc.status) %} filterable"
+ style="margin-right: 8px;"
+ data-filter="status,=,{%= doc.status %}">
+ {%= doc.status %}</span>
+ <span style="margin-right: 8px;" class="text-muted">
+ ({%= doc.total_hours + " " + __("hours") %})
+ </span>
+ </div>
+ </div>
+</div>
diff --git a/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js b/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js
new file mode 100644
index 0000000..a0825a2
--- /dev/null
+++ b/erpnext/projects/doctype/time_log_batch/time_log_batch_list.js
@@ -0,0 +1,4 @@
+frappe.listview_settings['Time Log Batch'] = {
+ add_fields: ["status", "total_hours", "rate"],
+ filters:[["status","in", "Draft,Submitted"]]
+};
diff --git a/erpnext/selling/doctype/quotation/quotation_list.js b/erpnext/selling/doctype/quotation/quotation_list.js
index bbc264d..91b65ee 100644
--- a/erpnext/selling/doctype/quotation/quotation_list.js
+++ b/erpnext/selling/doctype/quotation/quotation_list.js
@@ -1,4 +1,5 @@
frappe.listview_settings['Quotation'] = {
add_fields: ["customer_name", "quotation_to", "grand_total", "status",
- "company", "currency", "order_type", "lead", "customer"]
+ "company", "currency", "order_type", "lead", "customer"],
+ filters: [["status", "=", "Submitted"]]
};
diff --git a/erpnext/selling/doctype/sales_order/sales_order_list.js b/erpnext/selling/doctype/sales_order/sales_order_list.js
index a801cb9..3884526 100644
--- a/erpnext/selling/doctype/sales_order/sales_order_list.js
+++ b/erpnext/selling/doctype/sales_order/sales_order_list.js
@@ -1,5 +1,5 @@
frappe.listview_settings['Sales Order'] = {
add_fields: ["grand_total", "company", "currency", "customer",
"customer_name", "per_delivered", "per_billed", "delivery_date"],
- filters: [["per_delivered", "<", "100"]]
+ filters: [["per_delivered", "<", 100]]
};
diff --git a/erpnext/stock/doctype/batch/batch_list.html b/erpnext/stock/doctype/batch/batch_list.html
new file mode 100644
index 0000000..dc29905
--- /dev/null
+++ b/erpnext/stock/doctype/batch/batch_list.html
@@ -0,0 +1,21 @@
+<div class="row" style="max-height: 30px;">
+ <div class="col-xs-12">
+ <div class="text-ellipsis">
+ {%= list.get_avatar_and_id(doc) %}
+ <span class="filterable" style="margin-right: 8px;"
+ data-filter="item,=,{%= doc.item %}">
+ {%= doc.item %}</span>
+ {% if(doc.expiry_date && frappe.datetime.get_diff(doc.expiry_date) <= 0) { %}
+ <span class="label label-danger filterable"
+ data-filter="expiry_date,>=,Today">
+ {%= __("Expired") %}: {%= doc.get_formatted("expiry_date") %}
+ </span>
+ {% } else if(doc.expiry_date) { %}
+ <span class="label label-default filterable"
+ data-filter="expiry_date,=,{%= doc.expiry_date %}">
+ {%= __("Expiry") %}: {%= doc.get_formatted("expiry_date") %}
+ </span>
+ {% } %}
+ </div>
+ </div>
+</div>
diff --git a/erpnext/stock/doctype/batch/batch_list.js b/erpnext/stock/doctype/batch/batch_list.js
new file mode 100644
index 0000000..daeb69b
--- /dev/null
+++ b/erpnext/stock/doctype/batch/batch_list.js
@@ -0,0 +1,3 @@
+frappe.listview_settings['Batch'] = {
+ add_fields: ["item", "expiry_date"]
+};
diff --git a/erpnext/stock/doctype/material_request/material_request_list.js b/erpnext/stock/doctype/material_request/material_request_list.js
index 2a85dcc..989ca60 100644
--- a/erpnext/stock/doctype/material_request/material_request_list.js
+++ b/erpnext/stock/doctype/material_request/material_request_list.js
@@ -1,3 +1,4 @@
frappe.listview_settings['Material Request'] = {
- add_fields: ["material_request_type", "status", "per_ordered"]
+ add_fields: ["material_request_type", "status", "per_ordered"],
+ filters: [["per_ordered", "<", 100]]
};
diff --git a/erpnext/stock/doctype/serial_no/serial_no_list.html b/erpnext/stock/doctype/serial_no/serial_no_list.html
new file mode 100644
index 0000000..d53aab1
--- /dev/null
+++ b/erpnext/stock/doctype/serial_no/serial_no_list.html
@@ -0,0 +1,28 @@
+<div class="row" style="max-height: 30px;">
+ <div class="col-xs-12">
+ <div class="text-ellipsis">
+ {%= list.get_avatar_and_id(doc) %}
+ <span class="filterable" style="margin-right: 8px;"
+ data-filter="item_code,=,{%= doc.item_code %}">
+ {%= doc.item_code %}</span>
+ {% var icon = {
+ "Available": ["icon-ok", "label-success"],
+ "Not Available": ["icon-remove", "label-danger"],
+ "Delivered": ["icon-truck", "label-success"],
+ "Purchase Returned": ["icon-retweet", "label-warning"],
+ "Sales Returned": ["icon-retweet", "label-warning"],
+ }[doc.status]; %}
+ <span class="label {%= icon[1] %} filterable"
+ data-filter="status,=,{%= doc.status %}"
+ title="{%= doc.purpose %}">
+ <i class="{%= icon[0] %}"></i> {%= doc.status %}
+ </span>
+ {% if(doc.warehouse) { %}
+ <span class="label label-default filterable"
+ data-filter="warehouse,=,{%= doc.warehouse %}">
+ {%= doc.warehouse %}
+ </span>
+ {% } %}
+ </div>
+ </div>
+</div>
diff --git a/erpnext/stock/doctype/serial_no/serial_no_list.js b/erpnext/stock/doctype/serial_no/serial_no_list.js
new file mode 100644
index 0000000..9a65138
--- /dev/null
+++ b/erpnext/stock/doctype/serial_no/serial_no_list.js
@@ -0,0 +1,3 @@
+frappe.listview_settings['Serial No'] = {
+ add_fields: ["status", "item_code", "warehouse"]
+};
diff --git a/erpnext/stock/doctype/warehouse/warehouse.json b/erpnext/stock/doctype/warehouse/warehouse.json
index 4e016e6..0a4c244 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.json
+++ b/erpnext/stock/doctype/warehouse/warehouse.json
@@ -43,6 +43,7 @@
"description": "Account for the warehouse (Perpetual Inventory) will be created under this Account.",
"fieldname": "create_account_under",
"fieldtype": "Link",
+ "in_list_view": 1,
"label": "Parent Account",
"options": "Account",
"permlevel": 0
@@ -150,7 +151,7 @@
],
"icon": "icon-building",
"idx": 1,
- "modified": "2014-05-27 03:49:22.483111",
+ "modified": "2014-08-04 02:55:16.750848",
"modified_by": "Administrator",
"module": "Stock",
"name": "Warehouse",