[feature] progress bars on production order
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js
index 404ae38..d50fb46 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.js
+++ b/erpnext/manufacturing/doctype/production_order/production_order.js
@@ -1,63 +1,98 @@
 // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
 // License: GNU General Public License v3. See license.txt
 
-frappe.ui.form.on("Production Order", "onload", function(frm) {
-	if (!frm.doc.status)
-		frm.doc.status = 'Draft';
+frappe.ui.form.on("Production Order", {
+	onload: function(frm) {
+		if (!frm.doc.status)
+			frm.doc.status = 'Draft';
 
-	frm.add_fetch("sales_order", "delivery_date", "expected_delivery_date");
-	frm.add_fetch("sales_order", "project", "project");
+		frm.add_fetch("sales_order", "delivery_date", "expected_delivery_date");
+		frm.add_fetch("sales_order", "project", "project");
 
-	if(frm.doc.__islocal) {
-		frm.set_value({
-			"actual_start_date": "",
-			"actual_end_date": ""
+		if(frm.doc.__islocal) {
+			frm.set_value({
+				"actual_start_date": "",
+				"actual_end_date": ""
+			});
+			erpnext.production_order.set_default_warehouse(frm);
+		}
+
+		erpnext.production_order.set_custom_buttons(frm);
+		erpnext.production_order.setup_company_filter(frm);
+		erpnext.production_order.setup_bom_filter(frm);
+	},
+	refresh: function(frm) {
+		erpnext.toggle_naming_series();
+		frm.set_intro("");
+		erpnext.production_order.set_custom_buttons(frm);
+
+		if (frm.doc.docstatus === 0 && !frm.doc.__islocal) {
+			frm.set_intro(__("Submit this Production Order for further processing."));
+		}
+
+		if (frm.doc.docstatus===1) {
+			frm.trigger('show_progress');
+		}
+	},
+	show_progress: function(frm) {
+		var bars = [];
+		var message = '';
+		var added_min = false;
+
+		// produced qty
+		var title = __('{0} items produced', [frm.doc.produced_qty]);
+		bars.push({
+			'title': title,
+			'width': (frm.doc.produced_qty / frm.doc.qty * 100) + '%',
+			'progress_class': 'progress-bar-success'
 		});
-		erpnext.production_order.set_default_warehouse(frm);
-	}
+		if(bars[0].width=='0%') {
+			 bars[0].width = '0.5%';
+			 added_min = 0.5;
+		 }
+		message = title;
 
-	erpnext.production_order.set_custom_buttons(frm);
-	erpnext.production_order.setup_company_filter(frm);
-	erpnext.production_order.setup_bom_filter(frm);
-});
-
-frappe.ui.form.on("Production Order", "refresh", function(frm) {
-	erpnext.toggle_naming_series();
-	frm.set_intro("");
-	erpnext.production_order.set_custom_buttons(frm);
-
-	if (frm.doc.docstatus === 0 && !frm.doc.__islocal) {
-		frm.set_intro(__("Submit this Production Order for further processing."));
+		// pending qty
+		var pending_complete = frm.doc.material_transferred_for_manufacturing - frm.doc.produced_qty;
+		if(pending_complete) {
+			var title = __('{0} items in progress', [pending_complete]);
+			bars.push({
+				'title': title,
+				'width': ((pending_complete / frm.doc.qty * 100) - added_min)  + '%',
+				'progress_class': 'progress-bar-warning'
+			})
+			message = message + '. ' + title;
+		}
+		frm.dashboard.add_progress(__('Status'), bars, message);
 	}
 });
 
-frappe.ui.form.on("Production Order", "additional_operating_cost", function(frm) {
-	erpnext.production_order.calculate_total_cost(frm);
-});
 
-frappe.ui.form.on("Production Order Operation", "workstation", function(frm, cdt, cdn) {
-	var d = locals[cdt][cdn];
-	if (d.workstation) {
-		frappe.call({
-			"method": "frappe.client.get",
-			args: {
-				doctype: "Workstation",
-				name: d.workstation
-			},
-			callback: function (data) {
-				frappe.model.set_value(d.doctype, d.name, "hour_rate", data.message.hour_rate);
-				erpnext.production_order.calculate_cost(frm.doc);
-				erpnext.production_order.calculate_total_cost(frm);
-			}
-		})
+
+frappe.ui.form.on("Production Order Operation", {
+	workstation: function(frm, cdt, cdn) {
+		var d = locals[cdt][cdn];
+		if (d.workstation) {
+			frappe.call({
+				"method": "frappe.client.get",
+				args: {
+					doctype: "Workstation",
+					name: d.workstation
+				},
+				callback: function (data) {
+					frappe.model.set_value(d.doctype, d.name, "hour_rate", data.message.hour_rate);
+					erpnext.production_order.calculate_cost(frm.doc);
+					erpnext.production_order.calculate_total_cost(frm);
+				}
+			})
+		}
+	},
+	time_in_mins: function(frm, cdt, cdn) {
+		erpnext.production_order.calculate_cost(frm.doc);
+		erpnext.production_order.calculate_total_cost(frm);
 	}
 });
 
-frappe.ui.form.on("Production Order Operation", "time_in_mins", function(frm, cdt, cdn) {
-	erpnext.production_order.calculate_cost(frm.doc);
-	erpnext.production_order.calculate_total_cost(frm)
-});
-
 erpnext.production_order = {
 	set_custom_buttons: function(frm) {
 		var doc = frm.doc;
@@ -84,13 +119,20 @@
 			}
 
 			if (flt(doc.material_transferred_for_manufacturing) < flt(doc.qty)) {
-				frm.add_custom_button(__('Transfer Materials for Manufacture'),
-					cur_frm.cscript['Transfer Raw Materials'], __("Stock Entry"));
+				var btn = frm.add_custom_button(__('Start'),
+					cur_frm.cscript['Transfer Raw Materials']);
+				btn.addClass('btn-primary');
 			}
 
 			if (flt(doc.produced_qty) < flt(doc.material_transferred_for_manufacturing)) {
-				frm.add_custom_button(__('Update Finished Goods'),
-					cur_frm.cscript['Update Finished Goods'], __("Stock Entry"));
+				var btn = frm.add_custom_button(__('Finish'),
+					cur_frm.cscript['Update Finished Goods']);
+
+				if(doc.material_transferred_for_manufacturing==doc.qty) {
+					// all materials transferred for manufacturing,
+					// make this primary
+					btn.addClass('btn-primary');
+				}
 			}
 		}
 
@@ -179,7 +221,7 @@
 			flt(this.frm.doc.qty) - flt(this.frm.doc.material_transferred_for_manufacturing);
 
 		frappe.prompt({fieldtype:"Int", label: __("Qty for {0}", [purpose]), fieldname:"qty",
-			description: __("Max: {0}", [max]) },
+			description: __("Max: {0}", [max]), 'default': max },
 			function(data) {
 				if(data.qty > max) {
 					frappe.msgprint(__("Quantity must not be more than {0}", [max]));