Merge branch 'develop'

This commit is contained in:
Pratik Vyas 2013-12-19 11:42:38 +05:30
commit 605cc93c90
11 changed files with 87 additions and 67 deletions

View File

@ -1,6 +1,6 @@
{
"app_name": "ERPNext",
"app_version": "3.3.2",
"app_version": "3.3.3",
"base_template": "app/portal/templates/base.html",
"modules": {
"Accounts": {

View File

@ -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{

View File

@ -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)

View File

@ -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",

View File

@ -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 {

View File

@ -13,11 +13,9 @@ def execute():
return
# no default company
company = webnotes.conn.get_default("company")
if not company:
company = webnotes.conn.sql_list("select name from `tabCompany`")
if company:
company = company[0]
company = webnotes.conn.sql_list("select name from `tabCompany`")
if company:
company = company[0]
if not company:
return
@ -31,4 +29,4 @@ def execute():
"recipient_list": "\n".join(system_managers),
"scheduler_errors": 1
})
edigest.insert()
edigest.insert()

View File

@ -261,4 +261,5 @@ patch_list = [
"execute:webnotes.delete_doc('Report', 'Payment Made With Ageing')",
"patches.1311.p07_scheduler_errors_digest",
"patches.1311.p08_email_digest_recipients",
"execute:webnotes.delete_doc('DocType', 'Warehouse Type')",
]

View File

@ -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"]

View File

@ -123,14 +123,14 @@ class DocType(DocListController, WebsiteGenerator):
msgprint("'Has Serial No' can not be 'Yes' for non-stock item", raise_exception=1)
def check_for_active_boms(self):
if self.doc.is_active != "Yes" or self.doc.is_purchase_item != "Yes":
if self.doc.is_purchase_item != "Yes":
bom_mat = webnotes.conn.sql("""select distinct t1.parent
from `tabBOM Item` t1, `tabBOM` t2 where t2.name = t1.parent
and t1.item_code =%s and ifnull(t1.bom_no, '') = '' and t2.is_active = 1
and t2.docstatus = 1 and t1.docstatus =1 """, self.doc.name)
if bom_mat and bom_mat[0][0]:
webnotes.throw(_("Item must be active and purchase item, \
webnotes.throw(_("Item must be a purchase item, \
as it is present in one or many Active BOMs"))
if self.doc.is_manufactured_item != "Yes":

View File

@ -2,7 +2,7 @@
{
"creation": "2013-02-22 01:28:02",
"docstatus": 0,
"modified": "2013-11-03 20:36:45",
"modified": "2013-12-18 14:52:02",
"modified_by": "Administrator",
"owner": "Administrator"
},
@ -219,7 +219,7 @@
"fieldname": "sales_order_no",
"fieldtype": "Link",
"label": "Sales Order No",
"no_copy": 1,
"no_copy": 0,
"options": "Sales Order",
"print_hide": 1,
"read_only": 1

View File

@ -26,10 +26,10 @@ def execute(filters=None):
def get_columns():
return ["Item Code:Link/Item:140", "Item Name::100", "Description::200",
"Brand:Link/Brand:100", "Warehouse:Link/Warehouse:120", "UOM:Link/UOM:100",
"Actual Qty:Float:100", "Planned Qty:Float:100", "Requested Qty:Float:110",
"Ordered Qty:Float:100", "Reserved Qty:Float:100", "Projected Qty:Float:100",
"Reorder Level:Float:100", "Reorder Qty:Float:100"]
"Item Group:Link/Item Group:100", "Brand:Link/Brand:100", "Warehouse:Link/Warehouse:120",
"UOM:Link/UOM:100", "Actual Qty:Float:100", "Planned Qty:Float:100",
"Requested Qty:Float:110", "Ordered Qty:Float:100", "Reserved Qty:Float:100",
"Projected Qty:Float:100", "Reorder Level:Float:100", "Reorder Qty:Float:100"]
def get_item_conditions(filters):
conditions = []