removed time_to_ampm and time_to_hhmm function
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index adc8091..fa08789 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 @@
"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 @@
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 @@
# 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 @@
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 dd7acfd..7eb0a2d 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"
},
{
@@ -155,9 +157,18 @@
"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 654f455..6dc5dac 100644
--- a/support/doctype/maintenance_visit/maintenance_visit_list.js
+++ b/support/doctype/maintenance_visit/maintenance_visit_list.js
@@ -13,15 +13,12 @@
]);
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 d62dc68..5e59f1f 100644
--- a/utilities/page/calendar/calendar.js
+++ b/utilities/page/calendar/calendar.js
@@ -94,13 +94,11 @@
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 =
'<div style="text-align: center; padding:4px; font-size: 14px">'
+ erpnext.calendar.weekdays[c.getDay()] + ', ' + c.getDate() + ' ' + month_list_full[c.getMonth()] + ' ' + c.getFullYear()
- + ' - <b>'+tmp+'</b></div>';
+ + ' - <b>'+this.ev.event_hour+'</b></div>';
// set
this.widgets['Description'].value = cstr(this.ev.description);
@@ -175,7 +173,7 @@
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 @@
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 @@
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);