automatic purchase request from production planning tool
diff --git a/manufacturing/doctype/production_plan_item/production_plan_item.txt b/manufacturing/doctype/production_plan_item/production_plan_item.txt
index 6ae2a04..2cb2a59 100644
--- a/manufacturing/doctype/production_plan_item/production_plan_item.txt
+++ b/manufacturing/doctype/production_plan_item/production_plan_item.txt
@@ -2,9 +2,9 @@
{
"owner": "Administrator",
"docstatus": 0,
- "creation": "2012-12-20 18:14:55",
+ "creation": "2013-01-16 14:48:56",
"modified_by": "Administrator",
- "modified": "2012-12-24 19:37:34"
+ "modified": "2013-01-17 11:21:46"
},
{
"istable": 1,
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index fa08789..a6c8458 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -16,7 +16,7 @@
from __future__ import unicode_literals
import webnotes
-from webnotes.utils import cstr, flt, nowdate
+from webnotes.utils import cstr, flt, cint, nowdate, add_days
from webnotes.model.doc import addchild, Document
from webnotes.model.wrapper import getlist
from webnotes.model.code import get_obj
@@ -275,7 +275,6 @@
and bom_item.item_code = item.name
group by item_code
""", (flt(bom_dict[bom]), bom))
-
self.make_items_dict(fl_bom_items)
def make_items_dict(self, item_list):
@@ -301,60 +300,82 @@
return item_list
def raise_purchase_request(self):
- def _get_projected_qty(items):
- item_projected_qty = webnotes.conn.sql("""select item_code, sum(projected_qty)
- from `tabBin` where item_code in (%s) group by item_code""" %
- (", ".join(["%s"]*len(items)),), tuple(items))
-
- return dict(item_projected_qty)
+ """
+ Raise Purchase Request if projected qty is less than qty required
+ Requested qty should be shortage qty considering minimum order qty
+ """
+ if not self.doc.purchase_request_for_warehouse:
+ webnotes.msgprint("Please enter Warehouse for which Purchase Request will be raised",
+ raise_exception=1)
- item_dict = self.get_raw_materials()
- item_projected_qty = _get_projected_qty(item_dict.keys())
+ bom_dict = self.get_distinct_items_and_boms()[0]
+ self.get_raw_materials(bom_dict)
+ item_projected_qty = self.get_projected_qty()
from accounts.utils import get_fiscal_year
- fiscal_year = get_fiscal_year(nowdate())
+ fiscal_year = get_fiscal_year(nowdate())[0]
- items_to_be_requested = []
- for item in item_dict:
- if flt(item_dict[item][0]) > item_projected_qty[item]:
+ items_to_be_requested = webnotes._dict()
+ for item in self.item_dict:
+ if flt(self.item_dict[item][0]) > item_projected_qty[item]:
# shortage
- requested_qty = flt(item_dict[item][0]) - item_projected_qty[item]
+ requested_qty = flt(self.item_dict[item][0]) - item_projected_qty[item]
# comsider minimum order qty
- requested_qty = requested_qty > flt(item_dict[item][3]) and \
- requested_qty or flt(item_dict[item][3])
- items_to_be_requested.append({
- "item_code": item,
- "qty": requested_qty,
- "description": item_dict[item][1],
- "stock_uom": item_dict[item][2]
- })
- webnotes.errprint(items_to_be_requested)
- self.insert_purchase_request(items_to_be_requested, fiscal_year)
+ requested_qty = requested_qty > flt(self.item_dict[item][3]) and \
+ requested_qty or flt(self.item_dict[item][3])
+ items_to_be_requested[item] = requested_qty
- def insert_purchase_request(self, items, fiscal_year):
- for item in items:
- item_wrapper = webnotes.model_wrapper("Item", args.item_code)
- pr = [
- {
- "doctype": "Purchase Request",
- "naming_series": "IDT",
- "transaction_date": nowdate(),
- "status": "Draft",
- "company": self.doc.company,
- "fiscal_year": fiscal_year,
- "requested_by": webnotes.session.user,
- "remark": "Automatically raised from Production Planning Tool"
- },
- {
- "doctype": "Purchase Request Item",
- "item_code": item.item_code,
- "item_name": item_wrapper.doc.item_name,
- "description": item.description,
- "uom": item.stock_uom,
- "item_group": item_wrapper.doc.item_group,
- "brand": item_wrapper.doc.brand,
- "qty": item.qty,
-
-
- }
- ]
\ No newline at end of file
+ self.insert_purchase_request(items_to_be_requested, fiscal_year)
+
+ def get_projected_qty(self):
+ items = self.item_dict.keys()
+ item_projected_qty = webnotes.conn.sql("""select item_code, sum(projected_qty)
+ from `tabBin` where item_code in (%s) group by item_code""" %
+ (", ".join(["%s"]*len(items)),), tuple(items))
+
+ return dict(item_projected_qty)
+
+ def insert_purchase_request(self, items_to_be_requested, fiscal_year):
+ purchase_request_list = []
+ if items_to_be_requested:
+ for item in items_to_be_requested:
+ item_wrapper = webnotes.model_wrapper("Item", item)
+ pr_doclist = [
+ {
+ "doctype": "Purchase Request",
+ "__islocal": 1,
+ "naming_series": "IDT",
+ "transaction_date": nowdate(),
+ "status": "Draft",
+ "company": self.doc.company,
+ "fiscal_year": fiscal_year,
+ "requested_by": webnotes.session.user,
+ "remark": "Automatically raised from Production Planning Tool"
+ },
+ {
+ "doctype": "Purchase Request Item",
+ "__islocal": 1,
+ "parentfield": "indent_details",
+ "item_code": item,
+ "item_name": item_wrapper.doc.item_name,
+ "description": item_wrapper.doc.description,
+ "uom": item_wrapper.doc.stock_uom,
+ "item_group": item_wrapper.doc.item_group,
+ "brand": item_wrapper.doc.brand,
+ "qty": items_to_be_requested[item],
+ "schedule_date": add_days(nowdate(), cint(item_wrapper.doc.lead_time_days)),
+ "warehouse": self.doc.purchase_request_for_warehouse
+ }
+ ]
+ pr_wrapper = webnotes.model_wrapper(pr_doclist)
+ pr_wrapper.ignore_permissions = 1
+ pr_wrapper.submit()
+ purchase_request_list.append(pr_wrapper.doc.name)
+
+ if purchase_request_list:
+ pur_req = ["""<a href="#Form/Purchase Request/%s" target="_blank">%s</a>""" % \
+ (p, p) for p in purchase_request_list]
+ webnotes.msgprint("Following Purchase Request created successfully: \n%s" %
+ "\n".join(pur_req))
+ else:
+ webnotes.msgprint("Nothing to request")
\ No newline at end of file
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.txt b/manufacturing/doctype/production_planning_tool/production_planning_tool.txt
index 7eb0a2d..d4a0d94 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.txt
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.txt
@@ -4,7 +4,7 @@
"docstatus": 0,
"creation": "2013-01-16 14:48:56",
"modified_by": "Administrator",
- "modified": "2013-01-16 15:46:26"
+ "modified": "2013-01-17 11:39:55"
},
{
"read_only": 1,
@@ -199,7 +199,14 @@
"fieldtype": "Column Break"
},
{
- "description": "Raise Purchase Request automatically for items which are \"Out of Stock\" considering already requested, already ordered qty and minimum order qty",
+ "doctype": "DocField",
+ "label": "Purchase Request For Warehouse",
+ "fieldname": "purchase_request_for_warehouse",
+ "fieldtype": "Link",
+ "options": "Warehouse"
+ },
+ {
+ "description": "Items to be requested which are \"Out of Stock\" considering all warehouses based on projected qty and minimum order qty",
"doctype": "DocField",
"label": "Raise Purchase Request",
"fieldname": "raise_purchase_request",