Merge pull request #3037 from neilLasrado/production-planning

Production planning
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.js b/erpnext/manufacturing/doctype/production_order/production_order.js
index 36cb1ae..471b46b 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.js
+++ b/erpnext/manufacturing/doctype/production_order/production_order.js
@@ -204,12 +204,13 @@
 			method:"erpnext.manufacturing.doctype.production_order.production_order.make_time_log",
 			args: {
 				"name": doc.name,
-				"operation": child.idx + ". " + child.operation,
+				"operation": child.operation,
 				"from_time": child.planned_start_time,
 				"to_time": child.planned_end_time,
 				"project": doc.project,
 				"workstation": child.workstation,
-				"qty": flt(doc.qty) - flt(child.completed_qty)
+				"qty": flt(doc.qty) - flt(child.completed_qty),
+				"operation_id": child.name
 			},
 			callback: function(r) {
 				var doclist = frappe.model.sync(r.message);
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.json b/erpnext/manufacturing/doctype/production_order/production_order.json
index 59473ad..07cc5c6 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.json
+++ b/erpnext/manufacturing/doctype/production_order/production_order.json
@@ -167,19 +167,22 @@
    "read_only": 0
   }, 
   {
-   "default": "", 
+   "default": "now", 
    "fieldname": "planned_start_date", 
    "fieldtype": "Datetime", 
    "label": "Planned Start Date", 
    "permlevel": 0, 
-   "precision": ""
+   "precision": "", 
+   "reqd": 1
   }, 
   {
    "fieldname": "planned_end_date", 
    "fieldtype": "Datetime", 
    "label": "Planned End Date", 
+   "no_copy": 1, 
    "permlevel": 0, 
-   "precision": ""
+   "precision": "", 
+   "read_only": 1
   }, 
   {
    "fieldname": "column_break_13", 
@@ -354,8 +357,8 @@
  "icon": "icon-cogs", 
  "idx": 1, 
  "in_create": 0, 
- "is_submittable": 1,
- "modified": "2015-03-10 17:02:28.401930", 
+ "is_submittable": 1, 
+ "modified": "2015-04-13 02:44:17.319988", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Production Order", 
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index 6818ba9..fa27e95 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -248,6 +248,7 @@
 		self.planned_end_date = self.operations[-1].planned_end_time
 
 		if time_logs:
+			frappe.local.message_log = []
 			frappe.msgprint(_("Time Logs created:") + "\n" + "\n".join(time_logs))
 
 	def set_operation_start_end_time(self, i, d):
diff --git a/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json b/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
index faa7687..40ecec5 100644
--- a/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
+++ b/erpnext/manufacturing/doctype/production_order_operation/production_order_operation.json
@@ -126,7 +126,7 @@
   }, 
   {
    "allow_on_submit": 1, 
-   "depends_on": "eval:(doc.docstatus==1 && doc.status!=\"Completed\")", 
+   "depends_on": "eval:(doc.docstatus==1)", 
    "fieldname": "show_time_logs", 
    "fieldtype": "Button", 
    "label": "Show Time Logs", 
@@ -277,6 +277,7 @@
    "read_only": 1
   }, 
   {
+   "allow_on_submit": 1, 
    "depends_on": "eval:(doc.docstatus==1 && doc.status!=\"Completed\")", 
    "fieldname": "make_time_log", 
    "fieldtype": "Button", 
@@ -292,7 +293,7 @@
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
- "modified": "2015-03-24 07:02:54.203235", 
+ "modified": "2015-04-01 08:23:58.556092", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Production Order Operation", 
diff --git a/erpnext/projects/doctype/time_log/time_log.js b/erpnext/projects/doctype/time_log/time_log.js
index 91971f3..a49b1f1 100644
--- a/erpnext/projects/doctype/time_log/time_log.js
+++ b/erpnext/projects/doctype/time_log/time_log.js
@@ -41,45 +41,4 @@
 	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.set_query("production_order", function(doc) {
-	return {
-		"filters": {
-			"docstatus": 1
-		}
-	};
-});
-
-cur_frm.add_fetch('task','project','project');
-
-$.extend(cur_frm.cscript, {
-	production_order: function(doc) {
-		if (doc.production_order){
-			var operations = [];
-			frappe.model.with_doc("Production Order", doc.production_order, function(pro) {
-				doc = frappe.get_doc("Production Order",pro);
-				$.each(doc.operations , function(i, row){
-					operations[i] = row.operation;
-				});
-			frappe.meta.get_docfield("Time Log", "operation", me.frm.doc.name).options = "\n" + operations.join("\n");
-			refresh_field("operation");
-			})
-		}
-	},
-
-	operation: function(doc) {
-		return frappe.call({
-			method: "erpnext.projects.doctype.time_log.time_log.get_workstation",
-			args: {
-				"production_order": doc.production_order,
-				"operation": doc.operation
-			},
-			callback: function(r) {
-				if(!r.exc) {
-					cur_frm.set_value("workstation", r.message)
-				}
-			}
-		});
-	}
-});
+});
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log/time_log.json b/erpnext/projects/doctype/time_log/time_log.json
index 6ef576f..20b5c0c 100644
--- a/erpnext/projects/doctype/time_log/time_log.json
+++ b/erpnext/projects/doctype/time_log/time_log.json
@@ -117,7 +117,7 @@
    "options": "Production Order", 
    "permlevel": 0, 
    "precision": "", 
-   "read_only": 0
+   "read_only": 1
   }, 
   {
    "depends_on": "", 
@@ -127,7 +127,7 @@
    "options": "Operation", 
    "permlevel": 0, 
    "precision": "", 
-   "read_only": 0
+   "read_only": 1
   }, 
   {
    "depends_on": "", 
@@ -155,7 +155,7 @@
    "options": "Workstation", 
    "permlevel": 0, 
    "precision": "", 
-   "read_only": 0
+   "read_only": 1
   }, 
   {
    "depends_on": "", 
@@ -242,7 +242,7 @@
  "icon": "icon-time", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-03-24 08:10:31.412670", 
+ "modified": "2015-04-06 02:47:16.187046", 
  "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 a499c8f..c385c09 100644
--- a/erpnext/projects/doctype/time_log/time_log.py
+++ b/erpnext/projects/doctype/time_log/time_log.py
@@ -207,20 +207,6 @@
 			self.quantity = None
 
 @frappe.whitelist()
-def get_workstation(production_order, operation):
-	"""Returns workstation name from Production Order against an associated Operation.
-
-	:param production_order string
-	:param operation string
-	"""
-	if operation:
-		idx, operation = operation.split('. ',1)
-
-		workstation = frappe.db.sql("""select workstation from `tabProduction Order Operation` where idx=%s and
-			parent=%s and operation = %s""", (idx, production_order, operation))
-		return workstation[0][0] if workstation else ""
-
-@frappe.whitelist()
 def get_events(start, end, filters=None):
 	"""Returns events for Gantt / Calendar view rendering.
 
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index bd2d945..0196c31 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -474,8 +474,8 @@
 			pro_doc = frappe.get_doc("Production Order", self.production_order)
 			_validate_production_order(pro_doc)
 			pro_doc.run_method("update_status")
+			pro_doc.run_method("update_production_order_qty")
 			if self.purpose == "Manufacture":
-				pro_doc.run_method("update_production_order_qty")
 				self.update_planned_qty(pro_doc)
 
 	def update_planned_qty(self, pro_doc):