fixed conflict in setup control
diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js
index 79c15bf..75cc9e5 100644
--- a/erpnext/accounts/doctype/account/account.js
+++ b/erpnext/accounts/doctype/account/account.js
@@ -20,33 +20,39 @@
cur_frm.cscript.onload = function(doc, cdt, cdn) {
}
+cur_frm.cscript.set_breadcrumbs = function(barea) {
+ cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname);
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!Accounts Browser/Account">\
+ Chart of Accounts</a>');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!accounts-home">Accounts</a>');
+}
+
// Refresh
// -----------------------------------------
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- // read-only for root accounts
- root_acc = ['Application of Funds (Assets)','Expenses','Income','Source of Funds (Liabilities)'];
- if(inList(root_acc, doc.account_name))
- cur_frm.perm = [[1,0,0], [1,0,0]];
-
+ cur_frm.toggle_fields('account_name', doc.__islocal);
+
// hide fields if group
cur_frm.toggle_fields(['account_type', 'master_type', 'master_name', 'freeze_account',
- 'credit_days', 'credit_limit'], doc.group_or_ledger=='Ledger')
+ 'credit_days', 'credit_limit', 'tax_rate'], doc.group_or_ledger=='Ledger')
- // credit days and type if customer or supplier
- cur_frm.toggle_fields(['credit_days', 'credit_limit'],
- in_list(['Customer', 'Supplier'], doc.master_type))
+ // read-only for root accounts
+ root_acc = ['Application of Funds (Assets)','Expenses','Income','Source of Funds (Liabilities)'];
+ if(in_list(root_acc, doc.account_name)) {
+ cur_frm.perm = [[1,0,0], [1,0,0]];
+ cur_frm.set_intro("This is a root account and cannot be edited.");
+ } else {
+ // credit days and type if customer or supplier
+ cur_frm.set_intro(null);
+ cur_frm.toggle_fields(['credit_days', 'credit_limit'],
+ in_list(['Customer', 'Supplier'], doc.master_type))
- // hide tax_rate
- cur_frm.cscript.account_type(doc, cdt, cdn);
+ // hide tax_rate
+ cur_frm.cscript.account_type(doc, cdt, cdn);
- // show / hide convert buttons
- cur_frm.cscript.hide_unhide_group_ledger(doc);
-
- // back to chart of accounts
- cur_frm.add_custom_button('Back To Chart of Accounts', function() {
- wn.set_route('Accounts Browser', 'Account');
- }, 'icon-arrow-left')
-
+ // show / hide convert buttons
+ cur_frm.cscript.hide_unhide_group_ledger(doc);
+ }
}
// Fetch parent details
@@ -57,8 +63,12 @@
// Hide tax rate based on account type
// -----------------------------------------
cur_frm.cscript.account_type = function(doc, cdt, cdn) {
- cur_frm.toggle_fields(['tax_rate'], doc.account_type == 'Tax')
- cur_frm.toggle_fields(['master_type', 'master_name'], cstr(doc.account_type)=='')
+ if(doc.group_or_ledger=='Ledger') {
+ cur_frm.toggle_fields(['tax_rate'],
+ doc.account_type == 'Tax');
+ cur_frm.toggle_fields(['master_type', 'master_name'],
+ cstr(doc.account_type)=='');
+ }
}
// Hide/unhide group or ledger
@@ -76,9 +86,8 @@
// -----------------------------------------
cur_frm.cscript.convert_to_ledger = function(doc, cdt, cdn) {
$c_obj(cur_frm.get_doclist(),'convert_group_to_ledger','',function(r,rt) {
- if(r.message == 1) {
- refresh_field('group_or_ledger');
- cur_frm.cscript.hide_unhide_group_ledger(cur_frm.get_doc());
+ if(r.message == 1) {
+ cur_frm.refresh();
}
});
}
@@ -88,9 +97,7 @@
cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) {
$c_obj(cur_frm.get_doclist(),'convert_ledger_to_group','',function(r,rt) {
if(r.message == 1) {
- doc.group_or_ledger = 'Group';
- refresh_field('group_or_ledger');
- cur_frm.cscript.hide_unhide_group_ledger(cur_frm.get_doc());
+ cur_frm.refresh();
}
});
}
diff --git a/erpnext/accounts/doctype/account/account.py b/erpnext/accounts/doctype/account/account.py
index 335d47c..d4f63f4 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -43,7 +43,6 @@
self.doc.name = self.doc.account_name.strip() + ' - ' + company_abbr
# Get customer/supplier address
- # ==================================================================
def get_address(self):
add=sql("Select address from `tab%s` where name='%s'"%(self.doc.master_type,self.doc.master_name))
ret={'address':add[0][0]}
@@ -51,20 +50,17 @@
# check whether master name entered for supplier/customer
- # ==================================================================
def validate_master_name(self):
if (self.doc.master_type == 'Customer' or self.doc.master_type == 'Supplier') and not self.doc.master_name:
msgprint("Message: Please enter Master Name once the account is created.")
# Rate is mandatory for tax account
- # ==================================================================
def validate_rate_for_tax(self):
if self.doc.account_type == 'Tax' and not self.doc.tax_rate:
msgprint("Please Enter Rate", raise_exception=1)
# Fetch Parent Details and validation for account not to be created under ledger
- # ==================================================================
def validate_parent(self):
if self.doc.parent_account:
par = sql("select name, group_or_ledger, is_pl_account, debit_or_credit from tabAccount where name =%s",self.doc.parent_account)
@@ -81,13 +77,11 @@
self.doc.debit_or_credit = par[0][3]
# Account name must be unique
- # ==================================================================
def validate_duplicate_account(self):
if (self.doc.__islocal or (not self.doc.name)) and sql("select name from tabAccount where account_name=%s and company=%s", (self.doc.account_name, self.doc.company)):
msgprint("Account Name already exists, please rename", raise_exception=1)
# validate root details
- # ==================================================================
def validate_root_details(self):
#does not exists parent
if self.doc.account_name in ['Income','Source of Funds', 'Expenses','Application of Funds'] and self.doc.parent_account:
@@ -106,7 +100,6 @@
self.doc.is_pl_account = 'No'
# Convert group to ledger
- # ==================================================================
def convert_group_to_ledger(self):
if self.check_if_child_exists():
msgprint("Account: %s has existing child. You can not convert this account to ledger" % (self.doc.name), raise_exception=1)
@@ -118,28 +111,28 @@
return 1
# Convert ledger to group
- # ==================================================================
def convert_ledger_to_group(self):
if self.check_gle_exists():
- msgprint("Account with existing transaction can not be converted to group.", raise_exception=1)
+ msgprint("Account with existing transaction can not be converted to group.",
+ raise_exception=1)
+ elif self.doc.master_type or self.doc.account_type:
+ msgprint("Cannot covert to Group because Master Type or Account Type is selected.",
+ raise_exception=1)
else:
self.doc.group_or_ledger = 'Group'
self.doc.save()
return 1
# Check if any previous balance exists
- # ==================================================================
def check_gle_exists(self):
exists = sql("select name from `tabGL Entry` where account = '%s' and ifnull(is_cancelled, 'No') = 'No'" % (self.doc.name))
return exists and exists[0][0] or ''
# check if child exists
- # ==================================================================
def check_if_child_exists(self):
return sql("select name from `tabAccount` where parent_account = %s and docstatus != 2", self.doc.name)
# Update balance
- # ==================================================================
def update_balance(self, fy, period_det, flag = 1):
# update in all parents
for p in period_det:
@@ -147,7 +140,6 @@
# change parent balance
- # ==================================================================
def change_parent_bal(self):
period_det = []
fy = sql("select name from `tabFiscal Year` where if(ifnull(is_fiscal_year_closed, 'No'),ifnull(is_fiscal_year_closed, 'No'), 'No') = 'No'")
@@ -177,7 +169,6 @@
# VALIDATE
- # ==================================================================
def validate(self):
self.validate_master_name()
self.validate_rate_for_tax()
@@ -195,7 +186,6 @@
self.change_parent_bal()
# Add current fiscal year balance
- # ==================================================================
def set_year_balance(self):
p = sql("select name, start_date, end_date, fiscal_year from `tabPeriod` where docstatus != 2 and period_type in ('Month', 'Year')")
for d in p:
@@ -213,29 +203,26 @@
ac.save(1)
# Update Node Set Model
- # ==================================================================
def update_nsm_model(self):
import webnotes
import webnotes.utils.nestedset
webnotes.utils.nestedset.update_nsm(self)
# ON UPDATE
- # ==================================================================
def on_update(self):
+
# update nsm
self.update_nsm_model()
# Add curret year balance
self.set_year_balance()
# Check user role for approval process
- # ==================================================================
def get_authorized_user(self):
# Check logged-in user is authorized
if get_value('Global Defaults', None, 'credit_controller') in webnotes.user.get_roles():
return 1
# Check Credit limit for customer
- # ==================================================================
def check_credit_limit(self, account, company, tot_outstanding):
# Get credit limit
credit_limit_from = 'Customer'
@@ -252,7 +239,6 @@
% (fmt_money(tot_outstanding), account, fmt_money(credit_limit), credit_limit_from), raise_exception=1)
# Account with balance cannot be inactive
- # ==================================================================
def check_balance_before_trash(self):
if self.check_gle_exists():
msgprint("Account with existing transaction (Sales Invoice / Purchase Invoice / Journal Voucher) can not be trashed", raise_exception=1)
@@ -261,20 +247,18 @@
# get current year balance
- # ==================================================================
def get_curr_bal(self):
bal = sql("select balance from `tabAccount Balance` where period = '%s' and parent = '%s'" % (get_defaults()['fiscal_year'], self.doc.name),debug=0)
return bal and flt(bal[0][0]) or 0
# On Trash
- # ==================================================================
def on_trash(self):
# Check balance before trash
self.check_balance_before_trash()
# rebuild tree
- set(self.doc,'old_parent', '')
- self.update_nsm_model()
+ from webnotes.utils.nestedset import update_remove_node
+ update_remove_node('Account', self.doc.name)
# delete all cancelled gl entry of this account
sql("delete from `tabGL Entry` where account = %s and ifnull(is_cancelled, 'No') = 'Yes'", self.doc.name)
@@ -283,7 +267,6 @@
sql("delete from `tabAccount Balance` where account = %s", self.doc.name)
# On restore
- # ==================================================================
def on_restore(self):
# rebuild tree
self.update_nsm_model()
@@ -291,7 +274,6 @@
self.set_year_balance()
# on rename
- # ---------
def on_rename(self,newdn,olddn):
company_abbr = sql("select tc.abbr from `tabAccount` ta, `tabCompany` tc where ta.company = tc.name and ta.name=%s", olddn)[0][0]
diff --git a/erpnext/accounts/doctype/account/account.txt b/erpnext/accounts/doctype/account/account.txt
index e3ec85a..b649c9a 100644
--- a/erpnext/accounts/doctype/account/account.txt
+++ b/erpnext/accounts/doctype/account/account.txt
@@ -5,7 +5,7 @@
{
'creation': '2012-07-03 13:30:50',
'docstatus': 0,
- 'modified': '2012-07-11 09:21:01',
+ 'modified': '2012-07-11 13:58:44',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,6 +17,7 @@
'allow_trash': 1,
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'An **Account** is heading under which financial and business transactions are carried on. For example, \u201cTravel Expense\u201d is an account, \u201cCustomer Zoe\u201d, \u201cSupplier Mae\u201d are accounts. \n\n**Note:** ERPNext creates accounts for Customers and Suppliers automatically.\n\n### Groups and Ledgers\n\nThere are two main kinds of Accounts in ERPNext - Group and Ledger. Groups can have sub-groups and ledgers within them, whereas ledgers are the leaf nodes of your chart and cannot be further classified.\n\nAccounting Transactions can only be made against Ledger Accounts (not Groups)\n',
'doctype': 'DocType',
'document_type': u'Master',
'in_create': 1,
diff --git a/erpnext/accounts/doctype/budget_distribution/budget_distribution.js b/erpnext/accounts/doctype/budget_distribution/budget_distribution.js
index d7deb9a..1f72c3c 100644
--- a/erpnext/accounts/doctype/budget_distribution/budget_distribution.js
+++ b/erpnext/accounts/doctype/budget_distribution/budget_distribution.js
@@ -20,6 +20,11 @@
refresh_field('budget_distribution_details');
}
- $c('runserverobj',args={'method' : 'get_months', 'docs' : compress_doclist(make_doclist(doc.doctype, doc.name))},callback1);
+ $c('runserverobj',args={'method' : 'get_months', 'docs' :
+ compress_doclist(make_doclist(doc.doctype, doc.name))},callback1);
}
+}
+
+cur_frm.cscript.refresh = function(doc,cdt,cdn){
+ cur_frm.toggle_fields('distribution_id', doc.__islocal);
}
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/budget_distribution/budget_distribution.py b/erpnext/accounts/doctype/budget_distribution/budget_distribution.py
index 9468b60..090b8fb 100644
--- a/erpnext/accounts/doctype/budget_distribution/budget_distribution.py
+++ b/erpnext/accounts/doctype/budget_distribution/budget_distribution.py
@@ -14,31 +14,20 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Please edit this list and import only required elements
import webnotes
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, getchildren, make_autoname
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
-
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-
-# -----------------------------------------------------------------------------------------
-
+from webnotes.utils import flt
+from webnotes.model.doc import addchild
+from webnotes.model.doclist import getlist
+from webnotes import msgprint
class DocType:
def __init__(self,doc,doclist=[]):
self.doc,self.doclist = doc,doclist
def get_months(self):
- month_list = ['January','February','March','April','May','June','July','August','September','October','November','December']
+ month_list = ['January','February','March','April','May','June','July','August','September',
+ 'October','November','December']
idx =1
for m in month_list:
mnth = addchild(self.doc,'budget_distribution_details','Budget Distribution Detail',1,self.doclist)
@@ -50,9 +39,5 @@
total = 0
for d in getlist(self.doclist,'budget_distribution_details'):
total = flt(total) + flt(d.percentage_allocation)
- if total > 100:
- msgprint("Percentage Allocation should not exceed 100%.")
- raise Exception
- elif total < 100:
- msgprint("Percentage Allocation should not recede 100%.")
- raise Exception
\ No newline at end of file
+ if total != 100:
+ msgprint("Percentage Allocation should be equal to 100%%. Currently it is %s%%" % total, raise_exception=1)
diff --git a/erpnext/accounts/doctype/budget_distribution/budget_distribution.txt b/erpnext/accounts/doctype/budget_distribution/budget_distribution.txt
index ca9b869..ab8a6c8 100644
--- a/erpnext/accounts/doctype/budget_distribution/budget_distribution.txt
+++ b/erpnext/accounts/doctype/budget_distribution/budget_distribution.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:35:41',
+ 'creation': '2012-07-03 13:30:50',
'docstatus': 0,
- 'modified': '2012-03-27 14:35:41',
+ 'modified': '2012-07-11 14:37:30',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -15,6 +15,7 @@
'allow_trash': 1,
'autoname': u'field:distribution_id',
'colour': u'White:FFF',
+ 'description': u'**Budget Distribution** helps you distribute your budget across months if you have seasonality in your business.\n\nTo distribute a budget using this distribution, set this **Budget Distribution** in the **Cost Center**',
'doctype': 'DocType',
'module': u'Accounts',
'name': '__common__',
@@ -22,7 +23,7 @@
'section_style': u'Simple',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 24
+ 'version': 1
},
# These values are common for all DocField
@@ -108,13 +109,16 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'Name of the Budget Distribution',
'doctype': u'DocField',
'fieldname': u'distribution_id',
'fieldtype': u'Data',
- 'label': u'Distribution ID',
+ 'label': u'Distribution Name',
'oldfieldname': u'distribution_id',
'oldfieldtype': u'Data',
- 'permlevel': 0
+ 'permlevel': 0,
+ 'reqd': 1
},
# DocField
diff --git a/erpnext/accounts/doctype/budget_distribution_detail/budget_distribution_detail.txt b/erpnext/accounts/doctype/budget_distribution_detail/budget_distribution_detail.txt
index d0912be..0acfdbc 100644
--- a/erpnext/accounts/doctype/budget_distribution_detail/budget_distribution_detail.txt
+++ b/erpnext/accounts/doctype/budget_distribution_detail/budget_distribution_detail.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:35:41',
+ 'creation': '2012-07-03 13:30:47',
'docstatus': 0,
- 'modified': '2012-03-27 14:35:41',
+ 'modified': '2012-07-11 14:32:16',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -21,7 +21,7 @@
'section_style': u'Tray',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 6
+ 'version': 1
},
# These values are common for all DocField
@@ -60,16 +60,5 @@
'oldfieldname': u'percentage_allocation',
'oldfieldtype': u'Currency',
'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'aggregate_percentage',
- 'fieldtype': u'Currency',
- 'label': u'Aggregate Percentage',
- 'oldfieldname': u'aggregate_percentage',
- 'oldfieldtype': u'Currency',
- 'permlevel': 2
}
]
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.js b/erpnext/accounts/doctype/cost_center/cost_center.js
index f721e42..c131081 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.js
+++ b/erpnext/accounts/doctype/cost_center/cost_center.js
@@ -26,17 +26,25 @@
}
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- cur_frm.cscript.hide_unhide_group_ledger(doc);
- cur_frm.add_custom_button('Back To Chart of Cost Centers', function() {
- wn.set_route('Accounts Browser', 'Cost Center');
- }, 'icon-arrow-left')
+cur_frm.cscript.set_breadcrumbs = function(barea) {
+ cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname);
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!Accounts Browser/Cost Center">\
+ Chart of Cost Centers</a>');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!accounts-home">Accounts</a>');
+}
+cur_frm.cscript.refresh = function(doc, cdt, cdn) {
var intro_txt = '';
+ cur_frm.toggle_fields('cost_center_name', doc.__islocal);
+
if(!doc.__islocal && doc.group_or_ledger=='Group') {
intro_txt += '<p><b>Note:</b> This is Cost Center is a <i>Group</i>, \
Accounting Entries are not allowed against groups.</p>';
}
+
+ cur_frm.cscript.hide_unhide_group_ledger(doc);
+
+ cur_frm.toggle_fields('sb1', doc.group_or_ledger=='Ledger')
cur_frm.set_intro(intro_txt);
}
@@ -80,8 +88,7 @@
cur_frm.cscript.convert_to_ledger = function(doc, cdt, cdn) {
$c_obj(cur_frm.get_doclist(),'convert_group_to_ledger','',function(r,rt) {
if(r.message == 1) {
- refresh_field('group_or_ledger');
- cur_frm.cscript.hide_unhide_group_ledger(cur_frm.get_doc());
+ cur_frm.refresh();
}
});
}
@@ -91,8 +98,7 @@
cur_frm.cscript.convert_to_group = function(doc, cdt, cdn) {
$c_obj(cur_frm.get_doclist(),'convert_ledger_to_group','',function(r,rt) {
if(r.message == 1) {
- refresh_field('group_or_ledger');
- cur_frm.cscript.hide_unhide_group_ledger(cur_frm.get_doc());
+ cur_frm.refresh();
}
});
}
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.py b/erpnext/accounts/doctype/cost_center/cost_center.py
index 83ad9d2..3e64c29 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.py
+++ b/erpnext/accounts/doctype/cost_center/cost_center.py
@@ -14,26 +14,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Please edit this list and import only required elements
import webnotes
+from webnotes.model.doclist import getlist
+from webnotes import msgprint
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, getchildren, make_autoname
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
+from webnotes.utils.nestedset import DocTypeNestedSet
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-
-# -----------------------------------------------------------------------------------------
-
-
-class DocType:
+class DocType(DocTypeNestedSet):
def __init__(self,d,dl):
self.doc, self.doclist = d,dl
self.nsm_parent_field = 'parent_cost_center'
@@ -41,9 +28,9 @@
def autoname(self):
self.doc.name = self.doc.cost_center_name + ' - ' + self.doc.company_abbr
- #-------------------------------------------------------------------------
def get_abbr(self):
- abbr = sql("select abbr from tabCompany where company_name='%s'"%(self.doc.company_name))[0][0] or ''
+ abbr = webnotes.conn.sql("select abbr from tabCompany where company_name=%s",
+ self.doc.company_name)[0][0] or ''
ret = {
'company_abbr' : abbr
}
@@ -56,7 +43,6 @@
if self.doc.cost_center_name != 'Root' and not self.doc.parent_cost_center:
msgprint("Please enter parent cost center", raise_exception=1)
- #-------------------------------------------------------------------------
def convert_group_to_ledger(self):
if self.check_if_child_exists():
msgprint("Cost Center: %s has existing child. You can not convert this cost center to ledger" % (self.doc.name), raise_exception=1)
@@ -67,7 +53,6 @@
self.doc.save()
return 1
- #-------------------------------------------------------------------------
def convert_ledger_to_group(self):
if self.check_gle_exists():
msgprint("Cost Center with existing transaction can not be converted to group.", raise_exception=1)
@@ -76,54 +61,31 @@
self.doc.save()
return 1
- #-------------------------------------------------------------------------
def check_gle_exists(self):
- return sql("select name from `tabGL Entry` where cost_center = %s and ifnull(is_cancelled, 'No') = 'No'", (self.doc.name))
+ return webnotes.conn.sql("select name from `tabGL Entry` where cost_center = %s and \
+ ifnull(is_cancelled, 'No') = 'No'", (self.doc.name))
-
- #-------------------------------------------------------------------------
def check_if_child_exists(self):
- return sql("select name from `tabCost Center` where parent_cost_center = %s and docstatus != 2", self.doc.name)
-
+ return webnotes.conn.sql("select name from `tabCost Center` where \
+ parent_cost_center = %s and docstatus != 2", self.doc.name)
def validate_budget_details(self):
check_acc_list = []
for d in getlist(self.doclist, 'budget_details'):
+ if doc.group_or_ledger=="Group":
+ msgprint("Budget cannot be set for Group Cost Centers", raise_exception=1)
+
if [d.account, d.fiscal_year] in check_acc_list:
- msgprint("Account " + cstr(d.account) + "has been entered more than once for fiscal year " + cstr(d.fiscal_year), raise_exception=1)
+ msgprint("Account " + d.account + "has been entered more than once for fiscal year " + d.fiscal_year, raise_exception=1)
else:
check_acc_list.append([d.account, d.fiscal_year])
-
- #-------------------------------------------------------------------------
def validate(self):
"""
Cost Center name must be unique
"""
- if (self.doc.__islocal or not self.doc.name) and sql("select name from `tabCost Center` where cost_center_name = %s and company_name=%s", (self.doc.cost_center_name, self.doc.company_name)):
+ if (self.doc.__islocal or not self.doc.name) and webnotes.conn.sql("select name from `tabCost Center` where cost_center_name = %s and company_name=%s", (self.doc.cost_center_name, self.doc.company_name)):
msgprint("Cost Center Name already exists, please rename", raise_exception=1)
self.validate_mandatory()
self.validate_budget_details()
-
- #-------------------------------------------------------------------------
- def update_nsm_model(self):
- """
- update Nested Set Model
- """
- import webnotes.utils.nestedset
- webnotes.utils.nestedset.update_nsm(self)
-
- #-------------------------------------------------------------------------
- def on_update(self):
- self.update_nsm_model()
-
- # On Trash
- #-------------------------------------------------------------------------
- def on_trash(self):
- if self.check_if_child_exists():
- msgprint("Child exists for this cost center. You can not trash this account.", raise_exception=1)
-
- # rebuild tree
- set(self.doc,'old_parent', '')
- self.update_nsm_model()
diff --git a/erpnext/accounts/doctype/cost_center/cost_center.txt b/erpnext/accounts/doctype/cost_center/cost_center.txt
index aea5fbb..df65584 100644
--- a/erpnext/accounts/doctype/cost_center/cost_center.txt
+++ b/erpnext/accounts/doctype/cost_center/cost_center.txt
@@ -5,7 +5,7 @@
{
'creation': '2012-07-03 13:30:47',
'docstatus': 0,
- 'modified': '2012-07-10 18:06:51',
+ 'modified': '2012-07-11 14:41:39',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -18,6 +18,7 @@
'autoname': u'field:cost_center_name',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'**Chart of Accounts** is mainly for reporting information for governmental purposes and less for how business actually performs. \n\nMost businesses have multiple activities like different product lines, market segments, areas of business that share some common overheads but should ideally have their own structure to report whether they are profitable or not. For this purpose, there is an alternate structure, called the **Cost Centers**.\n\nA tree of **Cost Centers** to cab be designed to reflect the different units of an organization. Each Income / Expense entry is also tagged against a **Cost Center** and hence you can get Profit and Loss against a **Cost Center** too.\n\n### Budgeting\n\n**Cost Centers** can be used for budgeting purposes too. A budget can be set against each **Account** and the system will either stop, warn or ignore the budget based on the settings in the **Company** master.\n\nBudgets can also be distributed seasonally using **Budget Distribution**.',
'doctype': 'DocType',
'document_type': u'Master',
'in_create': 1,
@@ -229,7 +230,7 @@
# DocField
{
'colour': u'White:FFF',
- 'description': u'Define Budget for this Cost Center',
+ 'description': u'Define Budget for this Cost Center. To set budget action, see <a href="#!List/Company">Company Master</a>',
'doctype': u'DocField',
'fieldname': u'sb1',
'fieldtype': u'Section Break',
@@ -254,7 +255,7 @@
# DocField
{
'colour': u'White:FFF',
- 'description': u'Add rows to set budgets on Accounts. To set budget actions, see the company master.',
+ 'description': u'Add rows to set annual budgets on Accounts.',
'doctype': u'DocField',
'fieldname': u'budget_details',
'fieldtype': u'Table',
diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.js b/erpnext/accounts/doctype/fiscal_year/fiscal_year.js
index 6a03bf7..d60e4ec 100644
--- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.js
+++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.js
@@ -1,7 +1,3 @@
cur_frm.cscript.refresh = function(doc, dt, dn) {
- if (doc.__islocal) {
- hide_field(['repost_account_balances', 'repost_voucher_outstanding']);
- set_multiple(dt, dn, {'is_fiscal_year_closed': 'No'});
- }
- else unhide_field(['repost_account_balances', 'repost_voucher_outstanding']);
+ cur_frm.enable_fields('year_start_date', doc.__islocal)
}
diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.txt b/erpnext/accounts/doctype/fiscal_year/fiscal_year.txt
index ae4c5a0..68dbdb2 100644
--- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.txt
+++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:35:41',
+ 'creation': '2012-07-03 13:30:47',
'docstatus': 0,
- 'modified': '2012-03-27 14:35:41',
+ 'modified': '2012-07-11 14:56:41',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,6 +17,7 @@
'autoname': u'field:year',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'**Fiscal Year** represents a Financial Year. All accounting entries and other major transactions are tracked against **Fiscal Year**.',
'doctype': 'DocType',
'document_type': u'Master',
'module': u'Accounts',
@@ -24,7 +25,7 @@
'section_style': u'Tabbed',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 57
+ 'version': 1
},
# These values are common for all DocField
@@ -59,14 +60,14 @@
# DocPerm
{
- 'doctype': u'DocPerm'
+ 'amend': 0,
+ 'doctype': u'DocPerm',
+ 'submit': 0
},
# DocPerm
{
- 'amend': 0,
- 'doctype': u'DocPerm',
- 'submit': 0
+ 'doctype': u'DocPerm'
},
# DocField
@@ -74,7 +75,7 @@
'doctype': u'DocField',
'fieldname': u'year_details',
'fieldtype': u'Section Break',
- 'label': u'Year Details',
+ 'label': u'Fiscal Year Details',
'oldfieldtype': u'Section Break',
'permlevel': 0
},
@@ -92,6 +93,8 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'For e.g. 2012, 2012-13',
'doctype': u'DocField',
'fieldname': u'year',
'fieldtype': u'Data',
@@ -105,18 +108,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'abbreviation',
- 'fieldtype': u'Data',
- 'label': u'Abbreviation',
- 'oldfieldname': u'abbreviation',
- 'oldfieldtype': u'Data',
- 'permlevel': 0,
- 'reqd': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'year_start_date',
'fieldtype': u'Date',
'label': u'Year Start Date',
@@ -128,6 +119,9 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'default': u'No',
+ 'description': u'Entries are not allowed against this Fiscal Year if the year is closed.',
'doctype': u'DocField',
'fieldname': u'is_fiscal_year_closed',
'fieldtype': u'Select',
@@ -137,65 +131,5 @@
'options': u'\nNo\nYes',
'permlevel': 0,
'reqd': 0
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'description': u"Click on the button below to reset balances from your previous year's closing and repost your balances. You can use this if your previous year balance sheet has been changed and you wish to update your current accounts.",
- 'doctype': u'DocField',
- 'fieldname': u'repost_accounts',
- 'fieldtype': u'Section Break',
- 'label': u'Repost Accounts',
- 'oldfieldtype': u'Section Break',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'past_year',
- 'fieldtype': u'Select',
- 'label': u'Past Year',
- 'oldfieldname': u'past_year',
- 'oldfieldtype': u'Select',
- 'options': u'link:Fiscal Year',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'company',
- 'fieldtype': u'Link',
- 'in_filter': 0,
- 'label': u'Company',
- 'oldfieldname': u'company',
- 'oldfieldtype': u'Link',
- 'options': u'Company',
- 'permlevel': 0,
- 'search_index': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'repost_account_balances',
- 'fieldtype': u'Button',
- 'label': u'Repost Account Balances',
- 'oldfieldtype': u'Button',
- 'options': u'repost',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'repost_voucher_outstanding',
- 'fieldtype': u'Button',
- 'label': u'Repost Voucher Outstanding',
- 'oldfieldtype': u'Button',
- 'options': u'update_voucher_outstanding',
- 'permlevel': 0
}
]
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/gl_control/gl_control.py b/erpnext/accounts/doctype/gl_control/gl_control.py
index bfeddb0..ef8960c 100644
--- a/erpnext/accounts/doctype/gl_control/gl_control.py
+++ b/erpnext/accounts/doctype/gl_control/gl_control.py
@@ -123,6 +123,7 @@
ac.fields[d] = arg[d]
ac.old_parent = ''
ac_obj = get_obj(doc=ac)
+ ac_obj.doc.freeze_account='No'
ac_obj.validate()
ac_obj.doc.save(1)
ac_obj.on_update()
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index 734e4de..5bc2e35 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -62,7 +62,11 @@
pscript['onshow_Accounts Browser'] = function(wrapper){
// set route
var ctype = wn.get_route()[1] || 'Account';
- wrapper.appframe.title('Chart of '+ctype+'s');
+
+ wrapper.appframe.clear_breadcrumbs();
+ wrapper.appframe.add_breadcrumb('Chart of '+ctype+'s');
+ document.title = 'Chart of '+ctype+'s';
+ wrapper.appframe.add_breadcrumb(' in <a href="#!accounts-home">Accounts</a>');
if(erpnext.account_chart && erpnext.account_chart.ctype != ctype) {
wrapper.$company_select.change();
@@ -151,13 +155,12 @@
fields: [
{fieldtype:'Data', fieldname:'account_name', label:'New Account Name', reqd:true},
{fieldtype:'Select', fieldname:'group_or_ledger', label:'Group or Ledger',
- options:'Group\nLedger'},
+ options:'Group\nLedger', description:'Further accounts can be made under Groups,\
+ but entries can be made against Ledger'},
{fieldtype:'Select', fieldname:'account_type', label:'Account Type',
options: ['', 'Fixed Asset Account', 'Bank or Cash', 'Expense Account', 'Tax',
'Income Account', 'Chargeable'].join('\n') },
{fieldtype:'Float', fieldname:'tax_rate', label:'Tax Rate'},
- {fieldtype:'Select', fieldname:'master_type', label:'Master Type',
- options: ['NA', 'Supplier', 'Customer', 'Employee'].join('\n') },
{fieldtype:'Button', fieldname:'create_new', label:'Create New' }
]
})
@@ -168,11 +171,9 @@
$(fd.group_or_ledger.input).change(function() {
if($(this).val()=='Group') {
$(fd.account_type.wrapper).toggle(false);
- $(fd.master_type.wrapper).toggle(false);
$(fd.tax_rate.wrapper).toggle(false);
} else {
$(fd.account_type.wrapper).toggle(true);
- $(fd.master_type.wrapper).toggle(true);
if(fd.account_type.get_value()=='Tax') {
$(fd.tax_rate.wrapper).toggle(true);
}
@@ -197,6 +198,7 @@
var node = me.selected_node();
v.parent_account = node.data('label');
+ v.master_type = '';
v.company = me.company;
$c_obj('GL Control', 'add_ac', v,
@@ -222,10 +224,11 @@
fields: [
{fieldtype:'Data', fieldname:'cost_center_name', label:'New Cost Center Name', reqd:true},
{fieldtype:'Select', fieldname:'group_or_ledger', label:'Group or Ledger',
- options:'Group\nLedger'},
+ options:'Group\nLedger', description:'Further accounts can be made under Groups,\
+ but entries can be made against Ledger'},
{fieldtype:'Button', fieldname:'create_new', label:'Create New' }
]
- })
+ });
// create
$(d.fields_dict.create_new.input).click(function() {
diff --git a/erpnext/patches/july_2012/default_freeze_account.py b/erpnext/patches/july_2012/default_freeze_account.py
new file mode 100644
index 0000000..f5b3cc6
--- /dev/null
+++ b/erpnext/patches/july_2012/default_freeze_account.py
@@ -0,0 +1,3 @@
+def execute():
+ import webnotes
+ webnotes.conn.sql("""update tabAccount set freeze_account='No' where freeze_account is null""")
diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py
index ab95e95..6cd73cd 100644
--- a/erpnext/patches/patch_list.py
+++ b/erpnext/patches/patch_list.py
@@ -487,4 +487,9 @@
'patch_file': 'deprecate_import_data_control',
'description': "deprecate doctype - Import Data Control and page - Import Data"
},
+ {
+ 'patch_module': 'patches.july_2012',
+ 'patch_file': 'default_freeze_account',
+ 'description': "set default freeze_account as 'No' where NULL"
+ },
]
\ No newline at end of file
diff --git a/erpnext/selling/doctype/sales_common/sales_common.js b/erpnext/selling/doctype/sales_common/sales_common.js
index bf80d8f..952a55f 100644
--- a/erpnext/selling/doctype/sales_common/sales_common.js
+++ b/erpnext/selling/doctype/sales_common/sales_common.js
@@ -364,7 +364,12 @@
// ************* GET OTHER CHARGES BASED ON COMPANY *************
cur_frm.fields_dict.charge.get_query = function(doc) {
- return 'SELECT DISTINCT `tabSales Taxes and Charges Master`.name FROM `tabSales Taxes and Charges Master` WHERE `tabSales Taxes and Charges Master`.company = "'+doc.company+'" AND `tabSales Taxes and Charges Master`.company is not NULL AND `tabSales Taxes and Charges Master`.docstatus != 2 AND `tabSales Taxes and Charges Master`.%(key)s LIKE "%s" ORDER BY `tabSales Taxes and Charges Master`.name LIMIT 50';
+ return 'SELECT DISTINCT `tabSales Taxes and Charges Master`.name FROM \
+ `tabSales Taxes and Charges Master` WHERE `tabSales Taxes and Charges Master`.company = "'
+ +doc.company+'" AND `tabSales Taxes and Charges Master`.company is not NULL \
+ AND `tabSales Taxes and Charges Master`.docstatus != 2 \
+ AND `tabSales Taxes and Charges Master`.%(key)s LIKE "%s" \
+ ORDER BY `tabSales Taxes and Charges Master`.name LIMIT 50';
}
// ********************* Get Charges ****************************
diff --git a/erpnext/selling/page/sales_browser/sales_browser.js b/erpnext/selling/page/sales_browser/sales_browser.js
index 66e1d52..c98e0e4 100644
--- a/erpnext/selling/page/sales_browser/sales_browser.js
+++ b/erpnext/selling/page/sales_browser/sales_browser.js
@@ -31,7 +31,12 @@
pscript['onshow_Sales Browser'] = function(wrapper){
// set route
var ctype = wn.get_route()[1] || 'Territory';
- wrapper.appframe.title(ctype + ' Tree');
+
+ wrapper.appframe.clear_breadcrumbs();
+ wrapper.appframe.add_breadcrumb(ctype+' Tree')
+ document.title = ctype+' Tree';
+
+ wrapper.appframe.add_breadcrumb(' in <a href="#!selling-home">Selling</a>');
if(erpnext.sales_chart && erpnext.sales_chart.ctype != ctype) {
wrapper.make_tree();
diff --git a/erpnext/selling/page/selling_home/selling_home.html b/erpnext/selling/page/selling_home/selling_home.html
index 4857def..164d365 100644
--- a/erpnext/selling/page/selling_home/selling_home.html
+++ b/erpnext/selling/page/selling_home/selling_home.html
@@ -79,12 +79,17 @@
</div>
<div class="section-item">
<a class="section-link"
+ title = "Tree of item classification"
+ href="#!Sales Browser/Item Group">Item Group</a>
+ </div>
+ <div class="section-item">
+ <a class="section-link"
title = "Sales campaigns"
href="#!List/Campaign">Campaign</a>
</div>
<div class="section-item">
<a class="section-link"
- title = "Send mass SMS to your conatacts, leads and employees"
+ title = "Send mass SMS to your contacts, leads and employees"
href="#!Form/SMS Center/SMS Center">SMS Center</a>
</div>
</div>
diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py
index 11ed655..195b021 100644
--- a/erpnext/setup/doctype/company/company.py
+++ b/erpnext/setup/doctype/company/company.py
@@ -166,6 +166,8 @@
ac.fields[d] = (d == 'parent_account' and lst[self.fld_dict[d]]) and lst[self.fld_dict[d]] +' - '+ self.doc.abbr or lst[self.fld_dict[d]]
ac.old_parent = ''
ac_obj = get_obj(doc=ac)
+ ac_obj.doc.freeze_account='No'
+ ac_obj.doc.master_type = ''
ac_obj.validate()
ac_obj.doc.save(1)
ac_obj.on_update()
diff --git a/erpnext/setup/doctype/company/company.txt b/erpnext/setup/doctype/company/company.txt
index 17bd61b..3437faf 100644
--- a/erpnext/setup/doctype/company/company.txt
+++ b/erpnext/setup/doctype/company/company.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:19',
+ 'creation': '2012-07-03 13:30:55',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:19',
+ 'modified': '2012-07-11 14:43:55',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -23,7 +23,7 @@
'section_style': u'Tabbed',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 96
+ 'version': 1
},
# These values are common for all DocField
@@ -85,11 +85,11 @@
# DocField
{
- 'description': u'Please Enter Company Name and Abbr and save the document. Once saved Accounting Settings will be populated automatically',
+ 'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'details',
'fieldtype': u'Section Break',
- 'label': u'Details',
+ 'label': u'Company Details',
'oldfieldtype': u'Section Break',
'permlevel': 0
},
@@ -110,6 +110,14 @@
# DocField
{
+ 'doctype': u'DocField',
+ 'fieldname': u'cb0',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
'colour': u'White:FFF',
'description': u'Please Enter Abbreviation or Short Name properly as it will be added as Suffix to all Account Heads.',
'doctype': u'DocField',
@@ -253,6 +261,8 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'For reference only.',
'doctype': u'DocField',
'fieldname': u'company_info',
'fieldtype': u'Section Break',
diff --git a/erpnext/setup/doctype/currency/currency.js b/erpnext/setup/doctype/currency/currency.js
new file mode 100644
index 0000000..cd42c18
--- /dev/null
+++ b/erpnext/setup/doctype/currency/currency.js
@@ -0,0 +1,3 @@
+cur_frm.cscript.refresh = function(doc) {
+ cur_frm.set_intro(doc.__islocal ? "" : "There is nothing to edit.")
+}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/currency/currency.txt b/erpnext/setup/doctype/currency/currency.txt
index 5abf9c5..906e2f8 100644
--- a/erpnext/setup/doctype/currency/currency.txt
+++ b/erpnext/setup/doctype/currency/currency.txt
@@ -3,17 +3,19 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:19',
+ 'creation': '2012-07-03 13:30:55',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:19',
+ 'modified': '2012-07-11 16:11:45',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
# These values are common for all DocType
{
+ 'allow_trash': 1,
'autoname': u'field:currency_name',
'colour': u'White:FFF',
+ 'description': u'**Currency** Master',
'doctype': 'DocType',
'in_create': 0,
'module': u'Setup',
@@ -22,7 +24,7 @@
'section_style': u'Simple',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 3
+ 'version': 1
},
# These values are common for all DocField
@@ -62,8 +64,15 @@
# DocPerm
{
+ 'cancel': 1,
+ 'doctype': u'DocPerm',
+ 'role': u'Accounts Manager'
+ },
+
+ # DocPerm
+ {
'amend': 0,
- 'cancel': 0,
+ 'cancel': 1,
'doctype': u'DocPerm',
'role': u'Sales Master Manager',
'submit': 0
@@ -78,12 +87,6 @@
'submit': 0
},
- # DocPerm
- {
- 'doctype': u'DocPerm',
- 'role': u'Accounts Manager'
- },
-
# DocField
{
'doctype': u'DocField'
diff --git a/erpnext/setup/doctype/customer_group/customer_group.js b/erpnext/setup/doctype/customer_group/customer_group.js
index 11794cc..67bc293 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.js
+++ b/erpnext/setup/doctype/customer_group/customer_group.js
@@ -14,21 +14,22 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-cur_frm.cscript.onload = function(){
-
- if(doc.__islocal){
- doc.parent_customer_group = 'Root';
- refresh('parent_customer_group');
- }
+cur_frm.cscript.set_breadcrumbs = function(barea) {
+ cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname);
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!Sales Browser/Customer Group">\
+ Customer Group Tree</a>');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!selling-home">Selling</a>');
}
+
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
}
//get query select Customer Group
cur_frm.fields_dict['parent_customer_group'].get_query = function(doc,cdt,cdn) {
- return 'SELECT `tabCustomer Group`.`name`,`tabCustomer Group`.`parent_customer_group` FROM `tabCustomer Group` WHERE `tabCustomer Group`.`is_group` = "Yes" AND `tabCustomer Group`.`docstatus`!= 2 AND `tabCustomer Group`.%(key)s LIKE "%s" ORDER BY `tabCustomer Group`.`name` ASC LIMIT 50';
+ return 'SELECT `tabCustomer Group`.`name`,`tabCustomer Group`.`parent_customer_group` \
+ FROM `tabCustomer Group` WHERE `tabCustomer Group`.`is_group` = "Yes" AND \
+ `tabCustomer Group`.`docstatus`!= 2 AND `tabCustomer Group`.%(key)s LIKE "%s" \
+ ORDER BY `tabCustomer Group`.`name` ASC LIMIT 50';
}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/customer_group/customer_group.txt b/erpnext/setup/doctype/customer_group/customer_group.txt
index ceda674..5e44bef 100644
--- a/erpnext/setup/doctype/customer_group/customer_group.txt
+++ b/erpnext/setup/doctype/customer_group/customer_group.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-13 11:56:30',
+ 'creation': '2012-07-03 13:30:55',
'docstatus': 0,
- 'modified': '2012-04-19 17:50:43',
+ 'modified': '2012-07-12 09:47:20',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -22,6 +22,7 @@
'in_create': 1,
'module': u'Setup',
'name': '__common__',
+ 'read_only': 1,
'search_fields': u'name,parent_customer_group',
'section_style': u'Simple',
'server_code_error': u' ',
@@ -142,18 +143,6 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'description',
- 'fieldtype': u'Text',
- 'label': u'Description',
- 'oldfieldname': u'description',
- 'oldfieldtype': u'Text',
- 'permlevel': 0,
- 'width': u'300px'
- },
-
- # DocField
- {
'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'parent_customer_group',
@@ -185,6 +174,16 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'cb0',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'description': u'This Price List will be selected as default for all Customers under this Group.',
+ 'doctype': u'DocField',
'fieldname': u'default_price_list',
'fieldtype': u'Link',
'label': u'Default Price List',
diff --git a/erpnext/setup/doctype/item_group/item_group.js b/erpnext/setup/doctype/item_group/item_group.js
index db7582c..e5e108a 100644
--- a/erpnext/setup/doctype/item_group/item_group.js
+++ b/erpnext/setup/doctype/item_group/item_group.js
@@ -14,21 +14,14 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-cur_frm.cscript.onload = function(){
-
- if(doc.__islocal){
- doc.parent_item_group = 'Root';
- refresh('parent_item_group');
- }
+cur_frm.cscript.set_breadcrumbs = function(barea) {
+ cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname);
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!Sales Browser/Item Group">\
+ Item Group Tree</a>');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!selling-home">Selling</a>');
}
//get query select item group
cur_frm.fields_dict['parent_item_group'].get_query = function(doc,cdt,cdn) {
return 'SELECT `tabItem Group`.`name`,`tabItem Group`.`parent_item_group` FROM `tabItem Group` WHERE `tabItem Group`.`is_group` = "Yes" AND `tabItem Group`.`docstatus`!= 2 AND `tabItem Group`.`name` !="'+doc.item_group_name+'" AND `tabItem Group`.%(key)s LIKE "%s" ORDER BY `tabItem Group`.`name` ASC LIMIT 50';
-}
-
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-
}
\ No newline at end of file
diff --git a/erpnext/setup/doctype/item_group/item_group.py b/erpnext/setup/doctype/item_group/item_group.py
index 7e92f53..0253c8e 100644
--- a/erpnext/setup/doctype/item_group/item_group.py
+++ b/erpnext/setup/doctype/item_group/item_group.py
@@ -14,66 +14,15 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Please edit this list and import only required elements
import webnotes
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, getchildren, make_autoname
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
+from webnotes.model.doclist import getlist
+from webnotes.utils import flt
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-
-# -----------------------------------------------------------------------------------------
+from webnotes.utils.nestedset import DocTypeNestedSet
-
-class DocType:
- def __init__(self,d,dl):
- self.doc, self.doclist = d,dl
- self.nsm_parent_field = 'parent_item_group';
-
- # update Node Set Model
- def update_nsm_model(self):
- import webnotes
- import webnotes.utils.nestedset
- webnotes.utils.nestedset.update_nsm(self)
-
- # ON UPDATE
- #--------------------------------------
- def on_update(self):
- # update nsm
- self.update_nsm_model()
-
- def validate(self):
- if self.doc.lft and self.doc.rgt:
- res = sql("select name from `tabItem Group` where is_group = 'Yes' and docstatus!= 2 and name ='%s' and name !='%s'"%(self.doc.parent_item_group,self.doc.item_group_name))
- if not res:
- msgprint("Please enter proper parent item group.")
- raise Exception
-
- r = sql("select name from `tabItem Group` where name = '%s' and docstatus = 2"%(self.doc.item_group_name))
- if r:
- msgprint("'%s' record is trashed. To untrash please go to Setup & click on Trash."%(self.doc.item_group_name))
- raise Exception
-
- def on_trash(self):
- item = sql("select name from `tabItem` where ifnull(item_group, '') = %s", self.doc.name)
- item = [d[0] for d in item]
-
- if item:
- msgprint("""Item Group: %s can not be trashed/deleted because it is used in item: %s.
- To trash/delete this, remove/change item group in item master""" % (self.doc.name, item or ''), raise_exception=1)
-
- if sql("select name from `tabItem Group` where parent_item_group = %s and docstatus != 2", self.doc.name):
- msgprint("Child item group exists for this item group. You can not trash/cancel/delete this item group.", raise_exception=1)
-
-
- # rebuild tree
- set(self.doc,'old_parent', '')
- self.update_nsm_model()
+class DocType(DocTypeNestedSet):
+ def __init__(self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
+ self.nsm_parent_field = 'parent_item_group';
\ No newline at end of file
diff --git a/erpnext/setup/doctype/item_group/item_group.txt b/erpnext/setup/doctype/item_group/item_group.txt
index b56b8da..bd9887f 100644
--- a/erpnext/setup/doctype/item_group/item_group.txt
+++ b/erpnext/setup/doctype/item_group/item_group.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:21',
+ 'creation': '2012-07-03 13:30:53',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:21',
+ 'modified': '2012-07-12 11:26:21',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,6 +17,7 @@
'autoname': u'field:item_group_name',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'Item Classification',
'doctype': 'DocType',
'document_type': u'Master',
'in_create': 1,
@@ -27,7 +28,7 @@
'section_style': u'Simple',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 59
+ 'version': 1
},
# These values are common for all DocField
@@ -57,6 +58,54 @@
# DocPerm
{
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Material Manager',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Material Manager',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Material User',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Material User',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
'cancel': 1,
'create': 1,
'doctype': u'DocPerm',
@@ -75,54 +124,6 @@
'write': 1
},
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Material Manager',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Material Manager',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Material User',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Material User',
- 'submit': 0,
- 'write': 0
- },
-
# DocField
{
'doctype': u'DocField',
@@ -139,20 +140,6 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'description',
- 'fieldtype': u'Text',
- 'label': u'Description',
- 'no_copy': 0,
- 'oldfieldname': u'description',
- 'oldfieldtype': u'Text',
- 'permlevel': 0,
- 'search_index': 0,
- 'width': u'300px'
- },
-
- # DocField
- {
'colour': u'White:FFF',
'description': u'Check this if you want to show in website',
'doctype': u'DocField',
@@ -167,14 +154,9 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'show_in_catalogue',
- 'fieldtype': u'Check',
- 'label': u'Show in catalogue',
- 'no_copy': 0,
- 'oldfieldname': u'show_in_catalogue',
- 'oldfieldtype': u'Check',
- 'permlevel': 0,
- 'search_index': 0
+ 'fieldname': u'cb0',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0
},
# DocField
diff --git a/erpnext/setup/doctype/price_list/price_list.js b/erpnext/setup/doctype/price_list/price_list.js
index a222a65..11993f8 100644
--- a/erpnext/setup/doctype/price_list/price_list.js
+++ b/erpnext/setup/doctype/price_list/price_list.js
@@ -14,24 +14,34 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-//--------- ONLOAD -------------
-cur_frm.cscript.onload = function(doc, cdt, cdn) {
-}
-
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
if(doc.__islocal) {
- set_field_options('price_help', ''); return;
+ cur_frm.set_intro("Save this list to begin.");
+ return;
}
if(!doc.file_list) {
- set_field_options('price_help', '<div class="help_box">To upload a price list, please attach a (.csv) file with 3 columns - <b>Item Code, Price and Currency</b> (no headings necessary). See attachments box in the right column</div>')
- } else {
- set_field_options('price_help', '<div class="help_box">To update prices from the attachment, please click on "Update Prices"</div>')
- }
-}
+ cur_frm.set_intro('<p>1. Click on "Download Template" \
+ to download the template of all Items.</p>'
+ +'<p>2. Update prices and Currency.</p>'
+ +'<p>3. Save it as a CSV (.csv) file.</p>'
+ +'<p>4. Upload the file.</p>');
+
+ cur_frm.add_custom_button('Download Template', function() {
+ $c_obj_csv(cur_frm.get_doclist(), 'download_template');
+ }, 'icon-download')
+
+ cur_frm.add_custom_button('Upload Price List', function() {
+ cur_frm.attachments.add_attachment();
+ }, 'icon-upload')
+
-cur_frm.cscript.clear_prices = function(doc, cdt, cdn) {
- if(confirm("This action will clear all rates for '"+ doc.name +"' from the Item Master and cannot be un-done. Are you sure you want to continue?")) {
- $c_obj(make_doclist(doc.doctype, doc.name), 'clear_prices', '', function(r, rt) { });
+ } else {
+ cur_frm.set_intro('To update prices from the attachment, click on "Update Prices". \
+ To reset prices, delete the attachment (in the sidebar) and upload again.');
+
+ // Update Prices
+ cur_frm.add_custom_button('Update Prices', function() {
+ cur_frm.call_server('update_prices');
+ }, 'icon-refresh')
}
}
diff --git a/erpnext/setup/doctype/price_list/price_list.py b/erpnext/setup/doctype/price_list/price_list.py
index be59c65..0ec7121 100644
--- a/erpnext/setup/doctype/price_list/price_list.py
+++ b/erpnext/setup/doctype/price_list/price_list.py
@@ -14,23 +14,10 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Please edit this list and import only required elements
import webnotes
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, getchildren, make_autoname
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
-
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-
-# -----------------------------------------------------------------------------------------
+from webnotes.model.doc import Document
+from webnotes import msgprint
class DocType:
@@ -43,11 +30,24 @@
if currency in self.cl:
return 1
- if sql("select name from tabCurrency where name=%s", currency):
+ if webnotes.conn.sql("select name from tabCurrency where name=%s", currency):
self.cl.append(currency)
return 1
else:
return 0
+
+ def download_template(self, arg=None):
+ """download 3 column template with all Items"""
+ default_currency = webnotes.conn.get_default('currency')
+ item_list = webnotes.conn.sql("""select name from tabItem where
+ (ifnull(is_sales_item,'')='Yes' or ifnull(is_service_item,'')='Yes')""")
+ data = [self.get_price(i[0], default_currency) for i in item_list]
+ return [['Item', 'Rate', 'Currency']] + data
+
+ def get_price(self, item, default_currency):
+ rate = webnotes.conn.sql("""select ref_rate, ref_currency from `tabItem Price`
+ where parent=%s and price_list_name=%s""", (item, self.doc.name))
+ return [item, rate and rate[0][0] or 0, rate and rate[0][1] or default_currency]
# update prices in Price List
def update_prices(self):
@@ -57,15 +57,15 @@
updated = 0
for line in data:
- if line and len(line)==3:
+ if line and len(line)==3 and line[0]!='Item':
# if item exists
- if sql("select name from tabItem where name=%s", line[0]):
+ if webnotes.conn.sql("select name from tabItem where name=%s", line[0]):
if self.is_currency_valid(line[2]):
# if price exists
- ref_ret_detail = sql("select name from `tabItem Price` where parent=%s and price_list_name=%s and ref_currency=%s", \
+ ref_ret_detail = webnotes.conn.sql("select name from `tabItem Price` where parent=%s and price_list_name=%s and ref_currency=%s", \
(line[0], self.doc.name, line[2]))
if ref_ret_detail:
- sql("update `tabItem Price` set ref_rate=%s where name=%s", (line[1], ref_ret_detail[0][0]))
+ webnotes.conn.sql("update `tabItem Price` set ref_rate=%s where name=%s", (line[1], ref_ret_detail[0][0]))
else:
d = Document('Item Price')
d.parent = line[0]
@@ -80,17 +80,9 @@
msgprint("[Ignored] Unknown currency '%s' for Item '%s'" % (line[2], line[0]))
else:
msgprint("[Ignored] Did not find Item '%s'" % line[1])
- else:
- msgprint("[Ignored] Incorrect format: %s" % str(line))
msgprint("<b>%s</b> items updated" % updated)
- # clear prices
- def clear_prices(self):
- cnt = sql("select count(*) from `tabItem Price` where price_list_name = %s", self.doc.name)
- sql("delete from `tabItem Price` where price_list_name = %s", self.doc.name)
- msgprint("%s prices cleared" % cnt[0][0])
-
# Update CSV data
def get_csv_data(self):
if not self.doc.file_list:
@@ -99,8 +91,12 @@
fid = self.doc.file_list.split(',')[1]
- from webnotes.utils import file_manager
- fn, content = file_manager.get_file(fid)
+ try:
+ from webnotes.utils import file_manager
+ fn, content = file_manager.get_file(fid)
+ except Exception, e:
+ webnotes.msgprint("Unable to open attached file. Please try again.")
+ raise e
# NOTE: Don't know why this condition exists
if not isinstance(content, basestring) and hasattr(content, 'tostring'):
diff --git a/erpnext/setup/doctype/price_list/price_list.txt b/erpnext/setup/doctype/price_list/price_list.txt
index 2881cd7..79a7644 100644
--- a/erpnext/setup/doctype/price_list/price_list.txt
+++ b/erpnext/setup/doctype/price_list/price_list.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-05-15 12:15:02',
+ 'creation': '2012-07-03 13:30:55',
'docstatus': 0,
- 'modified': '2012-06-22 10:51:23',
+ 'modified': '2012-07-11 17:35:10',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -14,9 +14,13 @@
{
'_last_update': u'1303100817',
'allow_attach': 1,
+ 'allow_copy': 1,
+ 'allow_email': 1,
+ 'allow_print': 1,
'allow_trash': 1,
'autoname': u'field:price_list_name',
'colour': u'White:FFF',
+ 'description': u'Maintain multiple selling rates for the same **Item** using **Price Lists**. You can upload / edit multiple prices by downloading and uploading the template.',
'doctype': 'DocType',
'document_type': u'Master',
'max_attachments': 1,
@@ -34,7 +38,8 @@
'name': '__common__',
'parent': u'Price List',
'parentfield': u'fields',
- 'parenttype': u'DocType'
+ 'parenttype': u'DocType',
+ 'permlevel': 0
},
# These values are common for all DocPerm
@@ -108,71 +113,20 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'trash_reason',
- 'fieldtype': u'Small Text',
- 'label': u'Trash Reason',
- 'oldfieldname': u'trash_reason',
- 'oldfieldtype': u'Small Text',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'price_list_name',
'fieldtype': u'Data',
'label': u'Price List Name',
'oldfieldname': u'price_list_name',
'oldfieldtype': u'Data',
- 'permlevel': 0,
'reqd': 1
},
# DocField
{
- 'colour': u'White:FFF',
- 'depends_on': u'eval:!doc.__islocal',
- 'doctype': u'DocField',
- 'fieldname': u'price_help',
- 'fieldtype': u'HTML',
- 'label': u'Price Help',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'depends_on': u'eval:!doc.__islocal',
- 'description': u'Click on this button to clear prices for this list in all items',
- 'doctype': u'DocField',
- 'fieldname': u'clear_prices',
- 'fieldtype': u'Button',
- 'label': u'Clear Prices',
- 'permlevel': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
'doctype': u'DocField',
'fieldname': u'file_list',
'fieldtype': u'Text',
'hidden': 1,
- 'label': u'File List',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'depends_on': u'eval:!doc.__islocal',
- 'description': u'Update prices from the attachment',
- 'doctype': u'DocField',
- 'fieldname': u'update_prices',
- 'fieldtype': u'Button',
- 'label': u'Update Prices',
- 'options': u'update_prices',
- 'permlevel': 0,
- 'trigger': u'Server'
+ 'label': u'File List'
}
]
\ No newline at end of file
diff --git a/erpnext/setup/doctype/sales_partner/sales_partner.js b/erpnext/setup/doctype/sales_partner/sales_partner.js
index 92c9966..4f2aba2 100644
--- a/erpnext/setup/doctype/sales_partner/sales_partner.js
+++ b/erpnext/setup/doctype/sales_partner/sales_partner.js
@@ -95,55 +95,7 @@
}
-// ******************** ITEM Group ********************************
cur_frm.fields_dict['partner_target_details'].grid.get_field("item_group").get_query = function(doc, dt, dn) {
return 'SELECT `tabItem Group`.`name`,`tabItem Group`.`parent_item_group` FROM `tabItem Group` WHERE `tabItem Group`.is_group="No" AND `tabItem Group`.docstatus != 2 AND `tabItem Group`.%(key)s LIKE "%s" LIMIT 50'
}
-// make sales order list
-cur_frm.cscript.make_so_list = function(parent, doc){
- var lst = new Listing();
- lst.colwidths = ['5%','20%','20%','15%','20%','20%'];
- lst.colnames = ['Sr.','Id','Status','SO Date','Total Commission','Grand Total'];
- lst.coltypes = ['Data','Link','Data','Data','Currency','Currency'];
- lst.coloptions = ['','Sales Order','','','','',''];
-
- cur_frm.cscript.set_list_opts(lst);
-
- var q = repl("select name,status,transaction_date, total_commission,grand_total from `tabSales Order` where sales_partner='%(sp)s'", {'sp':doc.name});
- var q_max = repl("select count(name) from `tabSales Order` where sales_partner='%(cust)s'", {'sp':doc.name});
-
- cur_frm.cscript.run_list(lst,parent,q,q_max,doc,'Sales Order','Sales Order');
-}
-
-// make delivery note list
-cur_frm.cscript.make_dn_list = function(parent,doc){
- var lst = new Listing();
- lst.colwidths = ['5%','20%','20%','15%','20%','20%'];
- lst.colnames = ['Sr.','Id','Status','Date','Total Commission','Grand Total'];
- lst.coltypes = ['Data','Link','Data','Data','Currency','Currency'];
- lst.coloptions = ['','Delivery Note','','','','',''];
-
- cur_frm.cscript.set_list_opts(lst);
-
- var q = repl("select name,status,transaction_date, total_commission,grand_total from `tabDelivery Note` where sales_partner='%(sp)s'", {'sp':doc.name});
- var q_max = repl("select count(name) from `tabDelivery Note` where sales_partner='%(cust)s'", {'sp':doc.name});
-
- cur_frm.cscript.run_list(lst,parent,q,q_max,doc,'Delivery Note','Delivery Note');
-}
-
-// make sales invoice list
-cur_frm.cscript.make_si_list = function(parent,doc){
- var lst = new Listing();
- lst.colwidths = ['5%','25%','20%','25%','25%'];
- lst.colnames = ['Sr.','Id','Invoice Date','Total Commission','Grand Total'];
- lst.coltypes = ['Data','Link','Data','Data','Currency','Currency'];
- lst.coloptions = ['','Sales Invoice','','','',''];
-
- cur_frm.cscript.set_list_opts(lst);
-
- var q = repl("select name,posting_date, total_commission,grand_total from `tabSales Invoice` where sales_partner='%(sp)s'", {'sp':doc.name});
- var q_max = repl("select count(name) from `tabSales Invoice` where sales_partner='%(cust)s'", {'sp':doc.name});
-
- cur_frm.cscript.run_list(lst,parent,q,q_max,doc,'Sales Invoice','Sales Invoice');
-}
diff --git a/erpnext/setup/doctype/sales_partner/sales_partner.txt b/erpnext/setup/doctype/sales_partner/sales_partner.txt
index 0aa2de7..4e79261 100644
--- a/erpnext/setup/doctype/sales_partner/sales_partner.txt
+++ b/erpnext/setup/doctype/sales_partner/sales_partner.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:23',
+ 'creation': '2012-07-03 13:30:54',
'docstatus': 0,
- 'modified': '2012-03-27 18:49:33',
+ 'modified': '2012-07-12 11:22:15',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,6 +17,7 @@
'autoname': u'field:partner_name',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'A **Sales Partner** is a third party distributor / dealer / commission agent / affiliate / reseller who sells the companies products for a commission. This is useful if you make the end sale to the **Customer**, involving your **Sales Partner**.\n\nIf you sell to your **Sales Partner** who in-turn sells it to the **Customer**, then you must make a **Customer** instead.',
'doctype': 'DocType',
'document_type': u'Master',
'in_create': 0,
@@ -26,7 +27,7 @@
'section_style': u'Tabbed',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 74
+ 'version': 1
},
# These values are common for all DocField
@@ -57,49 +58,6 @@
# DocPerm
{
'amend': 0,
- 'cancel': 1,
- 'create': 1,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Sales Master Manager',
- 'submit': 0,
- 'write': 1
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Sales Master Manager',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'cancel': 1,
- 'create': 1,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'System Manager',
- 'write': 1
- },
-
- # DocPerm
- {
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'System Manager',
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
@@ -145,6 +103,49 @@
'write': 0
},
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 1,
+ 'create': 1,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Sales Master Manager',
+ 'submit': 0,
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Sales Master Manager',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'cancel': 1,
+ 'create': 1,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'System Manager',
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'System Manager',
+ 'write': 0
+ },
+
# DocField
{
'colour': u'White:FFF',
@@ -152,7 +153,7 @@
'doctype': u'DocField',
'fieldname': u'basic_info',
'fieldtype': u'Section Break',
- 'label': u'Basic Info',
+ 'label': u'Sales Partner Details',
'oldfieldtype': u'Section Break',
'permlevel': 0
},
@@ -282,7 +283,7 @@
'doctype': u'DocField',
'fieldname': u'partner_target_details_section_break',
'fieldtype': u'Section Break',
- 'label': u'Partner Target Details',
+ 'label': u'Sales Partner Target',
'oldfieldtype': u'Section Break',
'permlevel': 0
},
@@ -290,18 +291,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'distribution_id',
- 'fieldtype': u'Link',
- 'label': u'Distribution Id',
- 'oldfieldname': u'distribution_id',
- 'oldfieldtype': u'Link',
- 'options': u'Budget Distribution',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'partner_target_details',
'fieldtype': u'Table',
'label': u'Partner Target Detail',
@@ -314,35 +303,15 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'manage_html',
- 'fieldtype': u'HTML',
- 'hidden': 1,
- 'label': u'Manage HTML',
- 'oldfieldtype': u'HTML',
- 'permlevel': 0,
- 'print_hide': 1
- },
-
- # DocField
- {
'colour': u'White:FFF',
- 'depends_on': u'eval:!doc.__islocal',
+ 'description': u'Select Budget Distribution to unevenly distribute targets across months.',
'doctype': u'DocField',
- 'fieldname': u'transaction_history',
- 'fieldtype': u'Section Break',
- 'label': u'Transaction History',
- 'oldfieldtype': u'Section Break',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'history_html',
- 'fieldtype': u'HTML',
- 'label': u'History HTML',
- 'oldfieldtype': u'HTML',
+ 'fieldname': u'distribution_id',
+ 'fieldtype': u'Link',
+ 'label': u'Target Distribution',
+ 'oldfieldname': u'distribution_id',
+ 'oldfieldtype': u'Link',
+ 'options': u'Budget Distribution',
'permlevel': 0
},
diff --git a/erpnext/setup/doctype/sales_person/sales_person.js b/erpnext/setup/doctype/sales_person/sales_person.js
index 453d88a..a1cac8a 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.js
+++ b/erpnext/setup/doctype/sales_person/sales_person.js
@@ -14,30 +14,19 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
+cur_frm.cscript.set_breadcrumbs = function(barea) {
+ cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname);
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!Sales Browser/Sales Person">\
+ Sales Person Tree</a>');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!selling-home">Selling</a>');
+}
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
}
cur_frm.cscript.onload = function(){
- if(doc.__islocal){
- doc.parent_sales_person = 'Root';
- refresh('parent_sales_person');
- }
-}
-cur_frm.cscript.country = function(doc, cdt, cdn) {
- var mydoc=doc;
- $c('runserverobj', args={'method':'check_state', 'docs':compress_doclist(make_doclist(doc.doctype, doc.name))},
- function(r,rt){
- if(r.message) {
- var doc = locals[mydoc.doctype][mydoc.name];
- doc.state = '';
- get_field(doc.doctype, 'state' , doc.name).options = r.message;
- refresh_field('state');
- }
- }
- );
-}
+}
//get query select sales person
cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) {
diff --git a/erpnext/setup/doctype/sales_person/sales_person.py b/erpnext/setup/doctype/sales_person/sales_person.py
index d8c6e43..3ab1847 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.py
+++ b/erpnext/setup/doctype/sales_person/sales_person.py
@@ -17,79 +17,19 @@
# Please edit this list and import only required elements
import webnotes
-from webnotes.model.doc import Document
from webnotes.model.doclist import getlist
-from webnotes.model.code import get_obj
-from webnotes import session, form, is_testing, msgprint, errprint
-from webnotes.utils import flt, cstr
+from webnotes.utils import flt
-sql = webnotes.conn.sql
-convert_to_lists = webnotes.conn.convert_to_lists
-
-# -----------------------------------------------------------------------------------------
+from webnotes.utils.nestedset import DocTypeNestedSet
-class DocType:
+class DocType(DocTypeNestedSet):
def __init__(self, doc, doclist=[]):
self.doc = doc
self.doclist = doclist
self.nsm_parent_field = 'parent_sales_person';
-
- def check_state(self):
- return "\n" + "\n".join([i[0] for i in sql("select state_name from `tabState` where `tabState`.country='%s' " % self.doc.country)])
-
-
- # update Node Set Model
- def update_nsm_model(self):
- import webnotes
- import webnotes.utils.nestedset
- webnotes.utils.nestedset.update_nsm(self)
-
- # ON UPDATE
- #--------------------------------------
- def on_update(self):
- # update nsm
- self.update_nsm_model()
-
def validate(self):
for d in getlist(self.doclist, 'target_details'):
if not flt(d.target_qty) and not flt(d.target_amount):
- msgprint("Either target qty or target amount is mandatory.")
+ webnotes.msgprint("Either target qty or target amount is mandatory.")
raise Exception
-
- #self.sync_with_contact()
-
- def sync_with_contact(self):
- cid = sql("select name from tabContact where sales_person_id = %s and is_sales_person=1", self.doc.name)
- if cid:
- d = Document('Contact', cid[0][0])
- else:
- d = Document('Contact')
-
- name_split = self.doc.sales_person_name.split()
- d.contact_name = self.doc.sales_person_name
- d.first_name = name_split[0]
- d.last_name = len(name_split) > 1 and name_split[1] or ''
- d.email_id = self.doc.email_id
- d.contact_no = d.mobile_no = self.doc.mobile_no
- d.designation = self.doc.designation
- d.department = self.doc.department
- d.sales_person_id = self.doc.name
- d.is_sales_person = 1
-
- d.save(new = (not d.name))
-
-
- def on_trash(self):
- st = sql("select parent, parenttype from `tabSales Team` where ifnull(sales_person, '') = %s and docstatus != 2", self.doc.name)
- st = [(d[1] + ' : ' + d[0]) for d in st]
- if st:
- msgprint("""Sales Person: %s can not be trashed/deleted because it is used in %s.
- To trash/delete this, remove/change sales person in %s""" % (self.doc.name, st or '', st or ''), raise_exception=1)
-
- if sql("select name from `tabSales Person` where parent_sales_person = %s and docstatus != 2", self.doc.name):
- msgprint("Child sales person exists for this sales person. You can not trash/cancel this sales person.", raise_exception=1)
-
- # rebuild tree
- webnotes.conn.set(self.doc,'old_parent', '')
- self.update_nsm_model()
diff --git a/erpnext/setup/doctype/sales_person/sales_person.txt b/erpnext/setup/doctype/sales_person/sales_person.txt
index 5ff8e94..028d828 100644
--- a/erpnext/setup/doctype/sales_person/sales_person.txt
+++ b/erpnext/setup/doctype/sales_person/sales_person.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-13 11:56:32',
+ 'creation': '2012-07-03 13:30:54',
'docstatus': 0,
- 'modified': '2012-05-31 11:28:32',
+ 'modified': '2012-07-12 10:33:10',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -16,6 +16,7 @@
'allow_trash': 1,
'autoname': u'field:sales_person_name',
'colour': u'White:FFF',
+ 'description': u'All Sales Transactions can be tagged against multiple **Sales Persons** so that you can set and monitor targets.',
'doctype': 'DocType',
'document_type': u'Master',
'in_create': 1,
@@ -129,17 +130,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'general_info',
- 'fieldtype': u'Section Break',
- 'label': u'General Info',
- 'oldfieldtype': u'Section Break',
- 'options': u'Simple',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'sales_person_name',
'fieldtype': u'Data',
'in_filter': 1,
@@ -170,17 +160,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'sphelp',
- 'fieldtype': u'HTML',
- 'label': u'SPHelp',
- 'oldfieldtype': u'HTML',
- 'options': u'<a href="#!Sales Browser/Sales Person">To manage Sales Person, click here</a>',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'is_group',
'fieldtype': u'Select',
'label': u'Has Child Node',
@@ -194,6 +173,14 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'cb0',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'employee',
'fieldtype': u'Link',
'label': u'Employee',
@@ -204,125 +191,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'department',
- 'fieldtype': u'Data',
- 'label': u'Department',
- 'oldfieldname': u'department',
- 'oldfieldtype': u'Data',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'designation',
- 'fieldtype': u'Data',
- 'label': u'Designation',
- 'oldfieldname': u'designation',
- 'oldfieldtype': u'Data',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'mobile_no',
- 'fieldtype': u'Data',
- 'label': u'Mobile No',
- 'oldfieldname': u'mobile_no',
- 'oldfieldtype': u'Data',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'column_break0',
- 'fieldtype': u'Column Break',
- 'oldfieldtype': u'Column Break',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'email_id',
- 'fieldtype': u'Data',
- 'label': u'Email Id',
- 'oldfieldname': u'email_id',
- 'oldfieldtype': u'Data',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'country',
- 'fieldtype': u'Select',
- 'in_filter': 1,
- 'label': u'Country',
- 'oldfieldname': u'country',
- 'oldfieldtype': u'Select',
- 'options': u'link:Country',
- 'permlevel': 0,
- 'search_index': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'state',
- 'fieldtype': u'Select',
- 'in_filter': 1,
- 'label': u'State',
- 'oldfieldname': u'state',
- 'oldfieldtype': u'Select',
- 'options': u'link:State',
- 'permlevel': 0,
- 'search_index': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'city',
- 'fieldtype': u'Data',
- 'label': u'City',
- 'oldfieldname': u'city',
- 'oldfieldtype': u'Data',
- 'permlevel': 0,
- 'reqd': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'territory',
- 'fieldtype': u'Link',
- 'hidden': 0,
- 'label': u'Territory',
- 'oldfieldname': u'territory',
- 'oldfieldtype': u'Link',
- 'options': u'Territory',
- 'permlevel': 0,
- 'search_index': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'territory_help',
- 'fieldtype': u'HTML',
- 'label': u'Territory Help',
- 'oldfieldtype': u'HTML',
- 'options': u'<a href="#!Sales Browser/Territory">To manage Territories, click here</a>',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'lft',
'fieldtype': u'Int',
'hidden': 1,
@@ -368,25 +236,13 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'distribution_id',
- 'fieldtype': u'Link',
- 'label': u'Distribution Id',
- 'oldfieldname': u'distribution_id',
- 'oldfieldtype': u'Link',
- 'options': u'Budget Distribution',
- 'permlevel': 0,
- 'search_index': 0
- },
-
- # DocField
- {
+ 'colour': u'White:FFF',
+ 'description': u'Set targets Item Group-wise for this Sales Person.',
'doctype': u'DocField',
'fieldname': u'target_details_section_break',
'fieldtype': u'Section Break',
- 'label': u'Target Details',
+ 'label': u'Sales Person Targets',
'oldfieldtype': u'Section Break',
- 'options': u'Simple',
'permlevel': 0
},
@@ -400,5 +256,20 @@
'oldfieldtype': u'Table',
'options': u'Target Detail',
'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'description': u'Select Budget Distribution to unevenly distribute targets across months.',
+ 'doctype': u'DocField',
+ 'fieldname': u'distribution_id',
+ 'fieldtype': u'Link',
+ 'label': u'Target Distribution',
+ 'oldfieldname': u'distribution_id',
+ 'oldfieldtype': u'Link',
+ 'options': u'Budget Distribution',
+ 'permlevel': 0,
+ 'search_index': 0
}
]
\ No newline at end of file
diff --git a/erpnext/setup/doctype/territory/territory.js b/erpnext/setup/doctype/territory/territory.js
index 46312c4..9b36d0c 100644
--- a/erpnext/setup/doctype/territory/territory.js
+++ b/erpnext/setup/doctype/territory/territory.js
@@ -15,17 +15,19 @@
// along with this program. If not, see <http://www.gnu.org/licenses/>.
+cur_frm.cscript.set_breadcrumbs = function(barea) {
+ cur_frm.frm_head.appframe.add_breadcrumb(cur_frm.docname);
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!Sales Browser/Territory">\
+ Territory Tree</a>');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in <a href="#!selling-home">Selling</a>');
+}
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
}
cur_frm.cscript.onload = function(){
-
- if(doc.__islocal){
- doc.parent_territory = 'All Territories';
- refresh('parent_territory');
- }
+
}
diff --git a/erpnext/setup/doctype/territory/territory.py b/erpnext/setup/doctype/territory/territory.py
index 606efa8..fae33ec 100644
--- a/erpnext/setup/doctype/territory/territory.py
+++ b/erpnext/setup/doctype/territory/territory.py
@@ -8,87 +8,28 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Please edit this list and import only required elements
import webnotes
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, getchildren, make_autoname
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
+from webnotes.model.doclist import getlist
+from webnotes.utils import flt
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
+from webnotes.utils.nestedset import DocTypeNestedSet
-# -----------------------------------------------------------------------------------------
+class DocType(DocTypeNestedSet):
+ def __init__(self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
+ self.nsm_parent_field = 'parent_territory'
-
-class DocType:
- def __init__(self, doc, doclist=[]):
- self.doc = doc
- self.doclist = doclist
- self.nsm_parent_field = 'parent_territory'
-
- def check_state(self):
- return "\n" + "\n".join([i[0] for i in sql("select state_name from `tabState` where `tabState`.country='%s' " % self.doc.country)])
-
-
-
- # update Node Set Model
- def update_nsm_model(self):
- import webnotes
- import webnotes.utils.nestedset
- webnotes.utils.nestedset.update_nsm(self)
-
- # ON UPDATE
- #--------------------------------------
- def on_update(self):
-
- # update nsm
- self.update_nsm_model()
-
-
-
- def validate(self):
- if self.doc.lft and self.doc.rgt:
- res = sql("select name from `tabTerritory` where is_group = 'Yes' and docstatus!= 2 and name ='%s' and name !='%s'"%(self.doc.parent_territory,self.doc.territory_name))
- if not res:
- msgprint("Please enter proper parent territory.")
- raise Exception
-
- r = sql("select name from `tabTerritory` where name = '%s' and docstatus = 2"%(self.doc.territory_name))
- if r:
- msgprint("%s record is trashed. To untrash please go to Setup & click on Trash."%(self.doc.territory_name))
- raise Exception
-
- for d in getlist(self.doclist, 'target_details'):
- if not flt(d.target_qty) and not flt(d.target_amount):
- msgprint("Either target qty or target amount is mandatory.")
- raise Exception
-
-
- def on_trash(self):
- cust = sql("select name from `tabCustomer` where ifnull(territory, '') = %s", self.doc.name)
- cust = [d[0] for d in cust]
-
- if cust:
- msgprint("""Territory: %s can not be trashed/deleted because it is used in customer: %s.
- To trash/delete this, remove/change territory in customer master""" % (self.doc.name, cust or ''), raise_exception=1)
-
-
- if sql("select name from `tabTerritory` where parent_territory = %s and docstatus != 2", self.doc.name):
- msgprint("Child territory exists for this territory. You can not trash/cancel/delete this territory.", raise_exception=1)
-
- # rebuild tree
- set(self.doc,'old_parent', '')
- self.update_nsm_model()
+ def validate(self):
+ for d in getlist(self.doclist, 'target_details'):
+ if not flt(d.target_qty) and not flt(d.target_amount):
+ msgprint("Either target qty or target amount is mandatory.")
+ raise Exception
diff --git a/erpnext/setup/doctype/territory/territory.txt b/erpnext/setup/doctype/territory/territory.txt
index 3632801..a9cdf05 100644
--- a/erpnext/setup/doctype/territory/territory.txt
+++ b/erpnext/setup/doctype/territory/territory.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-13 11:56:32',
+ 'creation': '2012-07-03 13:30:55',
'docstatus': 0,
- 'modified': '2012-05-31 11:39:33',
+ 'modified': '2012-07-12 10:01:47',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,12 +17,14 @@
'autoname': u'field:territory_name',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'You can create **Territories** If your organization operates in multiple regions (could be countries, states or cities). Once you group **Customers** by **Territories**, you can set annual targets for each **Item Group** and get reports that will show your actual performance in the territory v/s what you had planned.',
'doctype': 'DocType',
'document_type': u'Master',
'in_create': 1,
'module': u'Setup',
'name': '__common__',
'name_case': u'Title Case',
+ 'read_only': 1,
'search_fields': u'name,parent_territory,territory_manager',
'section_style': u'Simple',
'server_code_error': u' ',
@@ -144,20 +146,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'territory_manager',
- 'fieldtype': u'Link',
- 'in_filter': 1,
- 'label': u'Territory Manager',
- 'oldfieldname': u'territory_manager',
- 'oldfieldtype': u'Link',
- 'options': u'Sales Person',
- 'permlevel': 0,
- 'search_index': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'parent_territory',
'fieldtype': u'Link',
'label': u'Parent Territory',
@@ -171,17 +159,6 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'territoryhelp',
- 'fieldtype': u'HTML',
- 'label': u'TerritoryHelp',
- 'oldfieldtype': u'HTML',
- 'options': u'<a href="#!Sales Browser/Territory">To manage Territories, click here</a>',
- 'permlevel': 0
- },
-
- # DocField
- {
'colour': u'White:FFF',
'description': u'Only leaf nodes are allowed in transaction',
'doctype': u'DocField',
@@ -198,6 +175,30 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'cb0',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'description': u'For reference',
+ 'doctype': u'DocField',
+ 'fieldname': u'territory_manager',
+ 'fieldtype': u'Link',
+ 'in_filter': 1,
+ 'label': u'Territory Manager',
+ 'oldfieldname': u'territory_manager',
+ 'oldfieldtype': u'Link',
+ 'options': u'Sales Person',
+ 'permlevel': 0,
+ 'search_index': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'lft',
'fieldtype': u'Int',
'hidden': 1,
@@ -247,22 +248,12 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'distribution_id',
- 'fieldtype': u'Link',
- 'label': u'Distribution Id',
- 'oldfieldname': u'distribution_id',
- 'oldfieldtype': u'Link',
- 'options': u'Budget Distribution',
- 'permlevel': 0
- },
-
- # DocField
- {
+ 'colour': u'White:FFF',
+ 'description': u'Set Item Group-wise budgets on this Territory. You can also include seasonality by setting the Distribution.',
'doctype': u'DocField',
'fieldname': u'target_details_section_break',
'fieldtype': u'Section Break',
- 'label': u'Target Details',
+ 'label': u'Territory Targets',
'oldfieldtype': u'Section Break',
'permlevel': 0
},
@@ -272,10 +263,24 @@
'doctype': u'DocField',
'fieldname': u'target_details',
'fieldtype': u'Table',
- 'label': u'Target Details1',
+ 'label': u'Target Details',
'oldfieldname': u'target_details',
'oldfieldtype': u'Table',
'options': u'Target Detail',
'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'description': u'Select Budget Distribution to unevenly distribute targets across months.',
+ 'doctype': u'DocField',
+ 'fieldname': u'distribution_id',
+ 'fieldtype': u'Link',
+ 'label': u'Target Distribution',
+ 'oldfieldname': u'distribution_id',
+ 'oldfieldtype': u'Link',
+ 'options': u'Budget Distribution',
+ 'permlevel': 0
}
]
\ No newline at end of file
diff --git a/erpnext/stock/doctype/item/item.txt b/erpnext/stock/doctype/item/item.txt
index 8a079b8..b531e53 100644
--- a/erpnext/stock/doctype/item/item.txt
+++ b/erpnext/stock/doctype/item/item.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-30 18:33:53',
+ 'creation': '2012-07-03 13:30:46',
'docstatus': 0,
- 'modified': '2012-06-07 16:16:24',
+ 'modified': '2012-07-11 09:57:40',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -196,7 +196,7 @@
# DocField
{
'colour': u'White:FFF',
- 'description': u'Classify your item in any one item group by clicking on the magnifying glass',
+ 'description': u'<a href="#!Sales Browser/Item Group">Manage Item Groups</a>',
'doctype': u'DocField',
'fieldname': u'item_group',
'fieldtype': u'Link',
@@ -212,17 +212,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'ighelp',
- 'fieldtype': u'HTML',
- 'label': u'IGHelp',
- 'oldfieldtype': u'HTML',
- 'options': u'<a href="#!Sales Browser/Item Group">To manage Item Groups, click here</a>',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'brand',
'fieldtype': u'Link',
'hidden': 0,
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.js b/erpnext/stock/doctype/sales_bom/sales_bom.js
index 275af6a..fe84272 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.js
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.js
@@ -14,35 +14,20 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-cur_frm.cscript.onload = function(doc, cdt, cdn) {
-
- if(!doc.price_list) set_multiple(cdt,cdn,{price_list:sys_defaults.price_list_name});
-}
-
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
+ cur_frm.enable_fields('new_item_code', doc.__islocal);
if(!doc.__islocal) {
- get_field(doc.doctype, 'new_item_code', doc.name).permlevel = 1;
+ cur_frm.add_custom_button("Check for Duplicates", function() {
+ cur_frm.call_server('check_duplicate', 1)
+ }, 'icon-search')
}
}
-/* Get Item Code */
-cur_frm.cscript.item_code = function(doc, dt, dn) {
- var d = locals[dt][dn];
- if (d.item_code){
- get_server_fields('get_item_details', d.item_code, 'sales_bom_items', doc ,dt, dn, 1);
- }
+cur_frm.fields_dict.new_item_code.get_query = function() {
+ return 'select name, description from tabItem where is_stock_item="No" and is_sales_item="Yes"\
+ and name not in (select name from `tabSales BOM`)\
+ and `%(key)s` like "%s"'
}
-
-cur_frm.cscript.price_list = function(doc, cdt, cdn) {
- $c_obj(make_doclist(cdt,cdn), 'get_rates', '', function(r,rt){refresh_field('sales_bom_items');});
-}
-
-cur_frm.cscript.currency = function(doc, cdt, cdn) {
- $c_obj(make_doclist(cdt,cdn), 'get_rates', '', function(r,rt){refresh_field('sales_bom_items');});
-}
-
-cur_frm.cscript.find_sales_bom = function(doc, dt, dn) {
- $c_obj(make_doclist(dt,dn), 'check_duplicate', 1, '');
-}
+cur_frm.fields_dict.new_item_code.query_description = 'Select Item where "Is Stock Item" is "No" \
+ and "Is Sales Item" is "Yes" and there is no other Sales BOM';
+
\ No newline at end of file
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.py b/erpnext/stock/doctype/sales_bom/sales_bom.py
index 03e1bd0..4a9ba2d 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.py
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.py
@@ -14,24 +14,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-# Please edit this list and import only required elements
import webnotes
-
-from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
-from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild, getchildren, make_autoname
-from webnotes.model.doclist import getlist, copy_doclist
-from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
-from webnotes import session, form, is_testing, msgprint, errprint
-
-set = webnotes.conn.set
-sql = webnotes.conn.sql
-get_value = webnotes.conn.get_value
-in_transaction = webnotes.conn.in_transaction
-convert_to_lists = webnotes.conn.convert_to_lists
-
-# -----------------------------------------------------------------------------------------
-
+from webnotes.utils import flt
+from webnotes.model.utils import getlist
class DocType:
def __init__(self,d,dl):
@@ -40,138 +25,41 @@
def autoname(self):
self.doc.name = self.doc.new_item_code
- # Get Ref Rates
- # --------------
- def get_rates(self):
- for d in getlist(self.doclist, "sales_bom_items"):
- r = sql("select ref_rate from `tabItem Price` where price_list_name=%s and parent=%s and ref_currency = %s", (self.doc.price_list, d.item_code, self.doc.currency))
- d.rate = r and flt(r[0][0]) or 0.00
-
-
- # Get Item Details
- # -----------------
- def get_item_details(self, name):
- det = sql("select description, stock_uom from `tabItem` where name = '%s' " % cstr(name))
- rate = sql("select ref_rate from `tabItem Price` where price_list_name = %s and parent = %s and ref_currency = %s", (self.doc.price_list, name, self.doc.currency))
- return {'description' : det and det[0][0] or '', 'uom': det and det[0][1] or '', 'rate': rate and flt(rate[0][0]) or 0.00}
-
-
- def get_main_item(self):
- is_main_item = []
- for d in getlist(self.doclist,'sales_bom_items'):
- if d.is_main_item == 'Yes':
- is_main_item.append(d.item_code)
- # Check that Sales Bom Item cannot be child of Sales Bom.
- if d.item_code == self.doc.new_item_code:
- msgprint("Sales Bom Item " + d.new_item_code +" cannot be child item.")
- raise Exception
- if len(is_main_item) > 1:
- msgprint('Main item cannot be more than one.')
- raise Exception , " Validation Error."
- if len(is_main_item) == 0:
- msgprint("At least one item should be main item.")
- raise Exception , " Validation Error."
- return is_main_item[0]
-
-
- # Make Item
- # ---------
- def create_new_item(self):
- i = Document("Item")
- i.item_code = self.doc.new_item_code
- i.item_name = self.doc.new_item_name
- i.name = i.item_code
- i.is_sales_item = 'Yes'
- i.is_stock_item = 'No'
- i.save(1)
-
- # Update Rate
- def update_ref_rate(self, i):
- ref_rate = 0
- if self.doc.price_list:
- if not cstr(self.doc.currency):
- msgprint("Please enter Currency.")
- raise Exception
- for d in getlist(self.doclist, "sales_bom_items"):
- item_rate = sql("select ref_rate,ref_currency from `tabItem Price` where price_list_name=%s and parent=%s", (self.doc.price_list, d.item_code))
- ref_rate += flt(d.qty) * (item_rate and flt(item_rate[0][0]) or 0)
-
- if ref_rate:
- # clear old rates
- sql("delete from `tabItem Price` where parent=%s and price_list_name = %s", (i.name, self.doc.price_list))
-
- pld = addchild(i,"ref_rate_details", "Item Price")
- pld.price_list_name = self.doc.price_list
- pld.ref_rate = flt(ref_rate)
- pld.ref_currency = self.doc.currency
- pld.save()
-
- # Update Items
- # ------------
- def update_item(self):
- i = Document("Item", self.doc.new_item_code)
-
- # update fields
- i.brand = self.doc.new_item_brand
- i.stock_uom = self.doc.stock_uom
- i.item_group = self.doc.item_group
-
-
- i.item_name = self.doc.new_item_name
- i.description = self.doc.description
-
- # set default as 'No' or 0
- i.is_sample_item = 'No'
- i.is_asset_item = 'No'
- i.is_purchase_item = 'No'
- i.is_manufactured_item = 'No'
- i.is_sub_contracted_item = 'No'
- i.is_service_item = 'No'
- i.inspection_required = 'No'
- i.has_serial_no = 'No'
- i.lead_time_days = flt(0)
- # update rates
- self.update_ref_rate(i)
- i.save()
- msgprint("Items: %s updated successfully. To update more details open and edit item master" % self.doc.new_item_code)
-
-
def validate(self):
# check for duplicate
self.check_duplicate()
- item_code = self.get_main_item()
- if not self.doc.new_item_code:
- self.doc.new_item_code = make_autoname(item_code +'.###')
+ self.validate_main_item()
-
- def on_update(self):
- # if no item code, create new item code
- if not sql("select name from tabItem where name=%s", self.doc.new_item_code):
- self.create_new_item()
- self.update_item()
-
+ def validate_main_item(self):
+ """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
+ ifnull(is_stock_item,'')='No' and ifnull(is_sales_item,'')='Yes'"""):
+ webnotes.msgprint("""Parent Item %s is either a Stock Item or a not a Sales Item""",
+ raise_exception=1)
def check_duplicate(self, finder=0):
il = getlist(self.doclist, "sales_bom_items")
if not il:
- msgprint("Add atleast one item")
+ webnotes.msgprint("Add atleast one item")
return
# get all Sales BOM that have the first item
- sbl = sql("select distinct parent from `tabSales BOM Item` where item_code=%s and parent != %s and docstatus != 2", (il[0].item_code, self.doc.name))
+ sbl = webnotes.conn.sql("""select distinct parent from `tabSales BOM Item` where item_code=%s
+ and parent != %s and docstatus != 2""", (il[0].item_code, self.doc.name))
# check all siblings
sub_items = [[d.item_code, flt(d.qty)] for d in il]
for s in sbl:
- t = sql("select item_code, qty from `tabSales BOM Item` where parent=%s and docstatus != 2", s[0])
+ t = webnotes.conn.sql("""select item_code, qty from `tabSales BOM Item` where parent=%s and
+ docstatus != 2""", s[0])
t = [[d[0], flt(d[1])] for d in t]
if self.has_same_items(sub_items, t):
- msgprint("%s has the same Sales BOM details" % s[0])
+ webnotes.msgprint("%s has the same Sales BOM details" % s[0])
raise Exception
if finder:
- msgprint("There is no Sales BOM present with the following Combination.")
+ webnotes.msgprint("There is no Sales BOM present with the following Combination.")
def has_same_items(self, l1, l2):
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.txt b/erpnext/stock/doctype/sales_bom/sales_bom.txt
index 29fcd31..c131d1c 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.txt
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-30 12:08:49',
+ 'creation': '2012-07-03 13:30:44',
'docstatus': 0,
- 'modified': '2012-05-04 09:53:08',
+ 'modified': '2012-07-11 19:17:51',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -15,10 +15,10 @@
'_last_update': u'1322549701',
'allow_trash': 1,
'colour': u'White:FFF',
- 'description': u'Aggregate item and accessories to form a Sales Item. There is no inventory of the new item but of the sub-components.',
+ 'description': u'Aggregate group of **Items** into another **Item**. This is useful if you are bundling a certain **Items** into a package and you maintain stock of the packed **Items** and not the packed **Item**. \n\nThe package **Item** will have "Is Stock Item" as "No" and "Is Sales Item" as "Yes".\n\nFor Example: If you are selling Laptops and Backpacks separately and have a special price if the customer buys both, then the Laptop + Backpack will be a new Sales BOM Item.\n\nNote: BOM = Bill of Materials',
'doctype': 'DocType',
'document_type': u'Master',
- 'is_submittable': 1,
+ 'is_submittable': 0,
'module': u'Stock',
'name': '__common__',
'section_style': u'Simple',
@@ -33,17 +33,20 @@
'name': '__common__',
'parent': u'Sales BOM',
'parentfield': u'fields',
- 'parenttype': u'DocType'
+ 'parenttype': u'DocType',
+ 'permlevel': 0
},
# These values are common for all DocPerm
{
+ 'amend': 0,
'doctype': u'DocPerm',
'name': '__common__',
'parent': u'Sales BOM',
'parentfield': u'permissions',
'parenttype': u'DocType',
- 'read': 1
+ 'read': 1,
+ 'submit': 0
},
# DocType, Sales BOM
@@ -54,73 +57,61 @@
# DocPerm
{
- 'amend': 0,
'cancel': 0,
- 'create': 0,
+ 'create': 1,
'doctype': u'DocPerm',
'permlevel': 1,
'role': u'Material Manager',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 1,
- 'cancel': 1,
- 'create': 1,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Material Manager',
- 'submit': 1,
'write': 1
},
# DocPerm
{
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Material User',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Material User',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
'cancel': 1,
'create': 1,
'doctype': u'DocPerm',
'permlevel': 0,
- 'role': u'Sales User',
- 'submit': 0,
+ 'role': u'Material Manager',
'write': 1
},
# DocPerm
{
- 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Material User',
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Material User',
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'cancel': 1,
+ 'create': 1,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Sales User',
+ 'write': 1
+ },
+
+ # DocPerm
+ {
'cancel': 0,
'create': 0,
'doctype': u'DocPerm',
'permlevel': 1,
'role': u'Sales User',
- 'submit': 0,
'write': 0
},
@@ -129,167 +120,32 @@
'doctype': u'DocField',
'fieldname': u'basic_section',
'fieldtype': u'Section Break',
- 'label': u'Basic Section',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'col1',
- 'fieldtype': u'Column Break',
- 'permlevel': 0,
- 'width': u'50%'
+ 'label': u'Sales BOM Item'
},
# DocField
{
'colour': u'White:FFF',
- 'description': u'Item code of the new aggregate item.',
+ 'description': u'The Item that represents the Package. This Item must have "Is Stock Item" as "No" and "Is Sales Item" as "Yes"',
'doctype': u'DocField',
'fieldname': u'new_item_code',
- 'fieldtype': u'Data',
- 'label': u'New Item Code',
+ 'fieldtype': u'Link',
+ 'label': u'Parent Item',
'no_copy': 1,
'oldfieldname': u'new_item_code',
'oldfieldtype': u'Data',
+ 'options': u'Item',
'reqd': 1
},
# DocField
{
'colour': u'White:FFF',
- 'doctype': u'DocField',
- 'fieldname': u'new_item_name',
- 'fieldtype': u'Data',
- 'label': u'New Item Name',
- 'oldfieldname': u'new_item_name',
- 'oldfieldtype': u'Data',
- 'permlevel': 0,
- 'reqd': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'new_item_brand',
- 'fieldtype': u'Data',
- 'label': u'New Item Brand',
- 'oldfieldname': u'new_item_brand',
- 'oldfieldtype': u'Data',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'description',
- 'fieldtype': u'Text',
- 'label': u'New Description',
- 'oldfieldname': u'description',
- 'oldfieldtype': u'Text',
- 'permlevel': 0,
- 'reqd': 1,
- 'width': u'300px'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'col2',
- 'fieldtype': u'Column Break',
- 'permlevel': 0,
- 'width': u'50%'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'item_group',
- 'fieldtype': u'Link',
- 'label': u'Item Group',
- 'oldfieldname': u'item_group',
- 'oldfieldtype': u'Link',
- 'options': u'Item Group',
- 'permlevel': 0,
- 'reqd': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'stock_uom',
- 'fieldtype': u'Link',
- 'label': u'Stock UOM',
- 'oldfieldname': u'stock_uom',
- 'oldfieldtype': u'Link',
- 'options': u'UOM',
- 'permlevel': 0,
- 'reqd': 1
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'doctype': u'DocField',
- 'fieldname': u'price_list',
- 'fieldtype': u'Select',
- 'label': u'Price List',
- 'oldfieldname': u'price_list',
- 'oldfieldtype': u'Select',
- 'options': u'link:Price List',
- 'permlevel': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'doctype': u'DocField',
- 'fieldname': u'currency',
- 'fieldtype': u'Select',
- 'label': u'Currency',
- 'oldfieldname': u'currency',
- 'oldfieldtype': u'Select',
- 'options': u'link:Currency',
- 'permlevel': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'depends_on': u'eval:doc.amended_from',
- 'description': u'The date at which current entry is corrected in the system.',
- 'doctype': u'DocField',
- 'fieldname': u'amendment_date',
- 'fieldtype': u'Date',
- 'label': u'Amendment Date',
- 'no_copy': 1,
- 'permlevel': 1,
- 'print_hide': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'amended_from',
- 'fieldtype': u'Link',
- 'label': u'Amended From',
- 'no_copy': 1,
- 'options': u'Sales BOM',
- 'permlevel': 1,
- 'print_hide': 1
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'description': u'List items that form a package. One of the items has to be a "main item".',
+ 'description': u'List items that form the package.',
'doctype': u'DocField',
'fieldname': u'item_section',
'fieldtype': u'Section Break',
- 'label': u'Items',
- 'permlevel': 0
+ 'label': u'Package Items'
},
# DocField
@@ -301,30 +157,6 @@
'oldfieldname': u'sales_bom_items',
'oldfieldtype': u'Table',
'options': u'Sales BOM Item',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'description': u'Add a few items and find if there are any Sales BOM created with the same combination to help you identify duplication.',
- 'doctype': u'DocField',
- 'fieldname': u'find_sales_bom',
- 'fieldtype': u'Button',
- 'label': u'Find Sales BOM',
- 'oldfieldtype': u'Button',
- 'permlevel': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'trash_reason',
- 'fieldtype': u'Small Text',
- 'label': u'Trash Reason',
- 'oldfieldname': u'trash_reason',
- 'oldfieldtype': u'Small Text',
- 'permlevel': 1
+ 'reqd': 1
}
]
\ No newline at end of file
diff --git a/erpnext/stock/doctype/sales_bom_item/sales_bom_item.txt b/erpnext/stock/doctype/sales_bom_item/sales_bom_item.txt
index 8cf93f5..76e3f26 100644
--- a/erpnext/stock/doctype/sales_bom_item/sales_bom_item.txt
+++ b/erpnext/stock/doctype/sales_bom_item/sales_bom_item.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:37',
+ 'creation': '2012-07-03 13:30:46',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:37',
+ 'modified': '2012-07-11 18:56:27',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -20,7 +20,7 @@
'section_style': u'Tray',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 3
+ 'version': 1
},
# These values are common for all DocField
@@ -41,18 +41,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'is_main_item',
- 'fieldtype': u'Select',
- 'label': u'Is Main Item',
- 'oldfieldname': u'is_main_item',
- 'oldfieldtype': u'Select',
- 'options': u'\nYes\nNo',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'item_code',
'fieldtype': u'Link',
'label': u'Item',
@@ -67,6 +55,18 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'qty',
+ 'fieldtype': u'Currency',
+ 'label': u'Qty',
+ 'oldfieldname': u'qty',
+ 'oldfieldtype': u'Currency',
+ 'permlevel': 0,
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'description',
'fieldtype': u'Text',
'label': u'Description',
@@ -90,18 +90,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'qty',
- 'fieldtype': u'Currency',
- 'label': u'Qty',
- 'oldfieldname': u'qty',
- 'oldfieldtype': u'Currency',
- 'permlevel': 0,
- 'reqd': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'uom',
'fieldtype': u'Link',
'label': u'UOM',
diff --git a/erpnext/stock/doctype/warehouse/warehouse.js b/erpnext/stock/doctype/warehouse/warehouse.js
index b218063..4ad95f4 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.js
+++ b/erpnext/stock/doctype/warehouse/warehouse.js
@@ -14,6 +14,10 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
+cur_frm.cscript.refresh = function(doc) {
+ cur_frm.toggle_fields('warehouse_name', doc.__islocal);
+}
+
cur_frm.cscript.country = function(doc, cdt, cdn) {
var mydoc=doc;
$c('runserverobj', args={'method':'check_state', 'docs':compress_doclist(make_doclist(doc.doctype, doc.name))},
diff --git a/erpnext/stock/doctype/warehouse/warehouse.txt b/erpnext/stock/doctype/warehouse/warehouse.txt
index 16bf59d..844e3f3 100644
--- a/erpnext/stock/doctype/warehouse/warehouse.txt
+++ b/erpnext/stock/doctype/warehouse/warehouse.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-05-15 12:15:13',
+ 'creation': '2012-07-03 13:30:45',
'docstatus': 0,
- 'modified': '2012-05-21 18:02:46',
+ 'modified': '2012-07-11 10:18:07',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,6 +17,7 @@
'autoname': u'field:warehouse_name',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'A logical Warehouse against which stock entries are made.\n\nThere are two main Warehouse Types that are significant in ERPNext.\n\n1. **Stores:** These are where your incoming **Items** are kept before they are consumed or sold. You can have as many \u201cStores\u201d type **Warehouses** as you wish. Stores type warehouses are significant because if you set an Item for automatic re-order, ERPNext will check its quantities in all \u201cStores\u201d type **Warehouses** when deciding whether to re-order or not.\n\n2. **Asset**: **Items** marked as type \u201cFixed Asset\u201d are maintained in Asset Type **Warehouses**. This helps you separate them for the **Items** that are consumed as a part of your regular operations or \u201cCost of Goods Sold\u201d.\n',
'doctype': 'DocType',
'document_type': u'Master',
'module': u'Stock',
@@ -173,17 +174,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'trash_reason',
- 'fieldtype': u'Small Text',
- 'label': u'Trash Reason',
- 'oldfieldname': u'trash_reason',
- 'oldfieldtype': u'Small Text',
- 'permlevel': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'warehouse_detail',
'fieldtype': u'Section Break',
'label': u'Warehouse Detail',
@@ -220,7 +210,6 @@
# DocField
{
'colour': u'White:FFF',
- 'description': u'The valuation of items in this warehouse will be considered for the company that is specified',
'doctype': u'DocField',
'fieldname': u'company',
'fieldtype': u'Link',
@@ -235,6 +224,17 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'For Reference Only.',
+ 'doctype': u'DocField',
+ 'fieldname': u'warehouse_contact_info',
+ 'fieldtype': u'Section Break',
+ 'label': u'Warehouse Contact Info',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
'doctype': u'DocField',
'fieldname': u'email_id',
'fieldtype': u'Data',
@@ -249,24 +249,6 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'auto_indent_mail',
- 'fieldtype': u'Select',
- 'hidden': 1,
- 'label': u'Send Reorder Alert Mail ',
- 'no_copy': 1,
- 'oldfieldname': u'auto_indent_mail',
- 'oldfieldtype': u'Select',
- 'options': u'No\nYes',
- 'permlevel': 0,
- 'print_hide': 1,
- 'report_hide': 1,
- 'reqd': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
'fieldname': u'phone_no',
'fieldtype': u'Data',
'label': u'Phone No',
@@ -357,6 +339,8 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'For Admin use only. Please report errors to support@erpnext.com',
'doctype': u'DocField',
'fieldname': u'repost_stock',
'fieldtype': u'Section Break',
diff --git a/erpnext/stock/page/stock_home/stock_home.html b/erpnext/stock/page/stock_home/stock_home.html
index ef941ab..449a603 100644
--- a/erpnext/stock/page/stock_home/stock_home.html
+++ b/erpnext/stock/page/stock_home/stock_home.html
@@ -51,6 +51,11 @@
</div>
<div class="section-item">
<a class="section-link"
+ title = "Multiple prices lists for items"
+ href="#!List/Price List">Price List</a>
+ </div>
+ <div class="section-item">
+ <a class="section-link"
title = "Readings of incoming quality inspections"
href="#!List/Quality Inspection">Incoming Inspection</a>
</div>
diff --git a/public/css/all-app.css b/public/css/all-app.css
index 6bd1d58..4fa90aa 100644
--- a/public/css/all-app.css
+++ b/public/css/all-app.css
@@ -2244,11 +2244,27 @@
position: fixed;
bottom: 5px;
left: 5px;
- height: 40px;
- width: 40px;
+ height: 30px;
+ width: 30px;
background: url('../images/erpnext-fade.png') no-repeat top left;
}
+.markdown p {
+ font-size: 13px;
+}
+
+.markdown h1 {
+ margin-bottom: 9px;
+}
+
+.markdown h2 {
+ margin-bottom: 7px;
+}
+
+.markdown h3, .markdown h4 {
+ margin-bottom: 5px;
+}
+
/*
* lib/css/legacy/messages.css
*/
@@ -2259,6 +2275,14 @@
div.fetching { color: #888; text-align:right; }
+.msgprint {
+ min-height: 60px;
+ max-height: 500px;
+ padding: 9px;
+ color: #333;
+ overflow: auto;
+}
+
div.notice {
postion: absolute;
background-color: #000;
@@ -3276,6 +3300,8 @@
border-bottom: 1px solid #ccc;
}
+
+
/*
* lib/css/ui/fonts.css
*/
diff --git a/public/css/all-web.css b/public/css/all-web.css
index e1311c4..f825619 100644
--- a/public/css/all-web.css
+++ b/public/css/all-web.css
@@ -2105,11 +2105,27 @@
position: fixed;
bottom: 5px;
left: 5px;
- height: 40px;
- width: 40px;
+ height: 30px;
+ width: 30px;
background: url('../images/erpnext-fade.png') no-repeat top left;
}
+.markdown p {
+ font-size: 13px;
+}
+
+.markdown h1 {
+ margin-bottom: 9px;
+}
+
+.markdown h2 {
+ margin-bottom: 7px;
+}
+
+.markdown h3, .markdown h4 {
+ margin-bottom: 5px;
+}
+
/*
* lib/css/legacy/messages.css
*/
@@ -2120,6 +2136,14 @@
div.fetching { color: #888; text-align:right; }
+.msgprint {
+ min-height: 60px;
+ max-height: 500px;
+ padding: 9px;
+ color: #333;
+ overflow: auto;
+}
+
div.notice {
postion: absolute;
background-color: #000;
@@ -2525,6 +2549,8 @@
border-bottom: 1px solid #ccc;
}
+
+
/*
* erpnext/startup/startup.css
*/
diff --git a/public/js/all-app.js b/public/js/all-app.js
index d0e4771..7ee5607 100644
--- a/public/js/all-app.js
+++ b/public/js/all-app.js
@@ -202,7 +202,7 @@
* lib/js/wn/misc/tools.js
*/
wn.markdown=function(txt){if(!wn.md2html){wn.require('js/lib/showdown.js');wn.md2html=new Showdown.converter();}
-return wn.md2html.makeHtml(txt);}
+return'<div class="markdown">'+wn.md2html.makeHtml(txt)+'</div>';}
/*
* lib/js/wn/misc/user.js
*/
@@ -363,7 +363,7 @@
var me=this;if(label.tagName){var page=label;}else{var page=wn.pages[label];}
if(!page){console.log('Page not found '+label);return;}
if(this.page){$(this.page).toggle(false);$(this.page).trigger('hide');}
-this.page=page;$(this.page).fadeIn();$(this.page).trigger('show');this.page._route=window.location.hash;document.title=this.page.label;scroll(0,0);return this.page;}});wn.views.add_module_btn=function(parent,module){$(parent).append(repl('<span class="label" style="margin-right: 8px; cursor: pointer;"\
+this.page=page;$(this.page).fadeIn();this.page._route=window.location.hash;document.title=this.page.label;$(this.page).trigger('show');scroll(0,0);return this.page;}});wn.views.add_module_btn=function(parent,module){$(parent).append(repl('<span class="label" style="margin-right: 8px; cursor: pointer;"\
onclick="wn.set_route(\'%(module_small)s-home\')">\
<i class="icon-home icon-white"></i> %(module)s Home\
</span>',{module:module,module_small:module.toLowerCase()}));}
@@ -397,8 +397,8 @@
if(r.server_messages)msgprint(r.server_messages)
if(r.exc){console.log(r.exc);};if(r['403']){wn.container.change_to('403');}
if(r.docs){LocalDB.sync(r.docs);}}
-wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus)
-if(opts.error)opts.error(xhr)}})}
+wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success&&opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus)
+opts.error&&opts.error(xhr)}})}
wn.call=function(opts){var args=$.extend({},opts.args)
if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;}
for(key in args){if(args[key]&&typeof args[key]!='string'){args[key]=JSON.stringify(args[key]);}}
@@ -605,16 +605,12 @@
/*
* lib/js/legacy/utils/msgprint.js
*/
-var msg_dialog;function msgprint(msg,issmall,callback){if(!msg)return;if(typeof(msg)!='string')
-msg=JSON.stringify(msg);if(issmall){show_alert(msg);return;}
-if(msg.substr(0,8)=='__small:'){show_alert(msg.substr(8));return;}
-if(!msg_dialog){msg_dialog=new Dialog(500,200,"Message");msg_dialog.make_body([['HTML','Msg']])
-msg_dialog.onhide=function(){msg_dialog.msg_area.innerHTML='';$dh(msg_dialog.msg_icon);if(msg_dialog.custom_onhide)msg_dialog.custom_onhide();}
-$y(msg_dialog.rows['Msg'],{fontSize:'14px',lineHeight:'1.5em',padding:'16px'})
-var t=make_table(msg_dialog.rows['Msg'],1,2,'100%',['20px','250px'],{padding:'2px',verticalAlign:'Top'});msg_dialog.msg_area=$td(t,0,1);msg_dialog.msg_icon=$a($td(t,0,0),'img');}
-if(!msg_dialog.display)msg_dialog.show();var has_msg=msg_dialog.msg_area.innerHTML?1:0;var m=$a(msg_dialog.msg_area,'div','');if(has_msg)$y(m,{marginTop:'4px'});$dh(msg_dialog.msg_icon);if(msg.substr(0,6).toLowerCase()=='error:'){msg_dialog.msg_icon.src='images/lib/icons/error.gif';$di(msg_dialog.msg_icon);msg=msg.substr(6);}else if(msg.substr(0,8).toLowerCase()=='message:'){msg_dialog.msg_icon.src='images/lib/icons/application.gif';$di(msg_dialog.msg_icon);msg=msg.substr(8);}else if(msg.substr(0,3).toLowerCase()=='ok:'){msg_dialog.msg_icon.src='images/lib/icons/accept.gif';$di(msg_dialog.msg_icon);msg=msg.substr(3);}
-m.innerHTML=replace_newlines(msg);if(m.offsetHeight>200){$y(m,{height:'200px',width:'400px',overflow:'auto'})}
-msg_dialog.custom_onhide=callback;}
+var msg_dialog;function msgprint(msg,title){if(!msg)return;if(typeof(msg)!='string')
+msg=JSON.stringify(msg);if(msg.substr(0,8)=='__small:'){show_alert(msg.substr(8));return;}
+if(!msg_dialog){msg_dialog=new wn.ui.Dialog({title:"Message",onhide:function(){msg_dialog.msg_area.empty();}});msg_dialog.msg_area=$('<div class="msgprint">').appendTo(msg_dialog.body);}
+if(msg.search(/<br>|<p>/)==-1)
+msg=replace_newlines(msg);msg_dialog.set_title(title||'Message')
+msg_dialog.msg_area.append(msg);msg_dialog.show();}
var growl_area;function show_alert(txt,id){if(!growl_area){if(!$('#dialog-container').length){$('<div id="dialog-container">').appendTo('body');}
growl_area=$a($i('dialog-container'),'div','',{position:'fixed',bottom:'8px',right:'8px',width:'320px',zIndex:10});}
var wrapper=$a(growl_area,'div','',{position:'relative'});var body=$a(wrapper,'div','notice');var c=$a(body,'i','icon-remove-sign',{cssFloat:'right',cursor:'pointer'});$(c).click(function(){$dh(this.wrapper)});c.wrapper=wrapper;var t=$a(body,'div','',{color:'#FFF'});$(t).html(txt);if(id){$(t).attr('id',id);}
@@ -655,8 +651,9 @@
Field.prototype.set_description=function(){if(this.df.description){var p=in_list(['Text Editor','Code','Check'],this.df.fieldtype)?this.label_area:this.wrapper;this.desc_area=$a(p,'div','help small','',this.df.description)
if(in_list(['Text Editor','Code'],this.df.fieldtype))
$(this.desc_area).addClass('help small');}}
-Field.prototype.get_status=function(){if(this.in_filter)this.not_in_form=this.in_filter;if(this.not_in_form){return'Write';}
-if(!this.df.permlevel)this.df.permlevel=0;var p=this.perm[this.df.permlevel];var ret;if(cur_frm.editable&&p&&p[WRITE])ret='Write';else if(p&&p[READ])ret='Read';else ret='None';if(this.df.fieldtype=='Binary')
+Field.prototype.get_status=function(){if(this.in_filter)
+this.not_in_form=this.in_filter;if(this.not_in_form){return'Write';}
+if(!this.df.permlevel)this.df.permlevel=0;var p=this.perm[this.df.permlevel];var ret;if(cur_frm.editable&&p&&p[WRITE]&&!this.disabled)ret='Write';else if(p&&p[READ])ret='Read';else ret='None';if(this.df.fieldtype=='Binary')
ret='None';if(cint(this.df.hidden))
ret='None';if(ret=='Write'&&cint(cur_frm.doc.docstatus)>0)ret='Read';var a_o_s=cint(this.df.allow_on_submit);if(a_o_s&&(this.in_grid||(this.frm&&this.frm.not_in_container))){a_o_s=null;if(this.in_grid)a_o_s=this.grid.field.df.allow_on_submit;if(this.frm&&this.frm.not_in_container){a_o_s=cur_grid.field.df.allow_on_submit;}}
if(cur_frm.editable&&a_o_s&&cint(cur_frm.doc.docstatus)>0&&!this.df.hidden){tmp_perm=get_perm(cur_frm.doctype,cur_frm.docname,1);if(tmp_perm[this.df.permlevel]&&tmp_perm[this.df.permlevel][WRITE])ret='Write';}
@@ -854,10 +851,14 @@
<span class="appframe-title"></span>\
<span class="close">×</span>\
</div>').appendTo(this.$w);this.$w.find('.close').click(function(){window.history.back();})
-if(title)this.title(title);},title:function(txt){this.$titlebar.find('.appframe-title').html(txt);},add_button:function(label,click,icon){if(!this.$w.find('.appframe-toolbar').length)
-this.$w.append('<div class="appframe-toolbar"></div>');args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
+if(title)this.title(title);},title:function(txt){this.$titlebar.find('.appframe-title').html(txt);},make_toolbar:function(){if(!this.$w.find('.appframe-toolbar').length)
+this.$w.append('<div class="appframe-toolbar"></div>');},add_button:function(label,click,icon){this.make_toolbar();args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
this.buttons[label]=$(repl('<button class="btn btn-small">\
- %(icon)s %(label)s</button>',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
+ %(icon)s %(label)s</button>',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},add_help_button:function(txt){this.make_toolbar();$('<button class="btn btn-small" style="float:right;" button-type="help">\
+ <b>?</b></button>').data('help-text',txt).click(function(){msgprint($(this).data('help-text'),'Help');}).appendTo(this.$w.find('.appframe-toolbar'));},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();},add_breadcrumb:function(html){if(!this.$breadcrumbs)
+this.$breadcrumbs=$('</span>\
+ <span class="breadcrumb-area"></span>').appendTo(this.$titlebar);var crumb=$('<span>').html(html);if(!this.$breadcrumbs.find('span').length){crumb.addClass('appframe-title');}
+crumb.appendTo(this.$breadcrumbs);},clear_breadcrumbs:function(){this.$breadcrumbs&&this.$breadcrumbs.empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
<div class="layout-appframe"></div>\
<div class="layout-main"></div>\
</div>');}else{$(opts.parent).html('<div class="layout-wrapper layout-wrapper-background">\
@@ -874,6 +875,7 @@
$y(this.body,{padding:'11px'});this.fields_dict={};for(var i=0;i<fl.length;i++){var df=fl[i];var div=$a(body,'div','',{margin:'6px 0px'})
f=make_field(df,null,div,null);f.not_in_form=1;this.fields_dict[df.fieldname]=f
f.refresh();if(df.fieldtype=='Button'&&!this.first_button){$(f.input).addClass('btn-info');this.first_button=true;}}}
+this.catch_enter_as_submit=function(){var me=this;$(this.body).find(':input[type="text"], :input[type="password"]').keypress(function(e){if(e.which==13){$(me.body).find('.btn-info:first').click();}})}
this.get_values=function(){var ret={};var errors=[];for(var key in this.fields_dict){var f=this.fields_dict[key];var v=f.get_value?f.get_value():null;if(f.df.reqd&&!v)
errors.push(f.df.label+' is mandatory');if(v)ret[f.df.fieldname]=v;}
if(errors.length){msgprint('<b>Please check the following Errors</b>\n'+errors.join('\n'));return null;}
@@ -881,19 +883,18 @@
this.set_value=function(key,val){var f=this.fields_dict[key];if(f){f.set_input(val);f.refresh_mandatory();}}
this.set_values=function(dict){for(var key in dict){if(this.fields_dict[key]){this.set_value(key,dict[key]);}}}
this.clear=function(){for(key in this.fields_dict){var f=this.fields_dict[key];if(f){f.set_input(f.df['default']||'');}}}}
-wn.widgets.Dialog=function(opts){this.opts=opts;this.display=false;this.make=function(opts){if(opts)
-this.opts=opts;if(!this.opts.width)this.opts.width=480;if(!$('#dialog-container').length){$('<div id="dialog-container">').appendTo('body');}
+wn.widgets.Dialog=function(opts){this.display=false;this.make=function(opts){if(opts){this.opts=opts;$.extend(this,opts);}
+if(!this.opts.width)this.opts.width=480;if(!$('#dialog-container').length){$('<div id="dialog-container">').appendTo('body');}
this.wrapper=$('<div class="dialog_wrapper">').appendTo('#dialog-container').get(0);if(this.opts.width)
-this.wrapper.style.width=this.opts.width+'px';this.make_head();this.body=$a(this.wrapper,'div','dialog_body');if(this.opts.fields)
-this.make_fields(this.body,this.opts.fields);}
+this.wrapper.style.width=this.opts.width+'px';this.make_head();this.body=$a(this.wrapper,'div','dialog_body');if(this.opts.fields){this.make_fields(this.body,this.opts.fields);this.catch_enter_as_submit();}}
this.make_head=function(){var me=this;this.appframe=new wn.ui.AppFrame(this.wrapper);this.appframe.$titlebar.find('.close').unbind('click').click(function(){if(me.oncancel)me.oncancel();me.hide();});this.set_title(this.opts.title);}
this.set_title=function(t){this.appframe.$titlebar.find('.appframe-title').html(t||'');}
this.set_postion=function(){this.wrapper.style.left=(($(window).width()-cint(this.wrapper.style.width))/2)+'px';this.wrapper.style.top=($(window).scrollTop()+60)+'px';top_index++;$y(this.wrapper,{zIndex:top_index});}
this.show=function(){if(this.display)return;this.set_postion()
-$ds(this.wrapper);freeze();this.display=true;cur_dialog=this;if(this.onshow)this.onshow();}
+$ds(this.wrapper);freeze();this.display=true;cur_dialog=this;if(this.onshow)this.onshow();$(this.wrapper).find(':input:first').focus();}
this.hide=function(){if(this.onhide)this.onhide();unfreeze();$dh(this.wrapper);this.display=false;cur_dialog=null;}
this.no_cancel=function(){this.appframe.$titlebar.find('.close').toggle(false);}
-if(opts)this.make();}
+if(opts)this.make(opts);}
wn.widgets.Dialog.prototype=new wn.widgets.FieldGroup();wn.provide('wn.ui');wn.ui.Dialog=wn.widgets.Dialog
$(document).bind('keydown',function(e){if(cur_dialog&&!cur_dialog.no_cancel_flag&&e.which==27){cur_dialog.hide();}});
/*
@@ -966,15 +967,16 @@
</div>\
</div>\
<div style="clear: both"></div>\
- </div>');this.appframe=new wn.ui.AppFrame(this.$page.find('.appframe-area'));wn.views.breadcrumbs($('<span class="breadcrumb-area">').appendTo(this.appframe.$titlebar),locals.DocType[this.doctype].module,this.doctype);},setup:function(){var me=this;me.can_delete=wn.model.can_delete(me.doctype);me.meta=locals.DocType[me.doctype];me.$page.find('.wnlist-area').empty(),me.setup_docstatus_filter();me.setup_listview();me.init_list();me.init_stats();me.make_report_button();me.add_delete_option();},make_report_button:function(){var me=this;if(wn.boot.profile.can_get_report.indexOf(this.doctype)!=-1){this.appframe.add_button('Build Report',function(){wn.set_route('Report2',me.doctype);},'icon-th')}},setup_docstatus_filter:function(){var me=this;this.can_submit=$.map(locals.DocPerm,function(d){if(d.parent==me.meta.name&&d.submit)return 1
+ </div>');this.appframe=new wn.ui.AppFrame(this.$page.find('.appframe-area'));wn.views.breadcrumbs(this.appframe,locals.DocType[this.doctype].module,this.doctype);},setup:function(){var me=this;me.can_delete=wn.model.can_delete(me.doctype);me.meta=locals.DocType[me.doctype];me.$page.find('.wnlist-area').empty(),me.setup_docstatus_filter();me.setup_listview();me.init_list();me.init_stats();me.make_report_button();me.add_delete_option();me.make_help();},make_report_button:function(){var me=this;if(wn.boot.profile.can_get_report.indexOf(this.doctype)!=-1){this.appframe.add_button('Build Report',function(){wn.set_route('Report2',me.doctype);},'icon-th')}},make_help:function(){if(this.meta.description){this.appframe.add_help_button(wn.markdown('## '+this.meta.name+'\n\n'
++this.meta.description));}},setup_docstatus_filter:function(){var me=this;this.can_submit=$.map(locals.DocPerm,function(d){if(d.parent==me.meta.name&&d.submit)return 1
else return null;}).length;if(this.can_submit){this.$page.find('.show-docstatus').removeClass('hide');this.$page.find('.show-docstatus input').click(function(){me.run();})}},setup_listview:function(){if(this.meta.__listjs){eval(this.meta.__listjs);this.listview=new wn.doclistviews[this.doctype](this);}else{this.listview=new wn.views.ListView(this);}
this.listview.parent=this;this.wrapper=this.$page.find('.wnlist-area');this.page_length=20;this.allow_delete=true;},init_list:function(auto_run){var me=this;this.make({method:'webnotes.widgets.doclistview.get',get_args:this.get_args,parent:this.wrapper,start:0,page_length:this.page_length,show_filters:true,show_grid:true,new_doctype:this.doctype,allow_delete:this.allow_delete,no_result_message:this.make_no_result(),columns:this.listview.fields});$(this.wrapper).find('button[list_view_doc="'+me.doctype+'"]').click(function(){me.make_new_doc(me.doctype);});if((auto_run!==false)&&(auto_run!==0))this.run();},make_no_result:function(){var no_result_message=repl('<div class="well">\
<p>No %(doctype_label)s found</p>\
- %(description)s\
<hr>\
<p><button class="btn btn-info btn-small" list_view_doc="%(doctype)s">\
Make a new %(doctype_label)s</button>\
- </p></div>',{doctype_label:get_doctype_label(this.doctype),doctype:this.doctype,description:wn.markdown(locals.DocType[this.doctype].description||''),});return no_result_message;},render_row:function(row,data){data.doctype=this.doctype;this.listview.render(row,data,this);},get_query_fields:function(){return this.listview.fields;},get_args:function(){return{doctype:this.doctype,fields:this.get_query_fields(),filters:this.filter_list.get_filters(),docstatus:this.can_submit?$.map(this.$page.find('.show-docstatus :checked'),function(inp){return $(inp).attr('data-docstatus')}):[],order_by:this.listview.order_by||undefined,}},add_delete_option:function(){var me=this;if(this.can_delete){this.add_button('Delete',function(){me.delete_items();},'icon-remove')}},delete_items:function(){var me=this;var dl=$.map(me.$page.find('.list-delete:checked'),function(e){return $(e).data('name');});if(!dl.length)
+ </p></div>',{doctype_label:get_doctype_label(this.doctype),doctype:this.doctype});return no_result_message;},render_row:function(row,data){data.doctype=this.doctype;this.listview.render(row,data,this);},get_query_fields:function(){return this.listview.fields;},get_args:function(){return{doctype:this.doctype,fields:this.get_query_fields(),filters:this.filter_list.get_filters(),docstatus:this.can_submit?$.map(this.$page.find('.show-docstatus :checked'),function(inp){return $(inp).attr('data-docstatus')}):[],order_by:this.listview.order_by||undefined,}},add_delete_option:function(){var me=this;if(this.can_delete){this.add_button('Delete',function(){me.delete_items();},'icon-remove');$('<div style="padding: 4px"><input type="checkbox" name="select-all" />\
+ Select all</div>').insertBefore(this.$page.find('.result-list'));this.$page.find('[name="select-all"]').click(function(){me.$page.find('.list-delete').attr('checked',$(this).attr('checked')||false);})}},delete_items:function(){var me=this;var dl=$.map(me.$page.find('.list-delete:checked'),function(e){return $(e).data('name');});if(!dl.length)
return;if(!confirm('This is PERMANENT action and you cannot undo. Continue?')){return;}
me.set_working(true);wn.call({method:'webnotes.widgets.doclistview.delete_items',args:{items:dl,doctype:me.doctype},callback:function(){me.set_working(false);me.refresh();}})},init_stats:function(){var me=this
wn.call({method:'webnotes.widgets.doclistview.get_stats',args:{stats:me.listview.stats,doctype:me.doctype},callback:function(r){$.each(me.listview.stats,function(i,v){me.render_stat(v,r.message[v]);});if(me.listview.stats.length){$('<button class="btn btn-small"><i class="refresh"></i> Refresh</button>').click(function(){me.reload_stats();}).appendTo($('<div class="stat-wrapper">').appendTo(me.$page.find('.layout-side-section')))}}});},render_stat:function(field,stat){var me=this;if(!stat||!stat.length){if(field=='_user_tags'){this.$page.find('.layout-side-section').append('<div class="stat-wrapper"><h4>Tags</h4>\
@@ -1227,7 +1229,7 @@
d.style='Search';if(d.input){d.input=null;sel_type=null;}
d.sel_type=get_label_doctype(dt);d.set_title('Quick Search for '+dt);}
$(inp).keydown(function(e){if(e.which==13){if(!btn.disabled)btn.onclick();}})
-d.set_query_description=function(txt){if(!txt)txt=d.input&&d.input.query_description||null;if(txt){d.rows['Help'].innerHTML='<div class="help-box" style="margin-top:0px">'+txt+'</div>';}else{d.rows['Help'].innerHTML=''}}
+d.set_query_description=function(txt){txt=d.input&&d.input.query_description||txt;if(txt){d.rows['Help'].innerHTML='<div class="help-box" style="margin-top:0px">'+txt+'</div>';}else{d.rows['Help'].innerHTML=''}}
d.onshow=function(){if(d.set_doctype!=d.sel_type){d.rows['Result'].innerHTML='';d.values_len=0;}
inp.value='';if(d.input&&d.input.txt.value){inp.value=d.input.txt.value;}
try{inp.focus();}catch(e){}
@@ -1460,8 +1462,8 @@
/*
* lib/js/wn/views/breadcrumbs.js
*/
-wn.provide('wn.views');wn.views.breadcrumbs=function(parent,module,doctype,name){$(parent).empty();var $bspan=$(parent);if(name){$bspan.append('<span class="appframe-title">'+name+'</span>');}else if(doctype){$bspan.append('<span class="appframe-title">'+doctype+' List </span>');}else if(module){$bspan.append('<span class="appframe-title">'+module+'</span>');}
-if(name&&doctype&&(!locals['DocType'][doctype].issingle)){$bspan.append(repl('<span> in <a href="#!List/%(doctype)s">%(doctype)s List</a></span>',{doctype:doctype}))};if(doctype&&module&&wn.modules&&wn.modules[module]){$bspan.append(repl('<span> in <a href="#!%(module_page)s">%(module)s</a></span>',{module:module,module_page:wn.modules[module]}))}}
+wn.provide('wn.views');wn.views.breadcrumbs=function(appframe,module,doctype,name){appframe.clear_breadcrumbs();if(name){appframe.add_breadcrumb(name);}else if(doctype){appframe.add_breadcrumb(doctype+' List');}else if(module){appframe.add_breadcrumb(module);}
+if(name&&doctype&&(!locals['DocType'][doctype].issingle)){appframe.add_breadcrumb(repl(' in <a href="#!List/%(doctype)s">%(doctype)s List</a>',{doctype:doctype}))};if(doctype&&module&&wn.modules&&wn.modules[module]){appframe.add_breadcrumb(repl(' in <a href="#!%(module_page)s">%(module)s</a>',{module:module,module_page:wn.modules[module]}))}}
/*
* lib/js/legacy/widgets/form/fields.js
*/
@@ -1481,8 +1483,9 @@
Field.prototype.set_description=function(){if(this.df.description){var p=in_list(['Text Editor','Code','Check'],this.df.fieldtype)?this.label_area:this.wrapper;this.desc_area=$a(p,'div','help small','',this.df.description)
if(in_list(['Text Editor','Code'],this.df.fieldtype))
$(this.desc_area).addClass('help small');}}
-Field.prototype.get_status=function(){if(this.in_filter)this.not_in_form=this.in_filter;if(this.not_in_form){return'Write';}
-if(!this.df.permlevel)this.df.permlevel=0;var p=this.perm[this.df.permlevel];var ret;if(cur_frm.editable&&p&&p[WRITE])ret='Write';else if(p&&p[READ])ret='Read';else ret='None';if(this.df.fieldtype=='Binary')
+Field.prototype.get_status=function(){if(this.in_filter)
+this.not_in_form=this.in_filter;if(this.not_in_form){return'Write';}
+if(!this.df.permlevel)this.df.permlevel=0;var p=this.perm[this.df.permlevel];var ret;if(cur_frm.editable&&p&&p[WRITE]&&!this.disabled)ret='Write';else if(p&&p[READ])ret='Read';else ret='None';if(this.df.fieldtype=='Binary')
ret='None';if(cint(this.df.hidden))
ret='None';if(ret=='Write'&&cint(cur_frm.doc.docstatus)>0)ret='Read';var a_o_s=cint(this.df.allow_on_submit);if(a_o_s&&(this.in_grid||(this.frm&&this.frm.not_in_container))){a_o_s=null;if(this.in_grid)a_o_s=this.grid.field.df.allow_on_submit;if(this.frm&&this.frm.not_in_container){a_o_s=cur_grid.field.df.allow_on_submit;}}
if(cur_frm.editable&&a_o_s&&cint(cur_frm.doc.docstatus)>0&&!this.df.hidden){tmp_perm=get_perm(cur_frm.doctype,cur_frm.docname,1);if(tmp_perm[this.df.permlevel]&&tmp_perm[this.df.permlevel][WRITE])ret='Write';}
@@ -1694,8 +1697,8 @@
* lib/js/legacy/widgets/form/form_header.js
*/
_f.FrmHeader=Class.extend({init:function(parent,frm){this.appframe=new wn.ui.AppFrame(parent)
-this.appframe.$titlebar.append('</span>\
- <span class="breadcrumb-area"></span>');this.$w=this.appframe.$w;},refresh:function(){wn.views.breadcrumbs($(this.$w.find('.breadcrumb-area')),cur_frm.meta.module,cur_frm.meta.name,cur_frm.docname);this.refresh_labels();this.refresh_toolbar();},refresh_labels:function(){var labinfo={0:['Saved','label-success'],1:['Submitted','label-info'],2:['Cancelled','label-important']}[cint(cur_frm.doc.docstatus)];if(labinfo[0]=='Saved'&&cur_frm.meta.is_submittable){labinfo[0]='Saved, to Submit';}
+this.$w=this.appframe.$w;},refresh:function(){if(cur_frm.cscript.set_breadcrumbs){this.appframe.clear_breadcrumbs();cur_frm.cscript.set_breadcrumbs();}else{wn.views.breadcrumbs(this.appframe,cur_frm.meta.module,cur_frm.meta.name,cur_frm.docname);}
+this.refresh_labels();this.refresh_toolbar();},refresh_labels:function(){var labinfo={0:['Saved','label-success'],1:['Submitted','label-info'],2:['Cancelled','label-important']}[cint(cur_frm.doc.docstatus)];if(labinfo[0]=='Saved'&&cur_frm.meta.is_submittable){labinfo[0]='Saved, to Submit';}
if(cur_frm.doc.__unsaved||cur_frm.doc.__islocal){labinfo[0]='Not Saved';labinfo[1]='label-warning'}
this.set_label(labinfo);if(cur_frm.doc.__unsaved&&cint(cur_frm.doc.docstatus)==1&&this.appframe.buttons['Update']){this.appframe.buttons['Update'].toggle(true);}},set_label:function(labinfo){this.$w.find('.label').remove();$(repl('<span class="label %(lab_class)s">\
%(lab_status)s</span>',{lab_status:labinfo[0],lab_class:labinfo[1]})).insertBefore(this.$w.find('.breadcrumb-area'))},refresh_toolbar:function(){this.appframe.clear_buttons();var p=cur_frm.get_doc_perms();if(cur_frm.meta.read_only_onload&&!cur_frm.doc.__islocal){if(!cur_frm.editable)
@@ -1706,7 +1709,8 @@
this.appframe.add_button('Submit',function(){cur_frm.savesubmit();},'icon-lock');if(docstatus==1&&p[SUBMIT]){this.appframe.add_button('Update',function(){cur_frm.saveupdate();},'');if(!cur_frm.doc.__unsaved)this.appframe.buttons['Update'].toggle(false);}
if(docstatus==1&&p[CANCEL])
this.appframe.add_button('Cancel',function(){cur_frm.savecancel()},'icon-remove');if(docstatus==2&&p[AMEND])
-this.appframe.add_button('Amend',function(){cur_frm.amend_doc()},'icon-pencil');},show:function(){},hide:function(){},hide_close:function(){this.$w.find('.close').toggle(false);}})
+this.appframe.add_button('Amend',function(){cur_frm.amend_doc()},'icon-pencil');if(cur_frm.meta.description){this.appframe.add_help_button(wn.markdown('## '+cur_frm.doctype+'\n\n'
++cur_frm.meta.description));}},show:function(){},hide:function(){},hide_close:function(){this.$w.find('.close').toggle(false);}})
/*
* lib/js/legacy/widgets/form/form.js
*/
@@ -1744,7 +1748,7 @@
_f.Frm.prototype.setup_footer=function(){var me=this;var f=this.page_layout.footer;f.save_area=$a(this.page_layout.footer,'div','',{display:'none',marginTop:'11px'});f.help_area=$a(this.page_layout.footer,'div');var b=$btn(f.save_area,'Save',function(){cur_frm.save('Save');},{marginLeft:'0px'},'green');f.show_save=function(){$ds(me.page_layout.footer.save_area);}
f.hide_save=function(){$dh(me.page_layout.footer.save_area);}}
_f.Frm.prototype.set_intro=function(txt){if(!this.intro_area){this.intro_area=$('<div class="help-box form-intro-area">').insertBefore(this.page_layout.body.firstChild);}
-if(txt){this.intro_area.html(txt);}else{this.intro_area.remove();this.intro_area=null;}}
+if(txt){if(txt.search(/<p>/)==-1)txt='<p>'+txt+'</p>';this.intro_area.html(txt);}else{this.intro_area.remove();this.intro_area=null;}}
_f.Frm.prototype.setup_fields_std=function(){var fl=wn.meta.docfield_list[this.doctype];fl.sort(function(a,b){return a.idx-b.idx});if(fl[0]&&fl[0].fieldtype!="Section Break"||get_url_arg('embed')){this.layout.addrow();if(fl[0].fieldtype!="Column Break"){var c=this.layout.addcell();$y(c.wrapper,{padding:'8px'});}}
var sec;for(var i=0;i<fl.length;i++){var f=fl[i];if(f.fieldtype=='Section Break'&&fl[i+1]&&fl[i+1].fieldtype=='Section Break')
continue;var fn=f.fieldname?f.fieldname:f.label;var fld=make_field(f,this.doctype,this.layout.cur_cell,this);this.fields[this.fields.length]=fld;this.fields_dict[fn]=fld;if(sec&&['Section Break','Column Break'].indexOf(f.fieldtype)==-1){fld.parent_section=sec;sec.fields.push(fld);}
@@ -1783,14 +1787,14 @@
if(this.doc.docstatus==0){$(this.wrapper).find('.form-layout-row :input:first').focus();}}else{this.refresh_header();if(this.print_wrapper){this.refresh_print_layout();}
this.runclientscript('edit_status_changed');}
$(cur_frm.wrapper).trigger('render_complete');}}
-_f.Frm.prototype.refresh_footer=function(){var f=this.page_layout.footer;if(f.save_area){if(get_url_arg('embed')||(this.editable&&(!this.meta.in_dialog||this.in_form)&&this.doc.docstatus==0&&!this.meta.istable&&this.get_doc_perms()[WRITE])){f.show_save();}else{f.hide_save();}}}
+_f.Frm.prototype.refresh_footer=function(){var f=this.page_layout.footer;if(f.save_area){if(this.editable&&(!this.meta.in_dialog||this.in_form)&&this.doc.docstatus==0&&!this.meta.istable&&this.get_doc_perms()[WRITE]&&(this.fields&&this.fields.length>7)){f.show_save();}else{f.hide_save();}}}
_f.Frm.prototype.refresh_fields=function(){for(var i=0;i<this.fields.length;i++){var f=this.fields[i];f.perm=this.perm;f.docname=this.docname;var fn=f.df.fieldname||f.df.label;if(fn)
f.df=get_field(this.doctype,fn,this.docname);if(f.df.fieldtype!='Section Break'&&f.refresh){f.refresh();}}
$.each(this.sections,function(i,f){f.refresh(true);})
this.cleanup_refresh(this);}
_f.Frm.prototype.cleanup_refresh=function(){var me=this;if(me.fields_dict['amended_from']){if(me.doc.amended_from){unhide_field('amended_from');unhide_field('amendment_date');}else{hide_field('amended_from');hide_field('amendment_date');}}
if(me.fields_dict['trash_reason']){if(me.doc.trash_reason&&me.doc.docstatus==2){unhide_field('trash_reason');}else{hide_field('trash_reason');}}
-if(me.meta.autoname&&me.meta.autoname.substr(0,6)=='field:'&&!me.doc.__islocal){var fn=me.meta.autoname.substr(6);set_field_permlevel(fn,1);}}
+if(me.meta.autoname&&me.meta.autoname.substr(0,6)=='field:'&&!me.doc.__islocal){var fn=me.meta.autoname.substr(6);cur_frm.toggle_fields(fn,false);}}
_f.Frm.prototype.refresh_dependency=function(){var me=this;var doc=locals[this.doctype][this.docname];var dep_dict={};var has_dep=false;for(fkey in me.fields){var f=me.fields[fkey];f.dependencies_clear=true;var guardian=f.df.depends_on;if(guardian){if(!dep_dict[guardian])
dep_dict[guardian]=[];dep_dict[guardian][dep_dict[guardian].length]=f;has_dep=true;}}
if(!has_dep)return;for(var i=me.fields.length-1;i>=0;i--){var f=me.fields[i];f.guardian_has_value=true;if(f.df.depends_on){var v=doc[f.df.depends_on];if(f.df.depends_on.substr(0,5)=='eval:'){f.guardian_has_value=eval(f.df.depends_on.substr(5));}else if(f.df.depends_on.substr(0,3)=='fn:'){f.guardian_has_value=me.runclientscript(f.df.depends_on.substr(3),me.doctype,me.docname);}else{if(v||(v==0&&!v.substr)){}else{f.guardian_has_value=false;}}
@@ -1853,11 +1857,13 @@
_f.Frm.prototype.get_doclist=function(){return make_doclist(this.doctype,this.docname);}
_f.Frm.prototype.toggle_fields=function(fields,show){if(show){unhide_field(fields)}
else{hide_field(fields)}}
+_f.Frm.prototype.enable_fields=function(fields,enable){if(typeof fields=='string')fields=[fields];$.each(fields,function(i,f){var field=cur_frm.fields_dict[f];if(field){field.disabled=enable?false:true;field.refresh&&field.refresh();};})}
+_f.Frm.prototype.call_server=function(method,args,callback){$c_obj(cur_frm.get_doclist(),method,args,callback);}
/*
* lib/js/legacy/widgets/form/form_fields.js
*/
_f.ColumnBreak=function(){this.set_input=function(){};}
-_f.ColumnBreak.prototype.make_body=function(){this.cell=this.frm.layout.addcell(this.df.width);$y(this.cell.wrapper,{padding:'8px'});_f.cur_col_break_width=this.df.width;var fn=this.df.fieldname?this.df.fieldname:this.df.label;if(this.df&&this.df.label){this.label=$a(this.cell.wrapper,'div','','',this.df.label);}}
+_f.ColumnBreak.prototype.make_body=function(){this.cell=this.frm.layout.addcell(this.df.width);$y(this.cell.wrapper,{padding:'8px'});_f.cur_col_break_width=this.df.width;var fn=this.df.fieldname?this.df.fieldname:this.df.label;if(this.df&&this.df.label){this.label=$a(this.cell.wrapper,'h4','','',this.df.label);}}
_f.ColumnBreak.prototype.refresh=function(layout){var hidden=0;if((!this.perm[this.df.permlevel])||(!this.perm[this.df.permlevel][READ])||this.df.hidden){hidden=1;}
if(this.set_hidden!=hidden){if(hidden)
this.cell.hide();else
@@ -1880,7 +1886,7 @@
if(f.df.fieldtype=='Table'){if(f.grid.get_children().length||f.df.reqd){return true;}}}
return false;}
_f.SectionBreak.prototype.refresh=function(from_form){var hidden=0;if((!this.perm[this.df.permlevel])||(!this.perm[this.df.permlevel][READ])||this.df.hidden){hidden=1;}
-if(hidden){if(this.row)this.row.hide();}else{if(this.collapsible){}}}
+if(hidden){if(this.row)this.row.hide();}else{if(this.row)this.row.show();}}
_f.ImageField=function(){this.images={};}
_f.ImageField.prototype=new Field();_f.ImageField.prototype.onmake=function(){this.no_img=$a(this.wrapper,'div','no_img');this.no_img.innerHTML="No Image";$dh(this.no_img);}
_f.ImageField.prototype.get_image_src=function(doc){if(doc.file_list){file=doc.file_list.split(',');extn=file[0].split('.');extn=extn[extn.length-1].toLowerCase();var img_extn_list=['gif','jpg','bmp','jpeg','jp2','cgm','ief','jpm','jpx','png','tiff','jpe','tif'];if(in_list(img_extn_list,extn)){var src=wn.request.url+"?cmd=downloadfile&file_id="+file[1];}}else{var src="";}
@@ -1890,7 +1896,7 @@
$w(img,allow_width+'px');}else{$ds(this.no_img);}}
_f.ImageField.prototype.set_disp=function(val){}
_f.ImageField.prototype.set=function(val){}
-_f.TableField=function(){};_f.TableField.prototype=new Field();_f.TableField.prototype.with_label=0;_f.TableField.prototype.make_body=function(){if(this.perm[this.df.permlevel]&&this.perm[this.df.permlevel][READ]){this.grid=new _f.FormGrid(this);if(this.frm)this.frm.grids[this.frm.grids.length]=this;this.grid.make_buttons();if(this.df.description){this.desc_area=$a(this.parent,'div','help small','',this.df.description)}}}
+_f.TableField=function(){};_f.TableField.prototype=new Field();_f.TableField.prototype.with_label=0;_f.TableField.prototype.make_body=function(){if(this.perm[this.df.permlevel]&&this.perm[this.df.permlevel][READ]){this.grid=new _f.FormGrid(this);if(this.frm)this.frm.grids[this.frm.grids.length]=this;this.grid.make_buttons();if(this.df.description){this.desc_area=$a(this.parent,'div','help small',{marginBottom:'9px',marginTop:'0px'},this.df.description)}}}
_f.TableField.prototype.refresh=function(){if(!this.grid)return;var st=this.get_status();if(!this.df['default'])
this.df['default']='';this.grid.can_add_rows=false;this.grid.can_edit=false
if(st=='Write'){if(cur_frm.editable&&this.perm[this.df.permlevel]&&this.perm[this.df.permlevel][WRITE]){this.grid.can_edit=true;if(this.df['default'].toLowerCase()!='no toolbar')
@@ -2172,14 +2178,13 @@
/*
* lib/js/legacy/wn/widgets/form/sidebar.js
*/
-wn.widgets.form.sidebar={Sidebar:function(form){var me=this;this.form=form;this.opts={sections:[{title:'Actions',items:[{type:'link',label:'New',icon:'icon-plus',display:function(){return in_list(profile.can_create,form.doctype)},onclick:function(){new_doc(me.form.doctype)}},{type:'link',label:'List',icon:'icon-list',display:function(){return!me.form.meta.issingle;},onclick:function(){window.location.href="#!List/"+me.form.doctype}},{type:'link',label:'Refresh',icon:'icon-refresh',onclick:function(){me.form.reload_doc()}},{type:'link',label:'Print',display:function(){return!(me.form.doc.__islocal||me.form.meta.allow_print);},icon:'icon-print',onclick:function(){me.form.print_doc()}},{type:'link',label:'Email',display:function(){return!(me.form.doc.__islocal||me.form.meta.allow_email);},icon:'icon-envelope',onclick:function(){me.form.email_doc()}},{type:'link',label:'Copy',display:function(){return in_list(profile.can_create,me.form.doctype)&&!me.form.meta.allow_copy},icon:'icon-file',onclick:function(){me.form.copy_doc()}},{type:'link',label:'Delete',display:function(){return(cint(me.form.doc.docstatus)!=1)&&!me.form.doc.__islocal&&wn.model.can_delete(me.form.doctype);},icon:'icon-remove-sign',onclick:function(){me.form.savetrash()}}]},{title:'Assign To',render:function(wrapper){me.form.assign_to=new wn.widgets.form.sidebar.AssignTo(wrapper,me,me.form.doctype,me.form.docname);},display:function(){if(me.form.doc.__local)return false;else return true;}},{title:'Attachments',render:function(wrapper){me.form.attachments=new wn.widgets.form.sidebar.Attachments(wrapper,me,me.form.doctype,me.form.docname);},display:function(){return me.form.meta.allow_attach}},{title:'Comments',render:function(wrapper){new wn.widgets.form.sidebar.Comments(wrapper,me,me.form.doctype,me.form.docname);},display:function(){return!me.form.doc.__islocal}},{title:'Tags',render:function(wrapper){me.form.taglist=new TagList(wrapper,me.form.doc._user_tags?me.form.doc._user_tags.split(','):[],me.form.doctype,me.form.docname,0,function(){});},display:function(){return!me.form.doc.__islocal}},{title:'Users',render:function(wrapper){var doc=cur_frm.doc;var scrub_date=function(d){if(d)t=d.split(' ');else return'';return dateutil.str_to_user(t[0])+' '+t[1];}
+wn.widgets.form.sidebar={Sidebar:function(form){var me=this;this.form=form;this.opts={sections:[{title:'Actions',items:[{type:'link',label:'New',icon:'icon-plus',display:function(){return in_list(profile.can_create,form.doctype)},onclick:function(){new_doc(me.form.doctype)}},{type:'link',label:'List',icon:'icon-list',display:function(){return!me.form.meta.issingle&&!me.form.meta.read_only;},onclick:function(){window.location.href="#!List/"+me.form.doctype}},{type:'link',label:'Refresh',icon:'icon-refresh',onclick:function(){me.form.reload_doc()}},{type:'link',label:'Print',display:function(){return!(me.form.doc.__islocal||me.form.meta.allow_print);},icon:'icon-print',onclick:function(){me.form.print_doc()}},{type:'link',label:'Email',display:function(){return!(me.form.doc.__islocal||me.form.meta.allow_email);},icon:'icon-envelope',onclick:function(){me.form.email_doc()}},{type:'link',label:'Copy',display:function(){return in_list(profile.can_create,me.form.doctype)&&!me.form.meta.allow_copy},icon:'icon-file',onclick:function(){me.form.copy_doc()}},{type:'link',label:'Delete',display:function(){return(cint(me.form.doc.docstatus)!=1)&&!me.form.doc.__islocal&&wn.model.can_delete(me.form.doctype);},icon:'icon-remove-sign',onclick:function(){me.form.savetrash()}}]},{title:'Assign To',render:function(wrapper){me.form.assign_to=new wn.widgets.form.sidebar.AssignTo(wrapper,me,me.form.doctype,me.form.docname);},display:function(){if(me.form.doc.__local)return false;else return true;}},{title:'Attachments',render:function(wrapper){me.form.attachments=new wn.widgets.form.sidebar.Attachments(wrapper,me,me.form.doctype,me.form.docname);},display:function(){return me.form.meta.allow_attach}},{title:'Comments',render:function(wrapper){new wn.widgets.form.sidebar.Comments(wrapper,me,me.form.doctype,me.form.docname);},display:function(){return!me.form.doc.__islocal}},{title:'Tags',render:function(wrapper){me.form.taglist=new TagList(wrapper,me.form.doc._user_tags?me.form.doc._user_tags.split(','):[],me.form.doctype,me.form.docname,0,function(){});},display:function(){return!me.form.doc.__islocal}},{title:'Users',render:function(wrapper){var doc=cur_frm.doc;var scrub_date=function(d){if(d)t=d.split(' ');else return'';return dateutil.str_to_user(t[0])+' '+t[1];}
$(wrapper).html(repl('<p>Created:<br> <span class="avatar-small">\
<img title="%(created_by)s" src="%(avatar_created)s" /></span> \
<span class="help small">%(creation)s</span></p>\
<p>Modified:<br> <span class="avatar-small">\
<img title="%(modified_by)s" src="%(avatar_modified)s" /></span> \
- <span class="help small">%(modified)s</span></p>',{created_by:wn.user_info(doc.owner).fullname,avatar_created:wn.user_info(doc.owner).image,creation:scrub_date(doc.creation),modified_by:wn.user_info(doc.modified_by).fullname,avatar_modified:wn.user_info(doc.modified_by).image,modified:scrub_date(doc.modified)}));},display:function(){return!me.form.doc.__islocal}},{title:'Help',render:function(wrapper){$(wrapper).html('<div class="help small">'
-+wn.markdown(me.form.meta.description)+'</div>')},display:function(){return me.form.meta.description}}]}
+ <span class="help small">%(modified)s</span></p>',{created_by:wn.user_info(doc.owner).fullname,avatar_created:wn.user_info(doc.owner).image,creation:scrub_date(doc.creation),modified_by:wn.user_info(doc.modified_by).fullname,avatar_modified:wn.user_info(doc.modified_by).image,modified:scrub_date(doc.modified)}));},display:function(){return!me.form.doc.__islocal}}]}
this.refresh=function(){var parent=this.form.page_layout.sidebar_area;if(!this.sidebar){this.sidebar=new wn.widgets.PageSidebar(parent,this.opts);}else{this.sidebar.refresh();}}}}
/*
* lib/js/legacy/wn/widgets/form/comments.js
diff --git a/public/js/all-web.js b/public/js/all-web.js
index 76c4112..de31023 100644
--- a/public/js/all-web.js
+++ b/public/js/all-web.js
@@ -89,7 +89,7 @@
* lib/js/wn/misc/tools.js
*/
wn.markdown=function(txt){if(!wn.md2html){wn.require('js/lib/showdown.js');wn.md2html=new Showdown.converter();}
-return wn.md2html.makeHtml(txt);}
+return'<div class="markdown">'+wn.md2html.makeHtml(txt)+'</div>';}
/*
* lib/js/wn/misc/user.js
*/
@@ -250,7 +250,7 @@
var me=this;if(label.tagName){var page=label;}else{var page=wn.pages[label];}
if(!page){console.log('Page not found '+label);return;}
if(this.page){$(this.page).toggle(false);$(this.page).trigger('hide');}
-this.page=page;$(this.page).fadeIn();$(this.page).trigger('show');this.page._route=window.location.hash;document.title=this.page.label;scroll(0,0);return this.page;}});wn.views.add_module_btn=function(parent,module){$(parent).append(repl('<span class="label" style="margin-right: 8px; cursor: pointer;"\
+this.page=page;$(this.page).fadeIn();this.page._route=window.location.hash;document.title=this.page.label;$(this.page).trigger('show');scroll(0,0);return this.page;}});wn.views.add_module_btn=function(parent,module){$(parent).append(repl('<span class="label" style="margin-right: 8px; cursor: pointer;"\
onclick="wn.set_route(\'%(module_small)s-home\')">\
<i class="icon-home icon-white"></i> %(module)s Home\
</span>',{module:module,module_small:module.toLowerCase()}));}
@@ -284,8 +284,8 @@
if(r.server_messages)msgprint(r.server_messages)
if(r.exc){console.log(r.exc);};if(r['403']){wn.container.change_to('403');}
if(r.docs){LocalDB.sync(r.docs);}}
-wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus)
-if(opts.error)opts.error(xhr)}})}
+wn.request.call=function(opts){wn.request.prepare(opts);$.ajax({url:opts.url||wn.request.url,data:opts.args,type:opts.type||'POST',dataType:opts.dataType||'json',success:function(r,xhr){wn.request.cleanup(opts,r);opts.success&&opts.success(r,xhr.responseText);},error:function(xhr,textStatus){wn.request.cleanup(opts,{});show_alert('Unable to complete request: '+textStatus)
+opts.error&&opts.error(xhr)}})}
wn.call=function(opts){var args=$.extend({},opts.args)
if(opts.module&&opts.page){args.cmd=opts.module+'.page.'+opts.page+'.'+opts.page+'.'+opts.method}else if(opts.method){args.cmd=opts.method;}
for(key in args){if(args[key]&&typeof args[key]!='string'){args[key]=JSON.stringify(args[key]);}}
@@ -492,16 +492,12 @@
/*
* lib/js/legacy/utils/msgprint.js
*/
-var msg_dialog;function msgprint(msg,issmall,callback){if(!msg)return;if(typeof(msg)!='string')
-msg=JSON.stringify(msg);if(issmall){show_alert(msg);return;}
-if(msg.substr(0,8)=='__small:'){show_alert(msg.substr(8));return;}
-if(!msg_dialog){msg_dialog=new Dialog(500,200,"Message");msg_dialog.make_body([['HTML','Msg']])
-msg_dialog.onhide=function(){msg_dialog.msg_area.innerHTML='';$dh(msg_dialog.msg_icon);if(msg_dialog.custom_onhide)msg_dialog.custom_onhide();}
-$y(msg_dialog.rows['Msg'],{fontSize:'14px',lineHeight:'1.5em',padding:'16px'})
-var t=make_table(msg_dialog.rows['Msg'],1,2,'100%',['20px','250px'],{padding:'2px',verticalAlign:'Top'});msg_dialog.msg_area=$td(t,0,1);msg_dialog.msg_icon=$a($td(t,0,0),'img');}
-if(!msg_dialog.display)msg_dialog.show();var has_msg=msg_dialog.msg_area.innerHTML?1:0;var m=$a(msg_dialog.msg_area,'div','');if(has_msg)$y(m,{marginTop:'4px'});$dh(msg_dialog.msg_icon);if(msg.substr(0,6).toLowerCase()=='error:'){msg_dialog.msg_icon.src='images/lib/icons/error.gif';$di(msg_dialog.msg_icon);msg=msg.substr(6);}else if(msg.substr(0,8).toLowerCase()=='message:'){msg_dialog.msg_icon.src='images/lib/icons/application.gif';$di(msg_dialog.msg_icon);msg=msg.substr(8);}else if(msg.substr(0,3).toLowerCase()=='ok:'){msg_dialog.msg_icon.src='images/lib/icons/accept.gif';$di(msg_dialog.msg_icon);msg=msg.substr(3);}
-m.innerHTML=replace_newlines(msg);if(m.offsetHeight>200){$y(m,{height:'200px',width:'400px',overflow:'auto'})}
-msg_dialog.custom_onhide=callback;}
+var msg_dialog;function msgprint(msg,title){if(!msg)return;if(typeof(msg)!='string')
+msg=JSON.stringify(msg);if(msg.substr(0,8)=='__small:'){show_alert(msg.substr(8));return;}
+if(!msg_dialog){msg_dialog=new wn.ui.Dialog({title:"Message",onhide:function(){msg_dialog.msg_area.empty();}});msg_dialog.msg_area=$('<div class="msgprint">').appendTo(msg_dialog.body);}
+if(msg.search(/<br>|<p>/)==-1)
+msg=replace_newlines(msg);msg_dialog.set_title(title||'Message')
+msg_dialog.msg_area.append(msg);msg_dialog.show();}
var growl_area;function show_alert(txt,id){if(!growl_area){if(!$('#dialog-container').length){$('<div id="dialog-container">').appendTo('body');}
growl_area=$a($i('dialog-container'),'div','',{position:'fixed',bottom:'8px',right:'8px',width:'320px',zIndex:10});}
var wrapper=$a(growl_area,'div','',{position:'relative'});var body=$a(wrapper,'div','notice');var c=$a(body,'i','icon-remove-sign',{cssFloat:'right',cursor:'pointer'});$(c).click(function(){$dh(this.wrapper)});c.wrapper=wrapper;var t=$a(body,'div','',{color:'#FFF'});$(t).html(txt);if(id){$(t).attr('id',id);}
@@ -513,10 +509,14 @@
<span class="appframe-title"></span>\
<span class="close">×</span>\
</div>').appendTo(this.$w);this.$w.find('.close').click(function(){window.history.back();})
-if(title)this.title(title);},title:function(txt){this.$titlebar.find('.appframe-title').html(txt);},add_button:function(label,click,icon){if(!this.$w.find('.appframe-toolbar').length)
-this.$w.append('<div class="appframe-toolbar"></div>');args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
+if(title)this.title(title);},title:function(txt){this.$titlebar.find('.appframe-title').html(txt);},make_toolbar:function(){if(!this.$w.find('.appframe-toolbar').length)
+this.$w.append('<div class="appframe-toolbar"></div>');},add_button:function(label,click,icon){this.make_toolbar();args={label:label,icon:''};if(icon){args.icon='<i class="icon '+icon+'"></i>';}
this.buttons[label]=$(repl('<button class="btn btn-small">\
- %(icon)s %(label)s</button>',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
+ %(icon)s %(label)s</button>',args)).click(click).appendTo(this.$w.find('.appframe-toolbar'));return this.buttons[label];},add_help_button:function(txt){this.make_toolbar();$('<button class="btn btn-small" style="float:right;" button-type="help">\
+ <b>?</b></button>').data('help-text',txt).click(function(){msgprint($(this).data('help-text'),'Help');}).appendTo(this.$w.find('.appframe-toolbar'));},clear_buttons:function(){this.$w.find('.appframe-toolbar').empty();},add_breadcrumb:function(html){if(!this.$breadcrumbs)
+this.$breadcrumbs=$('</span>\
+ <span class="breadcrumb-area"></span>').appendTo(this.$titlebar);var crumb=$('<span>').html(html);if(!this.$breadcrumbs.find('span').length){crumb.addClass('appframe-title');}
+crumb.appendTo(this.$breadcrumbs);},clear_breadcrumbs:function(){this.$breadcrumbs&&this.$breadcrumbs.empty();}});wn.ui.make_app_page=function(opts){if(opts.single_column){$(opts.parent).html('<div class="layout-wrapper layout-wrapper-appframe">\
<div class="layout-appframe"></div>\
<div class="layout-main"></div>\
</div>');}else{$(opts.parent).html('<div class="layout-wrapper layout-wrapper-background">\
@@ -533,6 +533,7 @@
$y(this.body,{padding:'11px'});this.fields_dict={};for(var i=0;i<fl.length;i++){var df=fl[i];var div=$a(body,'div','',{margin:'6px 0px'})
f=make_field(df,null,div,null);f.not_in_form=1;this.fields_dict[df.fieldname]=f
f.refresh();if(df.fieldtype=='Button'&&!this.first_button){$(f.input).addClass('btn-info');this.first_button=true;}}}
+this.catch_enter_as_submit=function(){var me=this;$(this.body).find(':input[type="text"], :input[type="password"]').keypress(function(e){if(e.which==13){$(me.body).find('.btn-info:first').click();}})}
this.get_values=function(){var ret={};var errors=[];for(var key in this.fields_dict){var f=this.fields_dict[key];var v=f.get_value?f.get_value():null;if(f.df.reqd&&!v)
errors.push(f.df.label+' is mandatory');if(v)ret[f.df.fieldname]=v;}
if(errors.length){msgprint('<b>Please check the following Errors</b>\n'+errors.join('\n'));return null;}
@@ -540,19 +541,18 @@
this.set_value=function(key,val){var f=this.fields_dict[key];if(f){f.set_input(val);f.refresh_mandatory();}}
this.set_values=function(dict){for(var key in dict){if(this.fields_dict[key]){this.set_value(key,dict[key]);}}}
this.clear=function(){for(key in this.fields_dict){var f=this.fields_dict[key];if(f){f.set_input(f.df['default']||'');}}}}
-wn.widgets.Dialog=function(opts){this.opts=opts;this.display=false;this.make=function(opts){if(opts)
-this.opts=opts;if(!this.opts.width)this.opts.width=480;if(!$('#dialog-container').length){$('<div id="dialog-container">').appendTo('body');}
+wn.widgets.Dialog=function(opts){this.display=false;this.make=function(opts){if(opts){this.opts=opts;$.extend(this,opts);}
+if(!this.opts.width)this.opts.width=480;if(!$('#dialog-container').length){$('<div id="dialog-container">').appendTo('body');}
this.wrapper=$('<div class="dialog_wrapper">').appendTo('#dialog-container').get(0);if(this.opts.width)
-this.wrapper.style.width=this.opts.width+'px';this.make_head();this.body=$a(this.wrapper,'div','dialog_body');if(this.opts.fields)
-this.make_fields(this.body,this.opts.fields);}
+this.wrapper.style.width=this.opts.width+'px';this.make_head();this.body=$a(this.wrapper,'div','dialog_body');if(this.opts.fields){this.make_fields(this.body,this.opts.fields);this.catch_enter_as_submit();}}
this.make_head=function(){var me=this;this.appframe=new wn.ui.AppFrame(this.wrapper);this.appframe.$titlebar.find('.close').unbind('click').click(function(){if(me.oncancel)me.oncancel();me.hide();});this.set_title(this.opts.title);}
this.set_title=function(t){this.appframe.$titlebar.find('.appframe-title').html(t||'');}
this.set_postion=function(){this.wrapper.style.left=(($(window).width()-cint(this.wrapper.style.width))/2)+'px';this.wrapper.style.top=($(window).scrollTop()+60)+'px';top_index++;$y(this.wrapper,{zIndex:top_index});}
this.show=function(){if(this.display)return;this.set_postion()
-$ds(this.wrapper);freeze();this.display=true;cur_dialog=this;if(this.onshow)this.onshow();}
+$ds(this.wrapper);freeze();this.display=true;cur_dialog=this;if(this.onshow)this.onshow();$(this.wrapper).find(':input:first').focus();}
this.hide=function(){if(this.onhide)this.onhide();unfreeze();$dh(this.wrapper);this.display=false;cur_dialog=null;}
this.no_cancel=function(){this.appframe.$titlebar.find('.close').toggle(false);}
-if(opts)this.make();}
+if(opts)this.make(opts);}
wn.widgets.Dialog.prototype=new wn.widgets.FieldGroup();wn.provide('wn.ui');wn.ui.Dialog=wn.widgets.Dialog
$(document).bind('keydown',function(e){if(cur_dialog&&!cur_dialog.no_cancel_flag&&e.which==27){cur_dialog.hide();}});
/*
diff --git a/public/js/fields.js b/public/js/fields.js
index b9dca90..cb5c9be 100644
--- a/public/js/fields.js
+++ b/public/js/fields.js
@@ -18,8 +18,9 @@
Field.prototype.set_description=function(){if(this.df.description){var p=in_list(['Text Editor','Code','Check'],this.df.fieldtype)?this.label_area:this.wrapper;this.desc_area=$a(p,'div','help small','',this.df.description)
if(in_list(['Text Editor','Code'],this.df.fieldtype))
$(this.desc_area).addClass('help small');}}
-Field.prototype.get_status=function(){if(this.in_filter)this.not_in_form=this.in_filter;if(this.not_in_form){return'Write';}
-if(!this.df.permlevel)this.df.permlevel=0;var p=this.perm[this.df.permlevel];var ret;if(cur_frm.editable&&p&&p[WRITE])ret='Write';else if(p&&p[READ])ret='Read';else ret='None';if(this.df.fieldtype=='Binary')
+Field.prototype.get_status=function(){if(this.in_filter)
+this.not_in_form=this.in_filter;if(this.not_in_form){return'Write';}
+if(!this.df.permlevel)this.df.permlevel=0;var p=this.perm[this.df.permlevel];var ret;if(cur_frm.editable&&p&&p[WRITE]&&!this.disabled)ret='Write';else if(p&&p[READ])ret='Read';else ret='None';if(this.df.fieldtype=='Binary')
ret='None';if(cint(this.df.hidden))
ret='None';if(ret=='Write'&&cint(cur_frm.doc.docstatus)>0)ret='Read';var a_o_s=cint(this.df.allow_on_submit);if(a_o_s&&(this.in_grid||(this.frm&&this.frm.not_in_container))){a_o_s=null;if(this.in_grid)a_o_s=this.grid.field.df.allow_on_submit;if(this.frm&&this.frm.not_in_container){a_o_s=cur_grid.field.df.allow_on_submit;}}
if(cur_frm.editable&&a_o_s&&cint(cur_frm.doc.docstatus)>0&&!this.df.hidden){tmp_perm=get_perm(cur_frm.doctype,cur_frm.docname,1);if(tmp_perm[this.df.permlevel]&&tmp_perm[this.df.permlevel][WRITE])ret='Write';}
diff --git a/public/js/report-legacy.js b/public/js/report-legacy.js
index 0d757b6..4228c86 100644
--- a/public/js/report-legacy.js
+++ b/public/js/report-legacy.js
@@ -45,8 +45,7 @@
if(sc&&sc.sort_order){sc.sort_order=='ASC'?this.dt.set_asc():this.dt.set_desc();}
if(sc&&sc.page_len){this.dt.page_len_sel.inp.value=sc.page_len;}
this.current_loaded=criteria_name;this.set_main_title(criteria_name,sc.description);}
-_r.ReportBuilder.prototype.setup_filters_and_cols=function(){function can_dt_be_submitted(dt){if(locals.DocType&&locals.DocType[dt]&&locals.DocType[dt].allow_trash)return 1;var plist=getchildren('DocPerm',dt,'permissions','DocType');for(var pidx in plist){if(plist[pidx].submit)return 1;}
-return 0;}
+_r.ReportBuilder.prototype.setup_filters_and_cols=function(){function can_dt_be_submitted(dt){return locals.DocType[dt]&&locals.DocType[dt].is_submittable||0;}
var me=this;var dt=me.parent_dt?me.parent_dt:me.doctype;var fl=[{'fieldtype':'Data','label':'ID','fieldname':'name','in_filter':1,'parent':dt},{'fieldtype':'Data','label':'Owner','fieldname':'owner','in_filter':1,'parent':dt},{'fieldtype':'Date','label':'Created on','fieldname':'creation','in_filter':0,'parent':dt},{'fieldtype':'Date','label':'Last modified on','fieldname':'modified','in_filter':0,'parent':dt},];if(can_dt_be_submitted(dt)){fl[fl.length]={'fieldtype':'Check','label':'Saved','fieldname':'docstatus','search_index':1,'in_filter':1,'def_filter':1,'parent':dt};fl[fl.length]={'fieldtype':'Check','label':'Submitted','fieldname':'docstatus','search_index':1,'in_filter':1,'def_filter':1,'parent':dt};fl[fl.length]={'fieldtype':'Check','label':'Cancelled','fieldname':'docstatus','search_index':1,'in_filter':1,'parent':dt};}
me.make_datatable();me.orig_sort_list=[];if(me.parent_dt){me.setup_dt_filters_and_cols(fl,me.parent_dt);var fl=[];}
me.setup_dt_filters_and_cols(fl,me.doctype);if(!this.has_primary_filters)