From d11e9d66195eeb6e9f91ac58b1438437d5cf9df4 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 16 Jan 2013 16:51:58 +0530 Subject: [PATCH] removed time_to_ampm and time_to_hhmm function --- .../production_planning_tool.py | 90 ++++++++++++++++--- .../production_planning_tool.txt | 48 ++++++---- .../maintenance_visit_list.js | 5 +- utilities/page/calendar/calendar.js | 13 +-- 4 files changed, 113 insertions(+), 43 deletions(-) diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py index adc80918e1..fa08789b91 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, get_defaults +from webnotes.utils import cstr, flt, nowdate from webnotes.model.doc import addchild, Document from webnotes.model.wrapper import getlist from webnotes.model.code import get_obj @@ -210,7 +210,7 @@ class DocType: "wip_warehouse" : "", "fg_warehouse" : "", "status" : "Draft", - "fiscal_year" : get_defaults()["fiscal_year"] + "fiscal_year" : webnotes.conn.get_default("fiscal_year") } return bom_dict, item_dict @@ -239,18 +239,22 @@ class DocType: return self.get_csv() def get_raw_materials(self, bom_dict): - """ Get raw materials considering sub-assembly items """ + """ Get raw materials considering sub-assembly items + { + "item_code": [qty_required, description, stock_uom] + } + """ for bom in bom_dict: if self.doc.use_multi_level_bom: # get all raw materials with sub assembly childs fl_bom_items = sql(""" select item_code,ifnull(sum(qty_consumed_per_unit),0)*%s as qty, - description, stock_uom + description, stock_uom, min_order_qty from ( select distinct fb.name, fb.description, fb.item_code, - fb.qty_consumed_per_unit, fb.stock_uom + fb.qty_consumed_per_unit, fb.stock_uom, it.min_order_qty from `tabBOM Explosion Item` fb,`tabItem` it where it.name = fb.item_code and ifnull(it.is_pro_applicable, 'No') = 'No' @@ -263,18 +267,21 @@ class DocType: # Get all raw materials considering SA items as raw materials, # so no childs of SA items fl_bom_items = sql(""" - select item_code, ifnull(sum(qty_consumed_per_unit), 0) * '%s', - description, stock_uom - from `tabBOM Item` - where parent = '%s' and docstatus < 2 + select bom_item.item_code, + ifnull(sum(bom_item.qty_consumed_per_unit), 0) * %s, + bom_item.description, bom_item.stock_uom, item.min_order_qty + from `tabBOM Item` bom_item, tabItem item + where bom_item.parent = %s and bom_item.docstatus < 2 + and bom_item.item_code = item.name group by item_code - """ % (flt(bom_dict[bom]), bom)) + """, (flt(bom_dict[bom]), bom)) self.make_items_dict(fl_bom_items) def make_items_dict(self, item_list): for i in item_list: - self.item_dict[i[0]] = [(flt(self.item_dict.get(i[0], [0])[0]) + flt(i[1])), i[2], i[3]] + self.item_dict[i[0]] = [(flt(self.item_dict.get(i[0], [0])[0]) + flt(i[1])), + i[2], i[3], i[4]] def get_csv(self): @@ -291,4 +298,63 @@ class DocType: if item_qty: item_list.append(['', '', '', '', 'Total', i_qty, o_qty, a_qty]) - return item_list \ No newline at end of file + 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) + + item_dict = self.get_raw_materials() + item_projected_qty = _get_projected_qty(item_dict.keys()) + + from accounts.utils import get_fiscal_year + fiscal_year = get_fiscal_year(nowdate()) + + items_to_be_requested = [] + for item in item_dict: + if flt(item_dict[item][0]) > item_projected_qty[item]: + # shortage + requested_qty = flt(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) + + 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 diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.txt b/manufacturing/doctype/production_planning_tool/production_planning_tool.txt index dd7acfdb14..7eb0a2da11 100644 --- a/manufacturing/doctype/production_planning_tool/production_planning_tool.txt +++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.txt @@ -2,9 +2,9 @@ { "owner": "jai@webnotestech.com", "docstatus": 0, - "creation": "2012-12-14 10:15:16", + "creation": "2013-01-16 14:48:56", "modified_by": "Administrator", - "modified": "2012-12-14 11:37:40" + "modified": "2013-01-16 15:46:26" }, { "read_only": 1, @@ -28,8 +28,10 @@ "parent": "Production Planning Tool", "read": 1, "create": 1, + "submit": 0, "doctype": "DocPerm", "write": 1, + "report": 0, "parenttype": "DocType", "permlevel": 0, "parentfield": "permissions" @@ -68,9 +70,9 @@ { "doctype": "DocField", "label": "Company", + "reqd": 1, "fieldname": "company", "fieldtype": "Link", - "reqd": 1, "options": "Company" }, { @@ -154,10 +156,19 @@ "fieldtype": "Section Break", "options": "Simple" }, + { + "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.", + "default": "1", + "doctype": "DocField", + "label": "Use Multi-Level BOM", + "reqd": 0, + "fieldname": "use_multi_level_bom", + "fieldtype": "Check" + }, { "doctype": "DocField", "width": "50%", - "fieldname": "column_break5", + "fieldname": "cb5", "fieldtype": "Column Break" }, { @@ -170,18 +181,9 @@ }, { "doctype": "DocField", - "width": "50%", - "fieldname": "column_break6", - "fieldtype": "Column Break" - }, - { - "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.", - "default": "1", - "doctype": "DocField", - "label": "Use Multi-Level BOM", - "fieldname": "use_multi_level_bom", - "fieldtype": "Check", - "reqd": 0 + "fieldname": "sb5", + "fieldtype": "Section Break", + "options": "Simple" }, { "description": "Download a report containing all raw materials with their latest inventory status", @@ -191,8 +193,18 @@ "fieldtype": "Button" }, { - "role": "System Manager", - "doctype": "DocPerm" + "doctype": "DocField", + "width": "50%", + "fieldname": "column_break6", + "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": "Raise Purchase Request", + "fieldname": "raise_purchase_request", + "fieldtype": "Button", + "options": "raise_purchase_request" }, { "role": "Manufacturing User", diff --git a/support/doctype/maintenance_visit/maintenance_visit_list.js b/support/doctype/maintenance_visit/maintenance_visit_list.js index 654f455fd0..6dc5daccb3 100644 --- a/support/doctype/maintenance_visit/maintenance_visit_list.js +++ b/support/doctype/maintenance_visit/maintenance_visit_list.js @@ -13,15 +13,12 @@ wn.doclistviews['Maintenance Visit'] = wn.views.ListView.extend({ ]); this.stats = this.stats.concat(['completion_status', 'company']); - //this.show_hide_check_column(); }, prepare_data: function(data) { this._super(data); data.mntc_date = wn.datetime.str_to_user(data.mntc_date); - data.mntc_time = wn.datetime.time_to_ampm(data.mntc_time); - data.date_time = "on " + data.mntc_date + " at " + - data.mntc_time[0] + ":" + data.mntc_time[1] + " " + data.mntc_time[2]; + data.date_time = "on " + data.mntc_date + " at " + data.mntc_time; data.customer_name = data.customer_name + " " + data.date_time; data.completion_status = data.completion_status + (data.maintenance_type ? " [" + data.maintenance_type + "]": ""); diff --git a/utilities/page/calendar/calendar.js b/utilities/page/calendar/calendar.js index d62dc68a86..5e59f1f4c8 100644 --- a/utilities/page/calendar/calendar.js +++ b/utilities/page/calendar/calendar.js @@ -94,13 +94,11 @@ Calendar.prototype.show_event = function(ev, cal_ev) { d.onshow = function() { // heading var c = me.selected_date; - var tmp = time_to_ampm(this.ev.event_hour); - tmp = tmp[0]+':'+tmp[1]+' '+tmp[2]; this.widgets['Heading'].innerHTML = '
' + erpnext.calendar.weekdays[c.getDay()] + ', ' + c.getDate() + ' ' + month_list_full[c.getMonth()] + ' ' + c.getFullYear() - + ' - '+tmp+'
'; + + ' - '+this.ev.event_hour+''; // set this.widgets['Description'].value = cstr(this.ev.description); @@ -175,7 +173,7 @@ Calendar.prototype.add_event = function() { ev = locals['Event'][ev]; ev.event_date = dateutil.obj_to_str(this.selected_date); - ev.event_hour = this.selected_hour+':00'; + ev.event_hour = this.selected_hour+':00:00'; ev.event_type = 'Private'; this.show_event(ev); @@ -447,8 +445,7 @@ Calendar.DayView.prototype.create_table = function() { for(var j=0;j<2;j++) { var cell = r.insertCell(j); if(j==0) { - var tmp = time_to_ampm((i)+':00'); - cell.innerHTML = tmp[0]+':'+tmp[1]+' '+tmp[2]; + cell.innerHTML = i+':00:00'; $w(cell, '10%'); } else { cell.viewunit = new Calendar.DayViewUnit(cell); @@ -510,9 +507,7 @@ Calendar.WeekView.prototype.create_table = function() { for(var j=0;j<8;j++) { var cell = r.insertCell(j); if(j==0) { - var tmp = time_to_ampm(i+':00'); - cell.innerHTML = tmp[0]+':'+tmp[1]+' '+tmp[2]; - + cell.innerHTML = i+':00:00'; $w(cell, '10%'); } else { cell.viewunit = new Calendar.WeekViewUnit(cell);