From 2678ed181a04a76934e075fe3d1e5f6734e172fc Mon Sep 17 00:00:00 2001 From: Akhilesh Darjee Date: Wed, 18 Dec 2013 13:28:40 +0530 Subject: [PATCH] [fix] [issue] webnotes/erpnext#1191 - set expected delivery date in production order --- .../production_order/production_order.js | 86 ++++++++++--------- .../production_order/production_order.py | 24 +++--- .../production_order/production_order.txt | 10 ++- .../production_planning_tool.py | 1 - patches/patch_list.py | 1 + setup/page/setup_wizard/setup_wizard.py | 4 + 6 files changed, 74 insertions(+), 52 deletions(-) diff --git a/manufacturing/doctype/production_order/production_order.js b/manufacturing/doctype/production_order/production_order.js index 2277262fd28..31900ea57af 100644 --- a/manufacturing/doctype/production_order/production_order.js +++ b/manufacturing/doctype/production_order/production_order.js @@ -1,28 +1,56 @@ // Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors // License: GNU General Public License v3. See license.txt -cur_frm.cscript.onload = function(doc, dt, dn) { - if (!doc.status) doc.status = 'Draft'; - cfn_set_fields(doc, dt, dn); -} +$.extend(cur_frm.cscript, { + onload: function (doc, dt, dn) { -cur_frm.cscript.refresh = function(doc, dt, dn) { - cur_frm.dashboard.reset(); - erpnext.hide_naming_series(); - cur_frm.set_intro(""); - cfn_set_fields(doc, dt, dn); + if (!doc.status) doc.status = 'Draft'; + cfn_set_fields(doc, dt, dn); - if(doc.docstatus===0 && !doc.__islocal) { - cur_frm.set_intro(wn._("Submit this Production Order for further processing.")); - } else if(doc.docstatus===1) { - var percent = flt(doc.produced_qty) / flt(doc.qty) * 100; - cur_frm.dashboard.add_progress(cint(percent) + "% " + wn._("Complete"), percent); + this.frm.add_fetch("sales_order", "delivery_date", "expected_delivery_date"); + }, - if(doc.status === "Stopped") { - cur_frm.dashboard.set_headline_alert(wn._("Stopped"), "alert-danger", "icon-stop"); + refresh: function(doc, dt, dn) { + this.frm.dashboard.reset(); + erpnext.hide_naming_series(); + this.frm.set_intro(""); + cfn_set_fields(doc, dt, dn); + + if (doc.docstatus === 0 && !doc.__islocal) { + this.frm.set_intro(wn._("Submit this Production Order for further processing.")); + } else if (doc.docstatus === 1) { + var percent = flt(doc.produced_qty) / flt(doc.qty) * 100; + this.frm.dashboard.add_progress(cint(percent) + "% " + wn._("Complete"), percent); + + if(doc.status === "Stopped") { + this.frm.dashboard.set_headline_alert(wn._("Stopped"), "alert-danger", "icon-stop"); + } } + }, + + production_item: function(doc) { + return this.frm.call({ + method: "get_item_details", + args: { item: doc.production_item } + }); + }, + + make_se: function(purpose) { + var me = this; + + wn.call({ + method:"manufacturing.doctype.production_order.production_order.make_stock_entry", + args: { + "production_order_id": me.frm.doc.name, + "purpose": purpose + }, + callback: function(r) { + var doclist = wn.model.sync(r.message); + wn.set_route("Form", doclist[0].doctype, doclist[0].name); + } + }); } -} +}); var cfn_set_fields = function(doc, dt, dn) { if (doc.docstatus == 1) { @@ -38,13 +66,6 @@ var cfn_set_fields = function(doc, dt, dn) { } } -cur_frm.cscript.production_item = function(doc) { - return cur_frm.call({ - method: "get_item_details", - args: { item: doc.production_item } - }); -} - cur_frm.cscript['Stop Production Order'] = function() { var doc = cur_frm.doc; var check = confirm(wn._("Do you really want to stop production order: " + doc.name)); @@ -57,7 +78,7 @@ cur_frm.cscript['Unstop Production Order'] = function() { var doc = cur_frm.doc; var check = confirm(wn._("Do really want to unstop production order: " + doc.name)); if (check) - return $c_obj(make_doclist(doc.doctype, doc.name), 'stop_unstop', 'Unstopped', function(r, rt) {cur_frm.refresh();}); + return $c_obj(make_doclist(doc.doctype, doc.name), 'stop_unstop', 'Unstopped', function(r, rt) {cur_frm.refresh();}); } cur_frm.cscript['Transfer Raw Materials'] = function() { @@ -68,20 +89,6 @@ cur_frm.cscript['Update Finished Goods'] = function() { cur_frm.cscript.make_se('Manufacture/Repack'); } -cur_frm.cscript.make_se = function(purpose) { - wn.call({ - method:"manufacturing.doctype.production_order.production_order.make_stock_entry", - args: { - "production_order_id": cur_frm.doc.name, - "purpose": purpose - }, - callback: function(r) { - var doclist = wn.model.sync(r.message); - wn.set_route("Form", doclist[0].doctype, doclist[0].name); - } - }) -} - cur_frm.fields_dict['production_item'].get_query = function(doc) { return { filters:[ @@ -98,7 +105,6 @@ cur_frm.fields_dict['project_name'].get_query = function(doc, dt, dn) { } } - cur_frm.set_query("bom_no", function(doc) { if (doc.production_item) { return{ diff --git a/manufacturing/doctype/production_order/production_order.py b/manufacturing/doctype/production_order/production_order.py index c5b2b04791e..bcb13f8a226 100644 --- a/manufacturing/doctype/production_order/production_order.py +++ b/manufacturing/doctype/production_order/production_order.py @@ -8,7 +8,6 @@ from webnotes.utils import cstr, flt, nowdate from webnotes.model.code import get_obj from webnotes import msgprint, _ - class OverProductionError(webnotes.ValidationError): pass class DocType: @@ -37,15 +36,20 @@ class DocType: and is_active=1 and item=%s""" , (self.doc.bom_no, self.doc.production_item), as_dict =1) if not bom: - msgprint("""Incorrect BOM: %s entered. + webnotes.throw("""Incorrect BOM: %s entered. May be BOM not exists or inactive or not submitted - or for some other item.""" % cstr(self.doc.bom_no), raise_exception=1) + or for some other item.""" % cstr(self.doc.bom_no)) def validate_sales_order(self): if self.doc.sales_order: - if not webnotes.conn.sql("""select name from `tabSales Order` - where name=%s and docstatus = 1""", self.doc.sales_order): - msgprint("Sales Order: %s is not valid" % self.doc.sales_order, raise_exception=1) + so = webnotes.conn.sql("""select name, delivery_date from `tabSales Order` + where name=%s and docstatus = 1""", self.doc.sales_order, as_dict=1)[0] + + if not so.name: + webnotes.throw("Sales Order: %s is not valid" % self.doc.sales_order) + + if not self.doc.expected_delivery_date: + self.doc.expected_delivery_date = so.delivery_date self.validate_production_order_against_so() @@ -76,11 +80,11 @@ class DocType: so_qty = flt(so_item_qty) + flt(dnpi_qty) if total_qty > so_qty: - webnotes.msgprint(_("Total production order qty for item") + ": " + + webnotes.throw(_("Total production order qty for item") + ": " + cstr(self.doc.production_item) + _(" against sales order") + ": " + cstr(self.doc.sales_order) + _(" will be ") + cstr(total_qty) + ", " + _("which is greater than sales order qty ") + "(" + cstr(so_qty) + ")" + - _("Please reduce qty."), raise_exception=OverProductionError) + _("Please reduce qty."), exc=OverProductionError) def stop_unstop(self, status): """ Called from client side on Stop/Unstop event""" @@ -114,8 +118,8 @@ class DocType: stock_entry = webnotes.conn.sql("""select name from `tabStock Entry` where production_order = %s and docstatus = 1""", self.doc.name) if stock_entry: - msgprint("""Submitted Stock Entry %s exists against this production order. - Hence can not be cancelled.""" % stock_entry[0][0], raise_exception=1) + webnotes.throw("""Submitted Stock Entry %s exists against this production order. + Hence can not be cancelled.""" % stock_entry[0][0]) webnotes.conn.set(self.doc,'status', 'Cancelled') self.update_planned_qty(-self.doc.qty) diff --git a/manufacturing/doctype/production_order/production_order.txt b/manufacturing/doctype/production_order/production_order.txt index 85c7c838818..5e76c0e18f3 100644 --- a/manufacturing/doctype/production_order/production_order.txt +++ b/manufacturing/doctype/production_order/production_order.txt @@ -2,7 +2,7 @@ { "creation": "2013-01-10 16:34:16", "docstatus": 0, - "modified": "2013-11-02 14:05:44", + "modified": "2013-12-18 13:22:14", "modified_by": "Administrator", "owner": "Administrator" }, @@ -136,6 +136,14 @@ "oldfieldtype": "Currency", "read_only": 1 }, + { + "depends_on": "sales_order", + "doctype": "DocField", + "fieldname": "expected_delivery_date", + "fieldtype": "Date", + "label": "Expected Delivery Date", + "read_only": 1 + }, { "doctype": "DocField", "fieldname": "warehouses", diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py index c1185a1b128..29232f5f519 100644 --- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py +++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py @@ -186,7 +186,6 @@ class DocType: else : msgprint(_("No Production Order created.")) - def get_distinct_items_and_boms(self): """ Club similar BOM and item for processing bom_dict { diff --git a/patches/patch_list.py b/patches/patch_list.py index 9400e08872e..1e5f1dee0f0 100644 --- a/patches/patch_list.py +++ b/patches/patch_list.py @@ -258,4 +258,5 @@ patch_list = [ "execute:webnotes.delete_doc('Report', 'Stock Ledger') #2013-11-29", "execute:webnotes.delete_doc('Report', 'Payment Collection With Ageing')", "execute:webnotes.delete_doc('Report', 'Payment Made With Ageing')", + "execute:webnotes.delete_doc('DocType', 'Warehouse Type')", ] \ No newline at end of file diff --git a/setup/page/setup_wizard/setup_wizard.py b/setup/page/setup_wizard/setup_wizard.py index bf149059a1a..e431b2ad5e2 100644 --- a/setup/page/setup_wizard/setup_wizard.py +++ b/setup/page/setup_wizard/setup_wizard.py @@ -158,6 +158,10 @@ def set_defaults(args): hr_settings.doc.emp_created_by = "Naming Series" hr_settings.save() + email_settings = webnotes.bean("Email Settings") + email_settings.doc.send_print_in_body_and_attachment = 1 + email_settings.save() + # control panel cp = webnotes.doc("Control Panel", "Control Panel") cp.company_name = args["company_name"]