Merge branch 'master' of github.com:webnotes/erpnext

This commit is contained in:
Nabin Hait 2013-07-26 11:01:43 +05:30
commit d23e5c8a9a
53 changed files with 200 additions and 147 deletions

View File

@ -58,6 +58,7 @@ class DocType(BuyingController):
self.check_for_acc_head_of_supplier() self.check_for_acc_head_of_supplier()
self.check_for_stopped_status() self.check_for_stopped_status()
self.validate_with_previous_doc() self.validate_with_previous_doc()
self.validate_uom_is_integer("uom", "qty")
if not self.doc.is_opening: if not self.doc.is_opening:
self.doc.is_opening = 'No' self.doc.is_opening = 'No'

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-21 16:16:39", "creation": "2013-05-21 16:16:39",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-24 21:44:41", "modified": "2013-07-25 16:08:44",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -69,21 +69,6 @@
"report_hide": 0, "report_hide": 0,
"reqd": 1 "reqd": 1
}, },
{
"description": "Supplier (Payable) Account",
"doctype": "DocField",
"fieldname": "credit_to",
"fieldtype": "Link",
"in_filter": 1,
"label": "Credit To",
"oldfieldname": "credit_to",
"oldfieldtype": "Link",
"options": "Account",
"print_hide": 1,
"read_only": 0,
"reqd": 1,
"search_index": 1
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "supplier", "fieldname": "supplier",
@ -675,6 +660,21 @@
"print_hide": 1, "print_hide": 1,
"read_only": 0 "read_only": 0
}, },
{
"description": "Supplier (Payable) Account",
"doctype": "DocField",
"fieldname": "credit_to",
"fieldtype": "Link",
"in_filter": 1,
"label": "Credit To",
"oldfieldname": "credit_to",
"oldfieldtype": "Link",
"options": "Account",
"print_hide": 1,
"read_only": 0,
"reqd": 1,
"search_index": 1
},
{ {
"default": "No", "default": "No",
"description": "Considered as Opening Balance", "description": "Considered as Opening Balance",

View File

@ -120,6 +120,7 @@ erpnext.accounts.SalesInvoiceController = erpnext.selling.SellingController.exte
} }
// TODO toggle display of fields // TODO toggle display of fields
cur_frm.cscript.hide_fields(this.frm.doc);
}, },
debit_to: function() { debit_to: function() {
@ -162,7 +163,7 @@ $.extend(cur_frm.cscript, new erpnext.accounts.SalesInvoiceController({frm: cur_
// Hide Fields // Hide Fields
// ------------ // ------------
cur_frm.cscript.hide_fields = function(doc, cdt, cdn) { cur_frm.cscript.hide_fields = function(doc) {
par_flds = ['project_name', 'due_date', 'is_opening', 'conversion_rate', par_flds = ['project_name', 'due_date', 'is_opening', 'conversion_rate',
'source', 'total_advance', 'gross_profit', 'source', 'total_advance', 'gross_profit',
'gross_profit_percent', 'get_advances_received', 'gross_profit_percent', 'get_advances_received',
@ -176,18 +177,21 @@ cur_frm.cscript.hide_fields = function(doc, cdt, cdn) {
if(cint(doc.is_pos) == 1) { if(cint(doc.is_pos) == 1) {
hide_field(par_flds); hide_field(par_flds);
unhide_field('payments_section'); unhide_field('payments_section');
for(f in item_flds_normal) cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_normal[f], false); cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_normal, false);
} else { } else {
hide_field('payments_section'); hide_field('payments_section');
unhide_field(par_flds); unhide_field(par_flds);
for(f in item_flds_normal) cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_normal[f], true); cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_normal, true);
} }
for(f in item_flds_pos) cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_pos[f], (cint(doc.update_stock)==1?true:false));
cur_frm.fields_dict['entries'].grid.set_column_disp(item_flds_pos, (cint(doc.update_stock)==1?true:false));
// India related fields // India related fields
var cp = wn.control_panel; var cp = wn.control_panel;
if (cp.country == 'India') unhide_field(['c_form_applicable', 'c_form_no']); if (cp.country == 'India') unhide_field(['c_form_applicable', 'c_form_no']);
else hide_field(['c_form_applicable', 'c_form_no']); else hide_field(['c_form_applicable', 'c_form_no']);
cur_frm.refresh_fields();
} }

View File

@ -60,6 +60,8 @@ class DocType(SellingController):
self.so_dn_required() self.so_dn_required()
self.validate_proj_cust() self.validate_proj_cust()
self.validate_with_previous_doc() self.validate_with_previous_doc()
self.validate_uom_is_integer("stock_uom", "qty")
sales_com_obj = get_obj('Sales Common') sales_com_obj = get_obj('Sales Common')
sales_com_obj.check_stop_sales_order(self) sales_com_obj.check_stop_sales_order(self)
sales_com_obj.check_active_sales_items(self) sales_com_obj.check_active_sales_items(self)

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-24 19:29:05", "creation": "2013-05-24 19:29:05",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-24 21:44:15", "modified": "2013-07-25 16:08:10",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -61,21 +61,6 @@
"read_only": 0, "read_only": 0,
"reqd": 1 "reqd": 1
}, },
{
"description": "Customer (Receivable) Account",
"doctype": "DocField",
"fieldname": "debit_to",
"fieldtype": "Link",
"in_filter": 1,
"label": "Debit To",
"oldfieldname": "debit_to",
"oldfieldtype": "Link",
"options": "Account",
"print_hide": 1,
"read_only": 0,
"reqd": 1,
"search_index": 1
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "customer", "fieldname": "customer",
@ -821,6 +806,21 @@
"print_hide": 1, "print_hide": 1,
"read_only": 0 "read_only": 0
}, },
{
"description": "Customer (Receivable) Account",
"doctype": "DocField",
"fieldname": "debit_to",
"fieldtype": "Link",
"in_filter": 1,
"label": "Debit To",
"oldfieldname": "debit_to",
"oldfieldtype": "Link",
"options": "Account",
"print_hide": 1,
"read_only": 0,
"reqd": 1,
"search_index": 1
},
{ {
"description": "Track this Sales Invoice against any Project", "description": "Track this Sales Invoice against any Project",
"doctype": "DocField", "doctype": "DocField",

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-06-04 11:02:19", "creation": "2013-06-04 11:02:19",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:19", "modified": "2013-07-25 16:32:10",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -107,9 +107,10 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_list_view": 0, "in_list_view": 0,
"label": "UOM", "label": "UOM",
"options": "UOM",
"read_only": 1 "read_only": 1
}, },
{ {

View File

@ -90,7 +90,6 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
freeze: true, freeze: true,
callback: function(r) { callback: function(r) {
if(!r.exc) { if(!r.exc) {
me.frm.refresh_fields();
if(me.frm.doc.price_list_name !== price_list_name) me.price_list_name(); if(me.frm.doc.price_list_name !== price_list_name) me.price_list_name();
} }
} }
@ -485,12 +484,12 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
// toggle columns // toggle columns
var item_grid = this.frm.fields_dict[this.fname].grid; var item_grid = this.frm.fields_dict[this.fname].grid;
var show = this.frm.doc.currency != company_currency; var fieldnames = $.map(["purchase_rate", "purchase_ref_rate", "amount", "rate"], function(fname) {
$.each(["purchase_rate", "purchase_ref_rate", "amount", "rate"], function(i, fname) { return wn.meta.get_docfield(item_grid.doctype, fname, me.frm.docname) ? fname : null;
if(wn.meta.get_docfield(item_grid.doctype, fname))
item_grid.set_column_disp(fname, show);
}); });
item_grid.set_column_disp(fieldnames, this.frm.doc.currency != company_currency);
// set labels // set labels
var $wrapper = $(this.frm.wrapper); var $wrapper = $(this.frm.wrapper);
$.each(field_label_map, function(fname, label) { $.each(field_label_map, function(fname, label) {

View File

@ -58,6 +58,9 @@ class DocType(BuyingController):
pc_obj.get_prevdoc_date(self) pc_obj.get_prevdoc_date(self)
self.check_for_stopped_status(pc_obj) self.check_for_stopped_status(pc_obj)
self.validate_uom_is_integer("uom", "qty")
self.validate_uom_is_integer("stock_uom", ["qty", "required_qty"])
self.validate_with_previous_doc() self.validate_with_previous_doc()
self.validate_for_subcontracting() self.validate_for_subcontracting()
self.update_raw_materials_supplied("po_raw_material_details") self.update_raw_materials_supplied("po_raw_material_details")

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-24 19:29:06", "creation": "2013-05-24 19:29:06",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:14", "modified": "2013-07-25 16:32:51",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -265,12 +265,13 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"hidden": 0, "hidden": 0,
"in_list_view": 0, "in_list_view": 0,
"label": "Stock UOM", "label": "Stock UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"print_hide": 1, "print_hide": 1,
"print_width": "100px", "print_width": "100px",
"read_only": 1, "read_only": 1,

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-02-22 01:27:42", "creation": "2013-02-22 01:27:42",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:15", "modified": "2013-07-25 16:33:05",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "dhanalekshmi@webnotestech.com" "owner": "dhanalekshmi@webnotestech.com"
}, },
@ -111,10 +111,11 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"label": "Stock Uom", "label": "Stock Uom",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"read_only": 1 "read_only": 1
} }
] ]

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-02-22 01:27:42", "creation": "2013-02-22 01:27:42",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:17", "modified": "2013-07-25 16:34:11",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "wasim@webnotestech.com" "owner": "wasim@webnotestech.com"
}, },
@ -130,10 +130,11 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"label": "Stock Uom", "label": "Stock Uom",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"read_only": 1 "read_only": 1
}, },
{ {

View File

@ -36,6 +36,7 @@ class DocType(BuyingController):
self.validate_common() self.validate_common()
self.validate_with_previous_doc() self.validate_with_previous_doc()
self.validate_uom_is_integer("uom", "qty")
def on_submit(self): def on_submit(self):
purchase_controller = webnotes.get_obj("Purchase Common") purchase_controller = webnotes.get_obj("Purchase Common")

View File

@ -20,7 +20,7 @@ from webnotes import _, msgprint
from webnotes.utils import flt, cint, today, cstr from webnotes.utils import flt, cint, today, cstr
from setup.utils import get_company_currency, get_price_list_currency from setup.utils import get_company_currency, get_price_list_currency
from accounts.utils import get_fiscal_year, validate_fiscal_year from accounts.utils import get_fiscal_year, validate_fiscal_year
from utilities.transaction_base import TransactionBase, validate_conversion_rate from utilities.transaction_base import TransactionBase, validate_conversion_rate, validate_uom_is_integer
import json import json
class AccountsController(TransactionBase): class AccountsController(TransactionBase):
@ -28,7 +28,6 @@ class AccountsController(TransactionBase):
self.set_missing_values(for_validate=True) self.set_missing_values(for_validate=True)
self.validate_date_with_fiscal_year() self.validate_date_with_fiscal_year()
if self.meta.get_field("currency"): if self.meta.get_field("currency"):
self.calculate_taxes_and_totals() self.calculate_taxes_and_totals()
self.validate_value("grand_total", ">=", 0) self.validate_value("grand_total", ">=", 0)

View File

@ -43,6 +43,10 @@ class DocType:
def validate(self): def validate(self):
self.clear_operations() self.clear_operations()
self.validate_main_item() self.validate_main_item()
from utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self.doclist, "stock_uom", "qty")
self.validate_operations() self.validate_operations()
self.validate_materials() self.validate_materials()
self.set_bom_material_details() self.set_bom_material_details()

View File

@ -36,7 +36,7 @@ test_records = [
"qty": 1.0, "qty": 1.0,
"rate": 5000.0, "rate": 5000.0,
"amount": 5000.0, "amount": 5000.0,
"stock_uom": "No." "stock_uom": "_Test UOM"
}, },
{ {
"doctype": "BOM Item", "doctype": "BOM Item",
@ -45,7 +45,7 @@ test_records = [
"qty": 2.0, "qty": 2.0,
"rate": 1000.0, "rate": 1000.0,
"amount": 2000.0, "amount": 2000.0,
"stock_uom": "No." "stock_uom": "_Test UOM"
} }
] ]
] ]

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-02-22 01:27:49", "creation": "2013-02-22 01:27:49",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-22 15:28:20", "modified": "2013-07-25 16:34:42",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -75,11 +75,12 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_list_view": 0, "in_list_view": 0,
"label": "Stock UOM", "label": "Stock UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"read_only": 1, "read_only": 1,
"reqd": 1 "reqd": 1
}, },

View File

@ -23,8 +23,6 @@ from webnotes import msgprint
sql = webnotes.conn.sql sql = webnotes.conn.sql
class DocType: class DocType:
def __init__(self, doc, doclist=[]): def __init__(self, doc, doclist=[]):
self.doc = doc self.doc = doc
@ -58,6 +56,9 @@ class DocType:
self.validate_production_order_against_so() self.validate_production_order_against_so()
from utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self.doclist, "stock_uom", ["qty", "produced_qty"])
def validate_production_order_against_so(self): def validate_production_order_against_so(self):
# already ordered qty # already ordered qty

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-10 16:34:16", "creation": "2013-01-10 16:34:16",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-11 15:51:37", "modified": "2013-07-25 16:38:37",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -35,6 +35,7 @@
"permlevel": 0, "permlevel": 0,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Manufacturing User",
"submit": 1, "submit": 1,
"write": 1 "write": 1
}, },
@ -219,10 +220,11 @@
"depends_on": "production_item", "depends_on": "production_item",
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"label": "Stock UOM", "label": "Stock UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"read_only": 1 "read_only": 1
}, },
{ {
@ -247,15 +249,6 @@
"read_only": 1 "read_only": 1
}, },
{ {
"doctype": "DocPerm", "doctype": "DocPerm"
"role": "System Manager"
},
{
"doctype": "DocPerm",
"role": "Manufacturing Manager"
},
{
"doctype": "DocPerm",
"role": "Manufacturing User"
} }
] ]

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-02-22 01:27:49", "creation": "2013-02-22 01:27:49",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:12", "modified": "2013-07-25 16:35:27",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -92,11 +92,12 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_list_view": 0, "in_list_view": 0,
"label": "UOM", "label": "UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"print_width": "80px", "print_width": "80px",
"read_only": 1, "read_only": 1,
"reqd": 1, "reqd": 1,

View File

@ -185,6 +185,9 @@ class DocType:
self.validate_company() self.validate_company()
self.validate_data() self.validate_data()
from utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self.doclist, "stock_uom", "planned_qty")
items = self.get_distinct_items_and_boms()[1] items = self.get_distinct_items_and_boms()[1]
pro = self.create_production_order(items) pro = self.create_production_order(items)
if pro: if pro:

View File

@ -209,8 +209,7 @@ $(document).bind('form_refresh', function() {
if(fort=='fields') { if(fort=='fields') {
hide_field(pscript.feature_dict[sys_feat][cur_frm.doc.doctype][fort]); hide_field(pscript.feature_dict[sys_feat][cur_frm.doc.doctype][fort]);
} else if(cur_frm.fields_dict[fort]) { } else if(cur_frm.fields_dict[fort]) {
for(grid_field in pscript.feature_dict[sys_feat][cur_frm.doc.doctype][fort]) cur_frm.fields_dict[fort].grid.set_column_disp(pscript.feature_dict[sys_feat][cur_frm.doc.doctype][fort], false);
cur_frm.fields_dict[fort].grid.set_column_disp(pscript.feature_dict[sys_feat][cur_frm.doc.doctype][fort][grid_field], false);
} else { } else {
msgprint('Grid "'+fort+'" does not exists'); msgprint('Grid "'+fort+'" does not exists');
} }

View File

@ -81,9 +81,6 @@ erpnext.selling.InstallationNote = wn.ui.form.Controller.extend({
this.frm.call({ this.frm.call({
doc: this.frm.doc, doc: this.frm.doc,
method: "set_customer_defaults", method: "set_customer_defaults",
callback: function(r) {
if(!r.exc) me.frm.refresh_fields();
}
}); });
// TODO shift this to depends_on // TODO shift this to depends_on
@ -105,9 +102,6 @@ erpnext.selling.InstallationNote = wn.ui.form.Controller.extend({
}, },
method: "get_customer_address", method: "get_customer_address",
freeze: true, freeze: true,
callback: function(r) {
me.frm.refresh_fields();
}
}); });
} }
}, },

View File

@ -89,9 +89,6 @@ erpnext.selling.Opportunity = wn.ui.form.Controller.extend({
this.frm.call({ this.frm.call({
doc: this.frm.doc, doc: this.frm.doc,
method: "set_customer_defaults", method: "set_customer_defaults",
callback: function(r) {
if(!r.exc) me.frm.refresh_fields();
}
}); });
// TODO shift this to depends_on // TODO shift this to depends_on
@ -208,7 +205,6 @@ cur_frm.cscript['Declare Opportunity Lost'] = function(){
return; return;
} }
dialog.hide(); dialog.hide();
cur_frm.refresh();
}, },
btn: this btn: this
}) })

View File

@ -24,6 +24,7 @@ from webnotes import msgprint
sql = webnotes.conn.sql sql = webnotes.conn.sql
from utilities.transaction_base import TransactionBase from utilities.transaction_base import TransactionBase
class DocType(TransactionBase): class DocType(TransactionBase):
def __init__(self,doc,doclist): def __init__(self,doc,doclist):
self.doc = doc self.doc = doc
@ -138,6 +139,7 @@ class DocType(TransactionBase):
def validate(self): def validate(self):
self.set_last_contact_date() self.set_last_contact_date()
self.validate_item_details() self.validate_item_details()
self.validate_uom_is_integer("uom", "qty")
self.validate_lead_cust() self.validate_lead_cust()
from accounts.utils import validate_fiscal_year from accounts.utils import validate_fiscal_year

View File

@ -135,6 +135,9 @@ class DocType(SellingController):
self.set_last_contact_date() self.set_last_contact_date()
self.validate_order_type() self.validate_order_type()
self.validate_for_items() self.validate_for_items()
self.validate_uom_is_integer("stock_uom", "qty")
sales_com_obj = get_obj('Sales Common') sales_com_obj = get_obj('Sales Common')
sales_com_obj.check_active_sales_items(self) sales_com_obj.check_active_sales_items(self)
sales_com_obj.validate_max_discount(self,'quotation_details') sales_com_obj.validate_max_discount(self,'quotation_details')

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-03-07 11:42:57", "creation": "2013-03-07 11:42:57",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:18", "modified": "2013-07-25 16:35:50",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -110,11 +110,12 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_list_view": 0, "in_list_view": 0,
"label": "UOM", "label": "UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"print_hide": 0, "print_hide": 0,
"print_width": "100px", "print_width": "100px",
"read_only": 1, "read_only": 1,

View File

@ -31,6 +31,9 @@ class DocType:
self.check_duplicate() self.check_duplicate()
self.validate_main_item() self.validate_main_item()
from utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self.doclist, "uom", "qty")
def validate_main_item(self): def validate_main_item(self):
"""main item must have Is Stock Item as No and Is Sales Item as Yes""" """main item must have Is Stock Item as No and Is Sales Item as Yes"""
if not webnotes.conn.sql("""select name from tabItem where name=%s and if not webnotes.conn.sql("""select name from tabItem where name=%s and

View File

@ -142,7 +142,6 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
freeze: true, freeze: true,
callback: function(r) { callback: function(r) {
if(!r.exc) { if(!r.exc) {
me.frm.refresh_fields();
(me.frm.doc.price_list_name !== price_list_name) ? (me.frm.doc.price_list_name !== price_list_name) ?
me.price_list_name() : me.price_list_name() :
me.price_list_currency(); me.price_list_currency();

View File

@ -139,6 +139,7 @@ class DocType(SellingController):
self.validate_mandatory() self.validate_mandatory()
self.validate_proj_cust() self.validate_proj_cust()
self.validate_po() self.validate_po()
self.validate_uom_is_integer("stock_uom", "qty")
if self.doc.docstatus == 1: if self.doc.docstatus == 1:
self.validate_for_items() self.validate_for_items()

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-03-07 11:42:58", "creation": "2013-03-07 11:42:58",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:21", "modified": "2013-07-25 16:36:10",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -104,12 +104,13 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"hidden": 0, "hidden": 0,
"in_list_view": 0, "in_list_view": 0,
"label": "UOM", "label": "UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"print_width": "70px", "print_width": "70px",
"read_only": 1, "read_only": 1,
"reqd": 0, "reqd": 0,

View File

@ -256,7 +256,7 @@ def create_territories():
if name and not webnotes.conn.exists("Territory", name): if name and not webnotes.conn.exists("Territory", name):
webnotes.bean({ webnotes.bean({
"doctype": "Territory", "doctype": "Territory",
"territory_name": name, "territory_name": name.replace("'", ""),
"parent_territory": root_territory, "parent_territory": root_territory,
"is_group": "No" "is_group": "No"
}).insert() }).insert()

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-10 16:34:24", "creation": "2013-01-10 16:34:24",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-23 12:03:54", "modified": "2013-07-25 16:18:17",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -23,6 +23,7 @@
"permlevel": 0 "permlevel": 0
}, },
{ {
"amend": 0,
"doctype": "DocPerm", "doctype": "DocPerm",
"name": "__common__", "name": "__common__",
"parent": "UOM", "parent": "UOM",
@ -30,7 +31,8 @@
"parenttype": "DocType", "parenttype": "DocType",
"permlevel": 0, "permlevel": 0,
"read": 1, "read": 1,
"report": 1 "report": 1,
"submit": 0
}, },
{ {
"doctype": "DocType", "doctype": "DocType",
@ -62,34 +64,31 @@
"reqd": 1 "reqd": 1
}, },
{ {
"amend": 0, "description": "Check this to disallow fractions. (for Nos)",
"doctype": "DocField",
"fieldname": "must_be_whole_number",
"fieldtype": "Check",
"label": "Must be Whole Number"
},
{
"cancel": 1, "cancel": 1,
"create": 1, "create": 1,
"doctype": "DocPerm", "doctype": "DocPerm",
"role": "Material Master Manager", "role": "Material Master Manager",
"submit": 0,
"write": 1 "write": 1
}, },
{ {
"amend": 0,
"cancel": 0, "cancel": 0,
"create": 0, "create": 0,
"doctype": "DocPerm", "doctype": "DocPerm",
"role": "Material Manager", "role": "Material Manager",
"submit": 0,
"write": 0 "write": 0
}, },
{ {
"amend": 0,
"cancel": 0, "cancel": 0,
"create": 0, "create": 0,
"doctype": "DocPerm", "doctype": "DocPerm",
"role": "Material User", "role": "Material User",
"submit": 0,
"write": 0 "write": 0
},
{
"doctype": "DocPerm",
"role": "All"
} }
] ]

View File

@ -151,12 +151,12 @@ def import_defaults():
{'doctype': 'Sales Person', 'sales_person_name': 'Sales Team', 'is_group': "Yes", "parent_sales_person": ""}, {'doctype': 'Sales Person', 'sales_person_name': 'Sales Team', 'is_group': "Yes", "parent_sales_person": ""},
# UOM # UOM
{'uom_name': 'Unit', 'doctype': 'UOM', 'name': 'Unit'}, {'uom_name': 'Unit', 'doctype': 'UOM', 'name': 'Unit', "must_be_whole_number": 1},
{'uom_name': 'Box', 'doctype': 'UOM', 'name': 'Box'}, {'uom_name': 'Box', 'doctype': 'UOM', 'name': 'Box', "must_be_whole_number": 1},
{'uom_name': 'Kg', 'doctype': 'UOM', 'name': 'Kg'}, {'uom_name': 'Kg', 'doctype': 'UOM', 'name': 'Kg'},
{'uom_name': 'Nos', 'doctype': 'UOM', 'name': 'Nos'}, {'uom_name': 'Nos', 'doctype': 'UOM', 'name': 'Nos', "must_be_whole_number": 1},
{'uom_name': 'Pair', 'doctype': 'UOM', 'name': 'Pair'}, {'uom_name': 'Pair', 'doctype': 'UOM', 'name': 'Pair', "must_be_whole_number": 1},
{'uom_name': 'Set', 'doctype': 'UOM', 'name': 'Set'}, {'uom_name': 'Set', 'doctype': 'UOM', 'name': 'Set', "must_be_whole_number": 1},
{'uom_name': 'Hour', 'doctype': 'UOM', 'name': 'Hour'}, {'uom_name': 'Hour', 'doctype': 'UOM', 'name': 'Hour'},
{'uom_name': 'Minute', 'doctype': 'UOM', 'name': 'Minute'}, {'uom_name': 'Minute', 'doctype': 'UOM', 'name': 'Minute'},
] ]

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-10 16:34:25", "creation": "2013-01-10 16:34:25",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 18:32:13", "modified": "2013-07-25 16:36:35",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -146,11 +146,12 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_filter": 1, "in_filter": 1,
"label": "UOM", "label": "UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"search_index": 0 "search_index": 0
}, },
{ {

View File

@ -46,8 +46,7 @@ erpnext.stock.DeliveryNoteController = erpnext.selling.SellingController.extend(
// unhide expense_account and cost_center is auto_inventory_accounting enabled // unhide expense_account and cost_center is auto_inventory_accounting enabled
var aii_enabled = cint(sys_defaults.auto_inventory_accounting) var aii_enabled = cint(sys_defaults.auto_inventory_accounting)
cur_frm.fields_dict[cur_frm.cscript.fname].grid.set_column_disp("expense_account", aii_enabled); cur_frm.fields_dict[cur_frm.cscript.fname].grid.set_column_disp(["expense_account", "cost_center"], aii_enabled);
cur_frm.fields_dict[cur_frm.cscript.fname].grid.set_column_disp("cost_center", aii_enabled);
if (this.frm.doc.docstatus===0) { if (this.frm.doc.docstatus===0) {
cur_frm.add_custom_button(wn._('From Sales Order'), cur_frm.add_custom_button(wn._('From Sales Order'),

View File

@ -99,6 +99,7 @@ class DocType(SellingController):
sales_com_obj.get_prevdoc_date(self) sales_com_obj.get_prevdoc_date(self)
self.validate_for_items() self.validate_for_items()
self.validate_warehouse() self.validate_warehouse()
self.validate_uom_is_integer("stock_uom", "qty")
sales_com_obj.validate_max_discount(self, 'delivery_note_details') sales_com_obj.validate_max_discount(self, 'delivery_note_details')
sales_com_obj.check_conversion_rate(self) sales_com_obj.check_conversion_rate(self)

View File

@ -141,7 +141,7 @@ test_records = [
"export_rate": 100.0, "export_rate": 100.0,
"amount": 500.0, "amount": 500.0,
"warehouse": "_Test Warehouse - _TC", "warehouse": "_Test Warehouse - _TC",
"stock_uom": "No." "stock_uom": "_Test UOM"
} }
] ]

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-04-22 13:15:44", "creation": "2013-04-22 13:15:44",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:07", "modified": "2013-07-25 16:37:09",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -111,11 +111,12 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_list_view": 0, "in_list_view": 0,
"label": "UOM", "label": "UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"print_hide": 0, "print_hide": 0,
"print_width": "50px", "print_width": "50px",
"read_only": 1, "read_only": 1,

View File

@ -60,6 +60,7 @@ class DocType(BuyingController):
super(DocType, self).validate() super(DocType, self).validate()
self.validate_schedule_date() self.validate_schedule_date()
self.validate_uom_is_integer("uom", "qty")
if not self.doc.status: if not self.doc.status:
self.doc.status = "Draft" self.doc.status = "Draft"

View File

@ -37,6 +37,10 @@ class DocType:
self.validate_case_nos() self.validate_case_nos()
self.validate_qty() self.validate_qty()
from utilities.transaction_base import validate_uom_is_integer
validate_uom_is_integer(self.doclist, "stock_uom", "qty")
validate_uom_is_integer(self.doclist, "weight_uom", "net_weight")
def validate_delivery_note(self): def validate_delivery_note(self):
""" """
Validates if delivery note has status as draft Validates if delivery note has status as draft

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-04-08 13:10:16", "creation": "2013-04-08 13:10:16",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:11", "modified": "2013-07-25 16:37:30",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -61,9 +61,10 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_list_view": 0, "in_list_view": 0,
"label": "UOM", "label": "UOM",
"options": "UOM",
"print_width": "100px", "print_width": "100px",
"read_only": 1, "read_only": 1,
"width": "100px" "width": "100px"

View File

@ -120,7 +120,10 @@ class DocType(BuyingController):
self.validate_with_previous_doc() self.validate_with_previous_doc()
self.validate_accepted_rejected_qty() self.validate_accepted_rejected_qty()
self.validate_inspection() # Validate Inspection self.validate_inspection()
self.validate_uom_is_integer("uom", ["qty", "received_qty"])
self.validate_uom_is_integer("stock_uom", "stock_qty")
get_obj('Stock Ledger').validate_serial_no(self, 'purchase_receipt_details') get_obj('Stock Ledger').validate_serial_no(self, 'purchase_receipt_details')
self.validate_challan_no() self.validate_challan_no()

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-05-24 19:29:10", "creation": "2013-05-24 19:29:10",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 14:54:16", "modified": "2013-07-25 16:30:24",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -267,11 +267,12 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"in_list_view": 0, "in_list_view": 0,
"label": "Stock UOM", "label": "Stock UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"print_hide": 1, "print_hide": 1,
"print_width": "100px", "print_width": "100px",
"read_only": 1, "read_only": 1,

View File

@ -49,6 +49,9 @@ class DocType(StockController):
get_obj('Production Order', self.doc.production_order) or None get_obj('Production Order', self.doc.production_order) or None
self.validate_item() self.validate_item()
self.validate_uom_is_integer("uom", "qty")
self.validate_uom_is_integer("stock_uom", "transfer_qty")
self.validate_warehouse(pro_obj) self.validate_warehouse(pro_obj)
self.validate_production_order(pro_obj) self.validate_production_order(pro_obj)
self.get_stock_and_rate() self.get_stock_and_rate()

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-29 19:25:42", "creation": "2013-01-29 19:25:42",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-10 18:34:09", "modified": "2013-07-25 16:39:10",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -181,10 +181,11 @@
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "stock_uom", "fieldname": "stock_uom",
"fieldtype": "Data", "fieldtype": "Link",
"label": "Stock UOM", "label": "Stock UOM",
"oldfieldname": "stock_uom", "oldfieldname": "stock_uom",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"options": "UOM",
"print_width": "150px", "print_width": "150px",
"read_only": 1, "read_only": 1,
"width": "150px" "width": "150px"

View File

@ -17,7 +17,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes.utils import cstr, flt, now from webnotes.utils import cstr, flt, now, cint
from webnotes.model import db_exists from webnotes.model import db_exists
from webnotes.model.bean import copy_doclist from webnotes.model.bean import copy_doclist
from webnotes.model.code import get_obj from webnotes.model.code import get_obj
@ -25,8 +25,6 @@ from webnotes import msgprint
sql = webnotes.conn.sql sql = webnotes.conn.sql
class DocType: class DocType:
def __init__(self, d, dl=[]): def __init__(self, d, dl=[]):
self.doc, self.doclist = d,dl self.doc, self.doclist = d,dl
@ -97,6 +95,7 @@ class DocType:
def update_stock_uom(self): def update_stock_uom(self):
# validate mandatory # validate mandatory
self.validate_mandatory() self.validate_mandatory()
self.validate_uom_integer_type()
# update item master # update item master
self.update_item_master() self.update_item_master()
@ -109,6 +108,19 @@ class DocType:
get_obj("Item", self.doc.item_code).on_update() get_obj("Item", self.doc.item_code).on_update()
def validate_uom_integer_type(self):
current_is_integer = webnotes.conn.get_value("UOM", self.doc.current_stock_uom, "must_be_whole_number")
new_is_integer = webnotes.conn.get_value("UOM", self.doc.new_stock_uom, "must_be_whole_number")
if current_is_integer and not new_is_integer:
webnotes.msgprint("New UOM must be of type Whole Number", raise_exception=True)
if not current_is_integer and new_is_integer:
webnotes.msgprint("New UOM must NOT be of type Whole Number", raise_exception=True)
if current_is_integer and new_is_integer and cint(self.doc.conversion_factor)!=self.doc.conversion_factor:
webnotes.msgprint("Conversion Factor cannot be fraction", raise_exception=True)
@webnotes.whitelist() @webnotes.whitelist()
def get_stock_uom(item_code): def get_stock_uom(item_code):
return { 'current_stock_uom': cstr(webnotes.conn.get_value('Item', item_code, 'stock_uom')) } return { 'current_stock_uom': cstr(webnotes.conn.get_value('Item', item_code, 'stock_uom')) }

View File

@ -2,7 +2,7 @@
{ {
"creation": "2013-01-10 16:34:30", "creation": "2013-01-10 16:34:30",
"docstatus": 0, "docstatus": 0,
"modified": "2013-07-05 14:56:45", "modified": "2013-07-25 17:39:14",
"modified_by": "Administrator", "modified_by": "Administrator",
"owner": "Administrator" "owner": "Administrator"
}, },
@ -62,6 +62,12 @@
"label": "New Stock UOM", "label": "New Stock UOM",
"options": "UOM" "options": "UOM"
}, },
{
"doctype": "DocField",
"fieldname": "conversion_factor",
"fieldtype": "Float",
"label": "Conversion Factor"
},
{ {
"doctype": "DocField", "doctype": "DocField",
"fieldname": "update", "fieldname": "update",
@ -69,12 +75,6 @@
"label": "Update", "label": "Update",
"options": "update_stock_uom" "options": "update_stock_uom"
}, },
{
"doctype": "DocField",
"fieldname": "conversion_factor",
"fieldtype": "Float",
"label": "Conversion Factor"
},
{ {
"doctype": "DocPerm", "doctype": "DocPerm",
"role": "Material Master Manager" "role": "Material Master Manager"

View File

@ -29,9 +29,6 @@ erpnext.support.CustomerIssue = wn.ui.form.Controller.extend({
this.frm.call({ this.frm.call({
doc: this.frm.doc, doc: this.frm.doc,
method: "set_customer_defaults", method: "set_customer_defaults",
callback: function(r) {
if(!r.exc) me.frm.refresh_fields();
}
}); });
// TODO shift this to depends_on // TODO shift this to depends_on

View File

@ -47,9 +47,6 @@ erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
this.frm.call({ this.frm.call({
doc: this.frm.doc, doc: this.frm.doc,
method: "set_customer_defaults", method: "set_customer_defaults",
callback: function(r) {
if(!r.exc) me.frm.refresh_fields();
}
}); });
} }
}, },

View File

@ -65,9 +65,6 @@ erpnext.support.MaintenanceVisit = wn.ui.form.Controller.extend({
this.frm.call({ this.frm.call({
doc: this.frm.doc, doc: this.frm.doc,
method: "set_customer_defaults", method: "set_customer_defaults",
callback: function(r) {
if(!r.exc) me.frm.refresh_fields();
}
}); });
// TODO shift this to depends_on // TODO shift this to depends_on

View File

@ -26,9 +26,6 @@ erpnext.support.CustomerIssue = wn.ui.form.Controller.extend({
this.frm.call({ this.frm.call({
doc: this.frm.doc, doc: this.frm.doc,
method: "set_customer_defaults", method: "set_customer_defaults",
callback: function(r) {
if(!r.exc) me.frm.refresh_fields();
}
}); });
} }
} }

View File

@ -17,7 +17,7 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import webnotes import webnotes
from webnotes import msgprint, _ from webnotes import msgprint, _
from webnotes.utils import load_json, cstr, flt, now_datetime from webnotes.utils import load_json, cstr, flt, now_datetime, cint
from webnotes.model.doc import addchild from webnotes.model.doc import addchild
from controllers.status_updater import StatusUpdater from controllers.status_updater import StatusUpdater
@ -292,6 +292,9 @@ class TransactionBase(StatusUpdater):
webnotes.bean(event_doclist).insert() webnotes.bean(event_doclist).insert()
def validate_uom_is_integer(self, uom_field, qty_fields):
validate_uom_is_integer(self.doclist, uom_field, qty_fields)
def validate_with_previous_doc(self, source_dt, ref): def validate_with_previous_doc(self, source_dt, ref):
for key, val in ref.items(): for key, val in ref.items():
is_child = val.get("is_child_table") is_child = val.get("is_child_table")
@ -498,3 +501,23 @@ def validate_currency(args, item, meta=None):
def delete_events(ref_type, ref_name): def delete_events(ref_type, ref_name):
webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent` webnotes.delete_doc("Event", webnotes.conn.sql_list("""select name from `tabEvent`
where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True) where ref_type=%s and ref_name=%s""", (ref_type, ref_name)), for_reload=True)
def validate_uom_is_integer(doclist, uom_field, qty_fields):
if isinstance(qty_fields, basestring):
qty_fields = [qty_fields]
integer_uoms = filter(lambda uom: webnotes.conn.get_value("UOM", uom,
"must_be_whole_number") or None, doclist.get_distinct_values(uom_field))
if not integer_uoms:
return
for d in doclist:
if d.fields.get(uom_field) in integer_uoms:
for f in qty_fields:
if d.fields.get(f):
if cint(d.fields[f])!=d.fields[f]:
webnotes.msgprint(_("For UOM") + " '" + d.fields[uom_field] \
+ "': " + _("Quantity cannot be a fraction.") \
+ " " + _("In Row") + ": " + str(d.idx),
raise_exception=True)