Fixed Documentation
diff --git a/erpnext/docs/assets/img/manufacturing/ppt.png b/erpnext/docs/assets/img/manufacturing/ppt.png
index f5018b7..30096ff 100644
--- a/erpnext/docs/assets/img/manufacturing/ppt.png
+++ b/erpnext/docs/assets/img/manufacturing/ppt.png
Binary files differ
diff --git a/erpnext/docs/user/manual/en/manufacturing/tools/production-planning-tool.md b/erpnext/docs/user/manual/en/manufacturing/tools/production-planning-tool.md
index 61ec4c7..4bdc487 100644
--- a/erpnext/docs/user/manual/en/manufacturing/tools/production-planning-tool.md
+++ b/erpnext/docs/user/manual/en/manufacturing/tools/production-planning-tool.md
@@ -1,7 +1,7 @@
Production Planning Tool helps you plan production and purchase of Items for a
period (usually a week or a month).
-This list of Items can be generated from the open Sales Orders in the system
+This list of Items can be generated from the open Sales Orders or pending Material Requests that can be Manufactured in the system
and will generate:
* Production Orders for each Item.
@@ -13,30 +13,36 @@
<img class="screenshot" alt="Production Planing Tool" src="{{docs_base_url}}/assets/img/manufacturing/ppt.png">
+#### Step 1: Specify source to get Production Items
+
+* You can select Sales Order or Material Request according to where you want to source the items from
+* If you plan to add items manually, keep the "Get items from" field empty
-#### Step 1: Select and get Sales Order
-* Select sales orders for MRP using filters (Time, Item, and Customer)
-* Click on Get Sales Order to generate a list.
+#### Step 2: Select and get Sales Order / Material Request
+
+* Use filters to get the Sales Order / Material Request
+* Click on Get Sales Order / Get Material Requests to generate a list.
<img class="screenshot" alt="Production Planing Tool" src="{{docs_base_url}}/assets/img/manufacturing/ppt-get-sales-orders.png">
-#### Step 2: Get Item from Sales Orders.
+#### Step 3: Get Items
-You can add/remove or change quantity of these Items.
+* Get the items for the Sales Order / Material request list
+* You can add/remove or change quantity of these Items.
<img class="screenshot" alt="Production Planing Tool" src="{{docs_base_url}}/assets/img/manufacturing/ppt-get-item.png">
-#### Step 3: Create Production Orders
+#### Step 4: Create Production Orders
<img class="screenshot" alt="Production Planing Tool" src="{{docs_base_url}}/assets/img/manufacturing/ppt-create-production-order.png">
-#### Step 4: Create Material Request
+#### Step 5: Create Material Request
Create Material Request for Items with projected shortfall.
@@ -46,11 +52,11 @@
The Production Planning Tool is used in two stages:
- * Selection of Open Sales Orders for the period based on “Expected Delivery Date”.
- * Selection of Items from those Sales Orders.
+ * Selection of open Sales Orders / pending Material Request for the period based on “Expected Delivery Date”.
+ * Selection of Items from those Sales Orders / Material Requests
-The tool will update if you have already created Production Orders for a
-particular Item against its Sales Order (“Planned Quantity”).
+The tool will update if you have already created Production Orde rs for a
+particular Item against its Sales Order (“Planned Quantity”) or Material Request.
You can always edit the Item list and increase / reduce quantities to plan
your production.
diff --git a/erpnext/docs/user/manual/en/stock/material-request.md b/erpnext/docs/user/manual/en/stock/material-request.md
index a609756..8afda60 100644
--- a/erpnext/docs/user/manual/en/stock/material-request.md
+++ b/erpnext/docs/user/manual/en/stock/material-request.md
@@ -23,6 +23,7 @@
* Purchase - If the request material is to be purchased.
* Material Transfer - If the requested material is to be shifted from one warehouse to another.
* Material Issue - If the requested material is to be Issued.
+* Manufacture - If the requested material is to be Produced.
> Info: Material Request is not mandatory. It is ideal if you have centralized
buying so that you can collect this information from various departments.
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index ead8105..b1678f1 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -314,7 +314,8 @@
def set_actual_dates(self):
if self.get("operations"):
- actual_date = frappe.db.sql("""select min(actual_start_time) as start_date, max(actual_end_time) as end_date from `tabProduction Order Operation`
+ actual_date = frappe.db.sql("""select min(actual_start_time) as start_date,
+ max(actual_end_time) as end_date from `tabProduction Order Operation`
where parent = %s and docstatus=1""", self.name, as_dict=1)[0]
self.actual_start_date = actual_date.start_date
self.actual_end_date = actual_date.end_date
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json
index 19b5fd9..699fb2a 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.json
@@ -13,16 +13,16 @@
"bold": 0,
"collapsible": 0,
"default": "Sales Order",
- "fieldname": "plan_using",
+ "fieldname": "get_items_from",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"in_filter": 0,
"in_list_view": 0,
- "label": "Plan Using",
+ "label": "Get Items From",
"length": 0,
"no_copy": 0,
- "options": "Sales Order\nMaterial Request",
+ "options": "\nSales Order\nMaterial Request",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -38,7 +38,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "depends_on": "",
+ "depends_on": "get_items_from",
"description": "",
"fieldname": "filters",
"fieldtype": "Section Break",
@@ -87,7 +87,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "depends_on": "eval: doc.plan_using == \"Sales Order\"",
+ "depends_on": "eval: doc.get_items_from == \"Sales Order\"",
"fieldname": "customer",
"fieldtype": "Link",
"hidden": 0,
@@ -112,7 +112,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "depends_on": "eval: doc.plan_using == \"Material Request\"",
+ "depends_on": "eval: doc.get_items_from == \"Material Request\"",
"fieldname": "warehouse",
"fieldtype": "Link",
"hidden": 0,
@@ -138,7 +138,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "depends_on": "eval: doc.plan_using == \"Sales Order\"",
+ "depends_on": "eval: doc.get_items_from == \"Sales Order\"",
"fieldname": "company",
"fieldtype": "Link",
"hidden": 0,
@@ -232,7 +232,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "depends_on": "eval: doc.plan_using == \"Sales Order\"",
+ "depends_on": "eval: doc.get_items_from == \"Sales Order\"",
"fieldname": "section_break1",
"fieldtype": "Section Break",
"hidden": 0,
@@ -305,7 +305,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
- "depends_on": "eval: doc.plan_using == \"Material Request\"",
+ "depends_on": "eval: doc.get_items_from == \"Material Request\"",
"fieldname": "section_break_16",
"fieldtype": "Section Break",
"hidden": 0,
@@ -403,6 +403,7 @@
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
+ "depends_on": "get_items_from",
"fieldname": "get_items",
"fieldtype": "Button",
"hidden": 0,
@@ -428,6 +429,7 @@
"bold": 0,
"collapsible": 0,
"default": "1",
+ "depends_on": "get_items_from",
"description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.",
"fieldname": "use_multi_level_bom",
"fieldtype": "Check",
@@ -629,7 +631,7 @@
"issingle": 1,
"istable": 0,
"max_attachments": 0,
- "modified": "2016-02-11 06:18:45.077263",
+ "modified": "2016-02-16 06:56:08.244906",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Production Planning Tool",
diff --git a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index bec97d1..ee5e4e7 100644
--- a/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/erpnext/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -115,9 +115,9 @@
mr.material_request_date = cstr(r['transaction_date'])
def get_items(self):
- if self.plan_using == "Sales Order":
+ if self.get_items_from == "Sales Order":
self.get_so_items()
- elif self.plan_using == "Material Request":
+ elif self.get_items_from == "Material Request":
self.get_mr_items()
def get_so_items(self):
@@ -191,9 +191,9 @@
pi.planned_qty = flt(p['pending_qty'])
pi.pending_qty = flt(p['pending_qty'])
- if self.plan_using == "Sales Order":
+ if self.get_items_from == "Sales Order":
pi.sales_order = p['parent']
- elif self.plan_using == "Material Request":
+ elif self.get_items_from == "Material Request":
pi.material_request = p['parent']
pi.material_request_item = p['name']
@@ -252,18 +252,18 @@
}
""" Club similar BOM and item for processing in case of Sales Orders """
- if self.plan_using == "Sales Order":
+ if self.get_items_from == "Material Request":
+ item_details.update({
+ "qty": d.planned_qty
+ })
+ item_dict[(d.item_code, d.material_request_item, d.warehouse)] = item_details
+
+ else:
item_details.update({
"qty":flt(item_dict.get((d.item_code, d.sales_order, d.warehouse),{})
.get("qty")) + flt(d.planned_qty)
})
item_dict[(d.item_code, d.sales_order, d.warehouse)] = item_details
-
- elif self.plan_using == "Material Request":
- item_details.update({
- "qty": d.planned_qty
- })
- item_dict[(d.item_code, d.material_request_item, d.warehouse)] = item_details
return item_dict
@@ -293,11 +293,12 @@
"""
bom_dict = {}
for d in self.get("items"):
- if self.plan_using == "Sales Order":
- bom_dict.setdefault(d.bom_no, []).append({d.sales_order: flt(d.planned_qty)})
- elif self.plan_using == "Material Request":
- bom_dict.setdefault(d.bom_no, []).append({d.material_request_item: flt(d.planned_qty)})
-
+ if self.get_items_from == "Material Request":
+ bom_dict.setdefault(d.bom_no, []).append([d.material_request_item, flt(d.planned_qty)])
+ else:
+ bom_dict.setdefault(d.bom_no, []).append([d.sales_order, flt(d.planned_qty)])
+ return bom_dict
+
def download_raw_materials(self):
""" Create csv data for required raw material to produce finished goods"""
self.validate_data()
@@ -341,7 +342,6 @@
and item.is_stock_item = 1
group by item_code""", bom, as_dict=1):
bom_wise_item_details.setdefault(d.item_code, d)
-
for item, item_details in bom_wise_item_details.items():
for so_qty in so_wise_qty:
item_list.append([item, flt(item_details.qty) * so_qty[1], item_details.description,
@@ -405,7 +405,7 @@
for item_details in so_item_qty:
if requested_qty:
sales_order = item_details[4] or "No Sales Order"
- if self.plan_using == "Material Request":
+ if self.get_items_from == "Material Request":
sales_order = "No Sales Order"
if requested_qty <= item_details[0]:
adjusted_qty = requested_qty