diff --git a/erpnext/accounts/doctype/account/account.js b/erpnext/accounts/doctype/account/account.js
index 79c15bf1ae..75cc9e5fe2 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 \
+ Chart of Accounts');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in Accounts');
+}
+
// 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 @@ cur_frm.add_fetch('parent_account', 'is_pl_account', 'is_pl_account');
// 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.hide_unhide_group_ledger = function(doc) {
// -----------------------------------------
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_ledger = function(doc, cdt, cdn) {
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 335d47caa1..d4f63f428e 100644
--- a/erpnext/accounts/doctype/account/account.py
+++ b/erpnext/accounts/doctype/account/account.py
@@ -43,7 +43,6 @@ class DocType:
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 @@ class DocType:
# 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 @@ class DocType:
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 @@ class DocType:
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 @@ class DocType:
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 @@ class DocType:
# 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 @@ class DocType:
# VALIDATE
- # ==================================================================
def validate(self):
self.validate_master_name()
self.validate_rate_for_tax()
@@ -195,7 +186,6 @@ class DocType:
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 @@ class DocType:
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 @@ class DocType:
% (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 @@ class DocType:
# 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 @@ class DocType:
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 @@ class DocType:
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 e3ec85a7b2..b649c9ab18 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 d7deb9a712..1f72c3cb43 100644
--- a/erpnext/accounts/doctype/budget_distribution/budget_distribution.js
+++ b/erpnext/accounts/doctype/budget_distribution/budget_distribution.js
@@ -20,6 +20,11 @@ cur_frm.cscript.onload = function(doc,cdt,cdn){
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 9468b60224..090b8fbdd0 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 .
-# 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 @@ class DocType:
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 ca9b869fe5..ab8a6c8cdc 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 d0912bef0c..0acfdbc5bb 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 f721e42f2d..c131081a39 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.onload = function(doc, cdt, cdn) {
}
-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 \
+ Chart of Cost Centers');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in Accounts');
+}
+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 += '
Note: This is Cost Center is a Group, \
Accounting Entries are not allowed against groups.
';
}
+
+ 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.hide_unhide_group_ledger = function(doc) {
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_ledger = function(doc, cdt, cdn) {
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 83ad9d23cd..3e64c29856 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 .
-# 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 @@ class DocType:
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 @@ class DocType:
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 @@ class DocType:
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 @@ class DocType:
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 aea5fbb9d6..df65584123 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 Company Master',
'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 6a03bf7014..d60e4ecc41 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.py b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
index a44b75670c..c1b4663631 100644
--- a/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
+++ b/erpnext/accounts/doctype/fiscal_year/fiscal_year.py
@@ -204,9 +204,6 @@ class DocType:
if sql("select name from `tabFiscal Year` where year_start_date < %s", self.doc.year_start_date) and not self.doc.past_year:
msgprint("Please enter Past Year", raise_exception=1)
- if not self.doc.is_fiscal_year_closed:
- self.doc.is_fiscal_year_closed = 'No'
-
# on update
def on_update(self):
diff --git a/erpnext/accounts/doctype/fiscal_year/fiscal_year.txt b/erpnext/accounts/doctype/fiscal_year/fiscal_year.txt
index ae4c5a05e7..68dbdb2332 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',
@@ -102,18 +105,6 @@
'reqd': 1
},
- # 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',
@@ -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 bfeddb0c52..ef8960c35d 100644
--- a/erpnext/accounts/doctype/gl_control/gl_control.py
+++ b/erpnext/accounts/doctype/gl_control/gl_control.py
@@ -123,6 +123,7 @@ class DocType:
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/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.txt b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.txt
index 74fd69740c..096050d252 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.txt
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges/purchase_taxes_and_charges.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:35:46',
+ 'creation': '2012-07-03 13:30:49',
'docstatus': 0,
- 'modified': '2012-03-27 14:35:46',
+ 'modified': '2012-07-12 14:08:27',
'modified_by': u'Administrator',
'owner': u'wasim@webnotestech.com'
},
@@ -24,7 +24,7 @@
'section_style': u'Tray',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 13
+ 'version': 1
},
# These values are common for all DocField
@@ -42,34 +42,6 @@
'name': u'Purchase Taxes and Charges'
},
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'category',
- 'fieldtype': u'Select',
- 'label': u'Category',
- 'oldfieldname': u'category',
- 'oldfieldtype': u'Select',
- 'options': u'\nFor Total\nFor Valuation\nFor Both',
- 'permlevel': 0,
- 'reqd': 1
- },
-
- # DocField
- {
- 'default': u'Add',
- 'doctype': u'DocField',
- 'fieldname': u'add_deduct_tax',
- 'fieldtype': u'Select',
- 'label': u'Add or Deduct',
- 'oldfieldname': u'add_deduct_tax',
- 'oldfieldtype': u'Select',
- 'options': u'\nAdd\nDeduct',
- 'permlevel': 0,
- 'reqd': 1,
- 'trigger': u'Client'
- },
-
# DocField
{
'doctype': u'DocField',
@@ -84,46 +56,6 @@
'trigger': u'Client'
},
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'row_id',
- 'fieldtype': u'Data',
- 'hidden': 0,
- 'label': u'Enter Row',
- 'oldfieldname': u'row_id',
- 'oldfieldtype': u'Data',
- 'permlevel': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'colour': u'White:FFF',
- 'doctype': u'DocField',
- 'fieldname': u'item_wise_tax_detail',
- 'fieldtype': u'Small Text',
- 'hidden': 1,
- 'label': u'Item Wise Tax Detail ',
- 'oldfieldname': u'item_wise_tax_detail',
- 'oldfieldtype': u'Small Text',
- 'permlevel': 1,
- 'print_hide': 1
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'description',
- 'fieldtype': u'Small Text',
- 'label': u'Description',
- 'oldfieldname': u'description',
- 'oldfieldtype': u'Small Text',
- 'permlevel': 0,
- 'reqd': 1,
- 'width': u'300px'
- },
-
# DocField
{
'doctype': u'DocField',
@@ -151,6 +83,19 @@
'trigger': u'Client'
},
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'description',
+ 'fieldtype': u'Small Text',
+ 'label': u'Description',
+ 'oldfieldname': u'description',
+ 'oldfieldtype': u'Small Text',
+ 'permlevel': 0,
+ 'reqd': 1,
+ 'width': u'300px'
+ },
+
# DocField
{
'doctype': u'DocField',
@@ -182,12 +127,70 @@
'doctype': u'DocField',
'fieldname': u'total',
'fieldtype': u'Currency',
- 'label': u'Aggregate Total',
+ 'label': u'Total',
'oldfieldname': u'total',
'oldfieldtype': u'Currency',
'permlevel': 1
},
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'row_id',
+ 'fieldtype': u'Data',
+ 'hidden': 0,
+ 'label': u'Enter Row',
+ 'oldfieldname': u'row_id',
+ 'oldfieldtype': u'Data',
+ 'permlevel': 0,
+ 'trigger': u'Client'
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'description': u'For Both',
+ 'doctype': u'DocField',
+ 'fieldname': u'category',
+ 'fieldtype': u'Select',
+ 'label': u'Consider Tax or Charge for',
+ 'oldfieldname': u'category',
+ 'oldfieldtype': u'Select',
+ 'options': u'Valuation and Total\nValuation\nTotal',
+ 'permlevel': 0,
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'default': u'Add',
+ 'doctype': u'DocField',
+ 'fieldname': u'add_deduct_tax',
+ 'fieldtype': u'Select',
+ 'label': u'Add or Deduct',
+ 'oldfieldname': u'add_deduct_tax',
+ 'oldfieldtype': u'Select',
+ 'options': u'Add\nDeduct',
+ 'permlevel': 0,
+ 'reqd': 1,
+ 'trigger': u'Client'
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'doctype': u'DocField',
+ 'fieldname': u'item_wise_tax_detail',
+ 'fieldtype': u'Small Text',
+ 'hidden': 1,
+ 'label': u'Item Wise Tax Detail ',
+ 'oldfieldname': u'item_wise_tax_detail',
+ 'oldfieldtype': u'Small Text',
+ 'permlevel': 1,
+ 'print_hide': 1
+ },
+
# DocField
{
'doctype': u'DocField',
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
index d3a32e92c0..fa2c836530 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js
@@ -22,7 +22,7 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) {
}
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-
+ cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
}
cur_frm.pformat.purchase_tax_details= function(doc){
@@ -74,7 +74,7 @@ cur_frm.cscript.add_deduct_tax = function(doc, cdt, cdn) {
alert("Please select Category first");
d.add_deduct_tax = '';
}
- else if(d.category != 'For Total' && d.add_deduct_tax == 'Deduct'){
+ else if(d.category != 'Total' && d.add_deduct_tax == 'Deduct'){
alert("You cannot Deduct when category is for valuation or for both(i.e total and valuation)");
d.add_deduct_tax = '';
}
@@ -91,8 +91,8 @@ cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
alert("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row");
d.charge_type = '';
}
- else if((d.category == 'For Valuation' || d.category == 'For Both') && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
- alert("You cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for valuation. You can select only 'For Total' option for previous row amount or previous row total")
+ else if((d.category == 'Valuation' || d.category == 'Valuation and Total') && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
+ alert("You cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for valuation. You can select only 'Total' option for previous row amount or previous row total")
d.charge_type = '';
}
validated = false;
diff --git a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt
index 1ecac405f3..8add7afa67 100644
--- a/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt
+++ b/erpnext/accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:35:51',
+ 'creation': '2012-07-03 13:30:50',
'docstatus': 0,
- 'modified': '2012-03-27 14:35:51',
+ 'modified': '2012-07-12 14:10:35',
'modified_by': u'Administrator',
'owner': u'wasim@webnotestech.com'
},
@@ -17,6 +17,7 @@
'autoname': u'field:title',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like "Shipping", "Insurance", "Handling" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on "Previous Row Total" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.\n10. Add or Deduct: Whether you want to add or deduct the tax.',
'doctype': 'DocType',
'document_type': u'Master',
'module': u'Accounts',
@@ -24,7 +25,7 @@
'section_style': u'Simple',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 18
+ 'version': 1
},
# These values are common for all DocField
@@ -106,17 +107,6 @@
'search_index': 0
},
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'company',
- 'fieldtype': u'Link',
- 'in_filter': 1,
- 'label': u'Company',
- 'options': u'Company',
- 'reqd': 1
- },
-
# DocField
{
'doctype': u'DocField',
@@ -126,5 +116,16 @@
'oldfieldname': u'purchase_tax_details',
'oldfieldtype': u'Table',
'options': u'Purchase Taxes and Charges'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'company',
+ 'fieldtype': u'Link',
+ 'in_filter': 1,
+ 'label': u'Company',
+ 'options': u'Company',
+ 'reqd': 1
}
-]
+]
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 82314ca133..eb869e5d08 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -40,18 +40,12 @@ class DocType(TransactionBase):
self.fname = 'entries'
- # Autoname
- # ---------
def autoname(self):
self.doc.name = make_autoname(self.doc.naming_series+ '.#####')
-
-# ********************************* Trigger Functions ******************************
-
- #Set retail related fields from pos settings
- #-------------------------------------------------------------------------
def set_pos_fields(self):
+ """Set retail related fields from pos settings"""
pos = webnotes.conn.sql("select * from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company), as_dict=1)
if not pos:
pos = webnotes.conn.sql("select * from `tabPOS Setting` where ifnull(user,'') = '' and company = '%s'" % (self.doc.company), as_dict=1)
@@ -79,9 +73,8 @@ class DocType(TransactionBase):
if self.doc.charge: self.get_other_charges()
- # Set default values related to pos for previously created sales invoice.
- # --------------------------------------------------------------------------
def set_pos_item_values(self):
+ """Set default values related to pos for previously created sales invoice."""
if cint(self.doc.is_pos) ==1:
dtl = webnotes.conn.sql("select income_account, warehouse, cost_center from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company), as_dict=1)
if not dtl:
@@ -94,10 +87,8 @@ class DocType(TransactionBase):
d.warehouse = item and item[0]['default_warehouse'] or dtl and dtl[0]['warehouse'] or d.warehouse
-
- # Get Account Head to which amount needs to be Debited based on Customer
- # ----------------------------------------------------------------------
def get_customer_account(self):
+ """Get Account Head to which amount needs to be Debited based on Customer"""
if not self.doc.company:
msgprint("Please select company first and re-select the customer after doing so", raise_exception=1)
@@ -115,10 +106,8 @@ class DocType(TransactionBase):
return acc_head and {'debit_to' : acc_head} or {}
-
- # Set Due Date = Posting Date + Credit Days
- # -----------------------------------------
def get_cust_and_due_date(self):
+ """Set Due Date = Posting Date + Credit Days"""
credit_days = 0
if self.doc.debit_to:
credit_days = webnotes.conn.sql("select credit_days from `tabAccount` where name='%s' and docstatus != 2" % self.doc.debit_to)
@@ -134,9 +123,8 @@ class DocType(TransactionBase):
self.doc.customer = webnotes.conn.get_value('Account',self.doc.debit_to,'master_name')
- # Pull Details of Delivery Note or Sales Order Selected
- # ------------------------------------------------------
def pull_details(self):
+ """Pull Details of Delivery Note or Sales Order Selected"""
# Delivery Note
if self.doc.delivery_note_main:
self.validate_prev_docname('delivery note')
@@ -153,14 +141,14 @@ class DocType(TransactionBase):
ret = self.get_debit_to()
self.doc.debit_to = ret.get('debit_to')
- # onload pull income account
- # --------------------------
+
def load_default_accounts(self):
"""
Loads default accounts from items, customer when called from mapper
"""
self.get_income_account('entries')
+
def get_income_account(self,doctype):
for d in getlist(self.doclist, doctype):
if d.item_code:
@@ -168,8 +156,7 @@ class DocType(TransactionBase):
d.income_account = item and item[0]['default_income_account'] or ''
d.cost_center = item and item[0]['default_sales_cost_center'] or ''
- # Item Details
- # -------------
+
def get_item_details(self, args=None):
import json
args = args and json.loads(args) or {}
@@ -215,61 +202,49 @@ class DocType(TransactionBase):
return get_obj('Sales Common').get_barcode_details(barcode)
- # Fetch ref rate from item master as per selected price list
def get_adj_percent(self, arg=''):
+ """Fetch ref rate from item master as per selected price list"""
get_obj('Sales Common').get_adj_percent(self)
- # Get tax rate if account type is tax
- # ------------------------------------
def get_rate(self,arg):
+ """Get tax rate if account type is tax"""
get_obj('Sales Common').get_rate(arg)
- # Get Commission rate of Sales Partner
- # -------------------------------------
def get_comm_rate(self, sales_partner):
+ """Get Commission rate of Sales Partner"""
return get_obj('Sales Common').get_comm_rate(sales_partner, self)
-
- # GET TERMS & CONDITIONS
- # -------------------------------------
+
def get_tc_details(self):
return get_obj('Sales Common').get_tc_details(self)
- # Load Default Charges
- # ----------------------------------------------------------
+
def load_default_taxes(self):
self.doclist = get_obj('Sales Common').load_default_taxes(self)
- # Get Sales Taxes and Charges Master Details
- # --------------------------
+
def get_other_charges(self):
self.doclist = get_obj('Sales Common').get_other_charges(self)
- # Get Advances
- # -------------
+
def get_advances(self):
self.doclist = get_obj('GL Control').get_advances(self, self.doc.debit_to, 'Sales Invoice Advance', 'advance_adjustment_details', 'credit')
- #pull project customer
- #-------------------------
+
def pull_project_customer(self):
res = webnotes.conn.sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name)
if res:
get_obj('DocType Mapper', 'Project-Sales Invoice').dt_map('Project', 'Sales Invoice', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Invoice']]")
-# ********************************** Server Utility Functions ******************************
-
- # Get Company Abbr.
- # ------------------
+
def get_company_abbr(self):
return webnotes.conn.sql("select abbr from tabCompany where name=%s", self.doc.company)[0][0]
-
- # Check whether sales order / delivery note items already pulled
- #----------------------------------------------------------------
+
def validate_prev_docname(self,doctype):
+ """Check whether sales order / delivery note items already pulled"""
for d in getlist(self.doclist, 'entries'):
if doctype == 'delivery note' and self.doc.delivery_note_main == d.delivery_note:
msgprint(cstr(self.doc.delivery_note_main) + " delivery note details have already been pulled.")
@@ -279,7 +254,6 @@ class DocType(TransactionBase):
raise Exception , "Validation Error. Sales order details have already been pulled."
- #-----------------------------------------------------------------
def update_against_document_in_jv(self):
"""
Links invoice and advance voucher:
@@ -308,11 +282,8 @@ class DocType(TransactionBase):
get_obj('GL Control').reconcile_against_document(lst)
- # ------------------------------------------------------------------------
def validate_customer(self):
- """
- Validate customer name with SO and DN
- """
+ """ Validate customer name with SO and DN"""
for d in getlist(self.doclist,'entries'):
dt = d.delivery_note and 'Delivery Note' or d.sales_order and 'Sales Order' or ''
if dt:
@@ -322,9 +293,8 @@ class DocType(TransactionBase):
msgprint("Customer %s does not match with customer of %s: %s." %(self.doc.customer, dt, dt_no), raise_exception=1)
- # Validates Debit To Account and Customer Matches
- # ------------------------------------------------
- def validate_debit_to_acc(self):
+ def validate_customer_account(self):
+ """Validates Debit To Account and Customer Matches"""
if self.doc.customer and self.doc.debit_to and not cint(self.doc.is_pos):
acc_head = webnotes.conn.sql("select master_name from `tabAccount` where name = %s and docstatus != 2", self.doc.debit_to)
@@ -334,11 +304,6 @@ class DocType(TransactionBase):
and Master Name in account master." %(self.doc.debit_to, self.doc.customer,self.doc.company), raise_exception=1)
- # Validate Debit To Account
- # 1. Account Exists
- # 2. Is a Debit Account
- # 3. Is a PL Account
- # ---------------------------
def validate_debit_acc(self):
acc = webnotes.conn.sql("select debit_or_credit, is_pl_account from tabAccount where name = '%s' and docstatus != 2" % self.doc.debit_to)
if not acc:
@@ -352,9 +317,8 @@ class DocType(TransactionBase):
raise Exception
- # Validate Fixed Asset Account and whether Income Account Entered Exists
- # -----------------------------------------------------------------------
def validate_fixed_asset_account(self):
+ """Validate Fixed Asset Account and whether Income Account Entered Exists"""
for d in getlist(self.doclist,'entries'):
item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now())"% d.item_code)
acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account)
@@ -366,22 +330,16 @@ class DocType(TransactionBase):
raise Exception
-
- # Set totals in words
- #--------------------
def set_in_words(self):
dcc = TransactionBase().get_company_currency(self.doc.company)
self.doc.in_words = get_obj('Sales Common').get_total_in_words(dcc, self.doc.rounded_total)
self.doc.in_words_export = get_obj('Sales Common').get_total_in_words(self.doc.currency, self.doc.rounded_total_export)
- # Clear Advances
- # --------------
+
def clear_advances(self):
get_obj('GL Control').clear_advances(self, 'Sales Invoice Advance','advance_adjustment_details')
- # set aging date
- #-------------------
def set_aging_date(self):
if self.doc.is_opening != 'Yes':
self.doc.aging_date = self.doc.posting_date
@@ -390,20 +348,21 @@ class DocType(TransactionBase):
raise Exception
- # Set against account for debit to account
- #------------------------------------------
def set_against_income_account(self):
+ """Set against account for debit to account"""
against_acc = []
for d in getlist(self.doclist, 'entries'):
if d.income_account not in against_acc:
against_acc.append(d.income_account)
self.doc.against_income_account = ','.join(against_acc)
+
def add_remarks(self):
if not self.doc.remarks: self.doc.remarks = 'No Remarks'
- #check in manage account if sales order / delivery note required or not.
+
def so_dn_required(self):
+ """check in manage account if sales order / delivery note required or not."""
dict = {'Sales Order':'so_required','Delivery Note':'dn_required'}
for i in dict:
res = webnotes.conn.sql("select value from `tabSingles` where doctype = 'Global Defaults' and field = '%s'"%dict[i])
@@ -413,9 +372,9 @@ class DocType(TransactionBase):
msgprint("%s No. required against item %s"%(i,d.item_code))
raise Exception
- #check for does customer belong to same project as entered..
- #-------------------------------------------------------------------------------------------------
+
def validate_proj_cust(self):
+ """check for does customer belong to same project as entered.."""
if self.doc.project_name and self.doc.customer:
res = webnotes.conn.sql("select name from `tabProject` where name = '%s' and (customer = '%s' or ifnull(customer,'')='')"%(self.doc.project_name, self.doc.customer))
if not res:
@@ -431,20 +390,13 @@ class DocType(TransactionBase):
raise Exception
- # ********* UPDATE CURRENT STOCK *****************************
- def update_current_stock(self):
- for d in getlist(self.doclist, 'entries'):
- bin = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
- d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
-
def validate_item_code(self):
for d in getlist(self.doclist, 'entries'):
if not d.item_code:
msgprint("Please enter Item Code at line no : %s to update stock for POS or remove check from Update Stock in Basic Info Tab." % (d.idx))
raise Exception
- # Validate Write Off Account
- # -------------------------------
+
def validate_write_off_account(self):
if flt(self.doc.write_off_amount) and not self.doc.write_off_account:
msgprint("Please enter Write Off Account", raise_exception=1)
@@ -457,12 +409,22 @@ class DocType(TransactionBase):
and parent = %s""", (self.doc.amended_from, self.doc.c_form_no))
webnotes.conn.set(self.doc, 'c_form_no', '')
+
+
+ def update_current_stock(self):
+ for d in getlist(self.doclist, 'entries'):
+ if d.item_code and d.warehouse:
+ bin = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
+ d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
+
+ for d in getlist(self.doclist, 'packing_details'):
+ bin = sql("select actual_qty, projected_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
+ d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
+ d.projected_qty = bin and flt(bin[0]['projected_qty']) or 0
- # VALIDATE
- # ====================================================================================
+
def validate(self):
self.so_dn_required()
- #self.dn_required()
self.validate_proj_cust()
sales_com_obj = get_obj('Sales Common')
sales_com_obj.check_stop_sales_order(self)
@@ -472,7 +434,7 @@ class DocType(TransactionBase):
sales_com_obj.get_allocated_sum(self) # this is to verify that the allocated % of sales persons is 100%
sales_com_obj.validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Posting Date')
self.validate_customer()
- self.validate_debit_to_acc()
+ self.validate_customer_account()
self.validate_debit_acc()
self.validate_fixed_asset_account()
self.add_remarks()
@@ -480,7 +442,9 @@ class DocType(TransactionBase):
self.validate_pos()
self.validate_write_off_account()
if cint(self.doc.update_stock):
- get_obj('Stock Ledger').validate_serial_no(self, 'entries')
+ sl = get_obj('Stock Ledger')
+ sl.validate_serial_no(self, 'entries')
+ sl.validate_serial_no(self, 'packing_details')
self.validate_item_code()
self.update_current_stock()
self.set_in_words()
@@ -488,14 +452,62 @@ class DocType(TransactionBase):
self.doc.is_opening = 'No'
self.set_aging_date()
self.clear_advances()
- # Set against account
self.set_against_income_account()
self.validate_c_form()
+
+ def get_warehouse(self):
+ w = webnotes.conn.sql("select warehouse from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company))
+ w = w and w[0][0] or ''
+ if not w:
+ ps = webnotes.conn.sql("select name, warehouse from `tabPOS Setting` where ifnull(user,'') = '' and company = '%s'" % self.doc.company)
+ if not ps:
+ msgprint("To make POS entry, please create POS Setting from Accounts --> POS Setting page and refresh the system.")
+ raise Exception
+ elif not ps[0][1]:
+ msgprint("Please enter warehouse in POS Setting")
+ else:
+ w = ps[0][1]
+ return w
+
+
+ def make_packing_list(self):
+ get_obj('Sales Common').make_packing_list(self,'entries')
+ sl = get_obj('Stock Ledger')
+ sl.scrub_serial_nos(self)
+ sl.scrub_serial_nos(self, 'packing_details')
+
+
+ def on_update(self):
+ # Set default warehouse from pos setting
+ if cint(self.doc.is_pos) == 1:
+ if cint(self.doc.update_stock) == 1:
+ w = self.get_warehouse()
+ if w:
+ for d in getlist(self.doclist, 'entries'):
+ if not d.warehouse:
+ d.warehouse = cstr(w)
+
+ self.make_packing_list()
+ else:
+ self.doclist = self.doc.clear_table(self.doclist, 'packing_details')
+
+ if flt(self.doc.paid_amount) == 0:
+ if self.doc.cash_bank_account:
+ webnotes.conn.set(self.doc, 'paid_amount',
+ (flt(self.doc.grand_total) - flt(self.doc.write_off_amount)))
+ else:
+ # show message that the amount is not paid
+ webnotes.conn.set(self.doc,'paid_amount',0)
+ webnotes.msgprint("Note: Payment Entry will not be created since 'Cash/Bank Account' was not specified.")
+
+ else:
+ self.doclist = self.doc.clear_table(self.doclist, 'packing_details')
+ webnotes.conn.set(self.doc,'paid_amount',0)
+
+ webnotes.conn.set(self.doc,'outstanding_amount',flt(self.doc.grand_total) - flt(self.doc.total_advance) - flt(self.doc.paid_amount) - flt(self.doc.write_off_amount))
+
-# *************************************************** ON SUBMIT **********************************************
- # Check Ref Document's docstatus
- # -------------------------------
def check_prev_docstatus(self):
for d in getlist(self.doclist,'entries'):
if d.sales_order:
@@ -511,56 +523,45 @@ class DocType(TransactionBase):
raise Exception , "Validation Error."
- #Set Actual Qty based on item code and warehouse
- #------------------------------------------------------
- def set_actual_qty(self):
- for d in getlist(self.doclist, 'entries'):
- if d.item_code and d.warehouse:
- actual_qty = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (d.item_code, d.warehouse))
- d.actual_qty = actual_qty and flt(actual_qty[0][0]) or 0
-
-
-
- # ********************** Make Stock Entry ************************************
def make_sl_entry(self, d, wh, qty, in_value, update_stock):
- st_uom = webnotes.conn.sql("select stock_uom from `tabItem` where name = '%s'"%d.item_code)
+ st_uom = webnotes.conn.sql("select stock_uom from `tabItem` where name = '%s'"%d['item_code'])
self.values.append({
- 'item_code' : d.item_code,
+ 'item_code' : d['item_code'],
'warehouse' : wh,
'transaction_date' : getdate(self.doc.modified).strftime('%Y-%m-%d'),
'posting_date' : self.doc.posting_date,
'posting_time' : self.doc.posting_time,
'voucher_type' : 'Sales Invoice',
'voucher_no' : cstr(self.doc.name),
- 'voucher_detail_no' : cstr(d.name),
+ 'voucher_detail_no' : cstr(d['name']),
'actual_qty' : qty,
'stock_uom' : st_uom and st_uom[0][0] or '',
'incoming_rate' : in_value,
'company' : self.doc.company,
'fiscal_year' : self.doc.fiscal_year,
'is_cancelled' : (update_stock==1) and 'No' or 'Yes',
- 'batch_no' : cstr(d.batch_no),
- 'serial_no' : d.serial_no
- })
+ 'batch_no' : cstr(d['batch_no']),
+ 'serial_no' : d['serial_no']
+ })
- # UPDATE STOCK LEDGER
- # ---------------------------------------------------------------------------
- def update_stock_ledger(self, update_stock, clear = 0):
+ def update_stock_ledger(self, update_stock):
self.values = []
- for d in getlist(self.doclist, 'entries'):
- stock_item = webnotes.conn.sql("SELECT is_stock_item, is_sample_item FROM tabItem where name = '%s'"%(d.item_code), as_dict = 1) # stock ledger will be updated only if it is a stock item
+ items = get_obj('Sales Common').get_item_list(self)
+ for d in items:
+ stock_item = webnotes.conn.sql("SELECT is_stock_item, is_sample_item \
+ FROM tabItem where name = '%s'"%(d['item_code']), as_dict = 1)
if stock_item[0]['is_stock_item'] == "Yes":
+ if not d['warehouse']:
+ msgprint("Message: Please enter Warehouse for item %s as it is stock item." \
+ % d['item_code'], raise_exception=1)
+
# Reduce actual qty from warehouse
- self.make_sl_entry( d, d.warehouse, - flt(d.qty) , 0, update_stock)
- get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values, self.doc.amended_from and 'Yes' or 'No')
-
-
- #-------------------POS Stock Updatation Part----------------------------------------------
- def pos_update_stock(self):
- self.update_stock_ledger(update_stock = 1)
+ self.make_sl_entry( d, d['warehouse'], - flt(d['qty']) , 0, update_stock)
+
+ get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values)
- # ********** Get Actual Qty of item in warehouse selected *************
+
def get_actual_qty(self,args):
args = eval(args)
actual_qty = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (args['item_code'], args['warehouse']), as_dict=1)
@@ -569,23 +570,39 @@ class DocType(TransactionBase):
}
return ret
- # Make GL Entries
- # -------------------------
+
def make_gl_entries(self, is_cancel=0):
mapper = self.doc.is_pos and self.doc.write_off_account and 'POS with write off' or self.doc.is_pos and not self.doc.write_off_account and 'POS' or ''
update_outstanding = self.doc.is_pos and self.doc.write_off_account and 'No' or 'Yes'
get_obj(dt='GL Control').make_gl_entries(self.doc, self.doclist,cancel = is_cancel, use_mapper = mapper, update_outstanding = update_outstanding, merge_entries = cint(self.doc.is_pos) != 1 and 1 or 0)
- # On Submit
- # ---------
+ def update_c_form(self):
+ """Update amended id in C-form"""
+ if self.doc.c_form_no and self.doc.amended_from:
+ webnotes.conn.sql("""update `tabC-Form Invoice Detail` set invoice_no = %s,
+ invoice_date = %s, territory = %s, net_total = %s,
+ grand_total = %s where invoice_no = %s and parent = %s""", (self.doc.name, self.doc.amended_from, self.doc.c_form_no))
+
+
+ def check_next_docstatus(self):
+ submit_jv = webnotes.conn.sql("select t1.name from `tabJournal Voucher` t1,`tabJournal Voucher Detail` t2 where t1.name = t2.parent and t2.against_invoice = '%s' and t1.docstatus = 1" % (self.doc.name))
+ if submit_jv:
+ msgprint("Journal Voucher : " + cstr(submit_jv[0][0]) + " has been created against " + cstr(self.doc.doctype) + ". So " + cstr(self.doc.doctype) + " cannot be Cancelled.")
+ raise Exception, "Validation Error."
+
+
def on_submit(self):
if cint(self.doc.is_pos) == 1:
if cint(self.doc.update_stock) == 1:
sl_obj = get_obj("Stock Ledger")
sl_obj.validate_serial_no_warehouse(self, 'entries')
+ sl_obj.validate_serial_no_warehouse(self, 'packing_details')
+
sl_obj.update_serial_record(self, 'entries', is_submit = 1, is_incoming = 0)
- self.pos_update_stock()
+ sl_obj.update_serial_record(self, 'packing_details', is_submit = 1, is_incoming = 0)
+
+ self.update_stock_ledger(update_stock=1)
else:
self.check_prev_docstatus()
get_obj("Sales Common").update_prevdoc_detail(1,self)
@@ -603,31 +620,13 @@ class DocType(TransactionBase):
self.update_c_form()
- def update_c_form(self):
- """Update amended id in C-form"""
- if self.doc.c_form_no and self.doc.amended_from:
- webnotes.conn.sql("""update `tabC-Form Invoice Detail` set invoice_no = %s,
- invoice_date = %s, territory = %s, net_total = %s,
- grand_total = %s where invoice_no = %s and parent = %s""", (self.doc.name, self.doc.amended_from, self.doc.c_form_no))
-
-
-
-# *************************************************** ON CANCEL **********************************************
- # Check Next Document's docstatus
- # --------------------------------
- def check_next_docstatus(self):
- submit_jv = webnotes.conn.sql("select t1.name from `tabJournal Voucher` t1,`tabJournal Voucher Detail` t2 where t1.name = t2.parent and t2.against_invoice = '%s' and t1.docstatus = 1" % (self.doc.name))
- if submit_jv:
- msgprint("Journal Voucher : " + cstr(submit_jv[0][0]) + " has been created against " + cstr(self.doc.doctype) + ". So " + cstr(self.doc.doctype) + " cannot be Cancelled.")
- raise Exception, "Validation Error."
-
-
- # On Cancel
- # ----------
def on_cancel(self):
if cint(self.doc.is_pos) == 1:
if cint(self.doc.update_stock) == 1:
- get_obj('Stock Ledger').update_serial_record(self, 'entries', is_submit = 0, is_incoming = 0)
+ sl = get_obj('Stock Ledger')
+ sl.update_serial_record(self, 'entries', is_submit = 0, is_incoming = 0)
+ sl.update_serial_record(self, 'packing_details', is_submit = 0, is_incoming = 0)
+
self.update_stock_ledger(update_stock = -1)
else:
sales_com_obj = get_obj(dt = 'Sales Common')
@@ -636,51 +635,6 @@ class DocType(TransactionBase):
sales_com_obj.update_prevdoc_detail(0,self)
self.make_gl_entries(is_cancel=1)
-
- # Get Warehouse
- def get_warehouse(self):
- w = webnotes.conn.sql("select warehouse from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company))
- w = w and w[0][0] or ''
- if not w:
- ps = webnotes.conn.sql("select name, warehouse from `tabPOS Setting` where ifnull(user,'') = '' and company = '%s'" % self.doc.company)
- if not ps:
- msgprint("To make POS entry, please create POS Setting from Setup --> Accounts --> POS Setting and refresh the system.")
- raise Exception
- elif not ps[0][1]:
- msgprint("Please enter warehouse in POS Setting")
- else:
- w = ps[0][1]
- return w
-
- # on update
- def on_update(self):
- # Set default warehouse from pos setting
- #----------------------------------------
- if cint(self.doc.is_pos) == 1:
- self.set_actual_qty()
- w = self.get_warehouse()
- if w:
- for d in getlist(self.doclist, 'entries'):
- if not d.warehouse:
- d.warehouse = cstr(w)
-
- if flt(self.doc.paid_amount) == 0:
- if self.doc.cash_bank_account:
- webnotes.conn.set(self.doc, 'paid_amount',
- (flt(self.doc.grand_total) - flt(self.doc.write_off_amount)))
- else:
- # show message that the amount is not paid
- webnotes.conn.set(self.doc,'paid_amount',0)
- webnotes.msgprint("Note: Payment Entry not created since 'Cash/Bank Account' was not specified.")
-
- else:
- webnotes.conn.set(self.doc,'paid_amount',0)
-
- webnotes.conn.set(self.doc,'outstanding_amount',flt(self.doc.grand_total) - flt(self.doc.total_advance) - flt(self.doc.paid_amount) - flt(self.doc.write_off_amount))
-
- #-------------------------------------------------------------------------------------
- def on_update_after_submit(self):
- self.convert_into_recurring()
def convert_into_recurring(self):
@@ -717,3 +671,7 @@ class DocType(TransactionBase):
next_date = next_date.strftime("%Y-%m-%d")
webnotes.conn.set(self.doc, 'next_date', next_date)
+
+
+ def on_update_after_submit(self):
+ self.convert_into_recurring()
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
index 969a7dc6d7..a2b341fd4f 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-06-11 12:09:54',
+ 'creation': '2012-07-05 11:04:09',
'docstatus': 0,
- 'modified': '2012-06-17 21:37:40',
+ 'modified': '2012-07-11 12:19:49',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -350,6 +350,16 @@
'permlevel': 0
},
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'sales_bom_help',
+ 'fieldtype': u'HTML',
+ 'label': u'Sales BOM Help',
+ 'permlevel': 0,
+ 'print_hide': 1
+ },
+
# DocField
{
'doctype': u'DocField',
@@ -1343,6 +1353,27 @@
'print_hide': 1
},
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'packing_list',
+ 'fieldtype': u'Section Break',
+ 'label': u'Packing List',
+ 'permlevel': 0,
+ 'print_hide': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'packing_details',
+ 'fieldtype': u'Table',
+ 'label': u'Packing Details',
+ 'options': u'Delivery Note Packing Item',
+ 'permlevel': 0,
+ 'print_hide': 1
+ },
+
# DocField
{
'doctype': u'DocField',
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.txt b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.txt
index 2a25a6a61e..66d7aae835 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.txt
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges/sales_taxes_and_charges.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-05-15 12:14:34',
+ 'creation': '2012-07-04 16:40:13',
'docstatus': 0,
- 'modified': '2012-07-04 13:27:05',
+ 'modified': '2012-07-12 13:50:43',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -113,7 +113,7 @@
'doctype': u'DocField',
'fieldname': u'tax_amount',
'fieldtype': u'Currency',
- 'label': u'Amount*',
+ 'label': u'Amount',
'oldfieldname': u'tax_amount',
'oldfieldtype': u'Currency',
'permlevel': 0,
@@ -126,7 +126,7 @@
'doctype': u'DocField',
'fieldname': u'total',
'fieldtype': u'Currency',
- 'label': u'Total*',
+ 'label': u'Total',
'oldfieldname': u'total',
'oldfieldtype': u'Currency',
'permlevel': 1
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
index bae6b74d27..16bf1bb6d9 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.js
@@ -19,9 +19,9 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) {
//
}
-/*cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-
-}*/
+cur_frm.cscript.refresh = function(doc, cdt, cdn) {
+ cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
+}
// For customizing print
cur_frm.pformat.net_total = function(doc) {
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py
index f5342edf5f..1750e51282 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.py
@@ -8,43 +8,25 @@
#
# 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 .
+# along with this program. If not, see .
-# 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
-
-# -----------------------------------------------------------------------------------------
-
-
class DocType:
- def __init__(self, doc, doclist=[]):
- self.doc = doc
- self.doclist = doclist
+ def __init__(self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
- # Get Tax Rate if account type is Tax
- # ===================================================================
- def get_rate(self, arg):
- get_obj('Sales Common').get_rate(arg, self)
+ def get_rate(self, arg):
+ from webnotes.model.code import get_obj
+ return get_obj('Sales Common').get_rate(arg, self)
- def update_other_default_charges(self):
- sql("update `tabSales Taxes and Charges Master` set is_default = 0 where ifnull(is_default,0) = 1 and name != '%s' and company = '%s'" % (self.doc.name, self.doc.company))
+ def update_other_default_charges(self):
+ webnotes.conn.sql("update `tabSales Taxes and Charges Master` set is_default = 0 where ifnull(is_default,0) = 1 and name != '%s' and company = '%s'" % (self.doc.name, self.doc.company))
- def on_update(self):
- self.update_other_default_charges()
+ def on_update(self):
+ self.update_other_default_charges()
diff --git a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt
index 655269c26e..1707bf4cfb 100644
--- a/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt
+++ b/erpnext/accounts/doctype/sales_taxes_and_charges_master/sales_taxes_and_charges_master.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:22',
+ 'creation': '2012-07-03 13:30:46',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:22',
+ 'modified': '2012-07-12 13:43:32',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,6 +17,7 @@
'autoname': u'field:title',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like "Shipping", "Insurance", "Handling" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on "Previous Row Total" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.',
'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
@@ -33,7 +34,8 @@
'name': '__common__',
'parent': u'Sales Taxes and Charges Master',
'parentfield': u'fields',
- 'parenttype': u'DocType'
+ 'parenttype': u'DocType',
+ 'permlevel': 0
},
# These values are common for all DocPerm
@@ -52,6 +54,42 @@
'name': u'Sales Taxes and Charges Master'
},
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Sales Master Manager',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Sales User',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Sales User',
+ 'submit': 0,
+ 'write': 0
+ },
+
# DocPerm
{
'amend': 0,
@@ -86,63 +124,6 @@
'write': 1
},
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Sales Master Manager',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Sales User',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Sales User',
- 'submit': 0,
- 'write': 0
- },
-
- # 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'other_charges_details',
- 'fieldtype': u'Section Break',
- 'label': u'Other Charges Details',
- 'oldfieldtype': u'Section Break',
- 'permlevel': 0
- },
-
# DocField
{
'doctype': u'DocField',
@@ -152,7 +133,6 @@
'label': u'Title',
'oldfieldname': u'title',
'oldfieldtype': u'Data',
- 'permlevel': 0,
'reqd': 1,
'search_index': 0
},
@@ -162,8 +142,20 @@
'doctype': u'DocField',
'fieldname': u'is_default',
'fieldtype': u'Check',
- 'label': u'Default',
- 'permlevel': 0
+ 'label': u'Default'
+ },
+
+ # DocField
+ {
+ 'colour': u'White:FFF',
+ 'description': u'* Will be calculated in the transaction.',
+ 'doctype': u'DocField',
+ 'fieldname': u'other_charges',
+ 'fieldtype': u'Table',
+ 'label': u'Sales Taxes and Charges Master',
+ 'oldfieldname': u'other_charges',
+ 'oldfieldtype': u'Table',
+ 'options': u'Sales Taxes and Charges'
},
# DocField
@@ -176,20 +168,7 @@
'oldfieldname': u'company',
'oldfieldtype': u'Link',
'options': u'Company',
- 'permlevel': 0,
'reqd': 1,
'search_index': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'other_charges',
- 'fieldtype': u'Table',
- 'label': u'Sales Taxes and Charges Master',
- 'oldfieldname': u'other_charges',
- 'oldfieldtype': u'Table',
- 'options': u'Sales Taxes and Charges',
- 'permlevel': 0
}
-]
+]
\ No newline at end of file
diff --git a/erpnext/accounts/page/accounts_browser/accounts_browser.js b/erpnext/accounts/page/accounts_browser/accounts_browser.js
index 734e4de18a..5bc2e3588e 100644
--- a/erpnext/accounts/page/accounts_browser/accounts_browser.js
+++ b/erpnext/accounts/page/accounts_browser/accounts_browser.js
@@ -62,7 +62,11 @@ pscript['onload_Accounts Browser'] = function(wrapper){
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 Accounts');
if(erpnext.account_chart && erpnext.account_chart.ctype != ctype) {
wrapper.$company_select.change();
@@ -151,13 +155,12 @@ erpnext.AccountsChart = Class.extend({
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 @@ erpnext.AccountsChart = Class.extend({
$(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 @@ erpnext.AccountsChart = Class.extend({
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 @@ erpnext.AccountsChart = Class.extend({
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/hr/doctype/salary_manager/salary_manager.py b/erpnext/hr/doctype/salary_manager/salary_manager.py
index 111366b918..a0cbb70e1d 100644
--- a/erpnext/hr/doctype/salary_manager/salary_manager.py
+++ b/erpnext/hr/doctype/salary_manager/salary_manager.py
@@ -24,7 +24,6 @@ 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
@@ -46,14 +45,14 @@ class DocType:
"""
cond = self.get_filter_condition()
+ cond += self.get_joining_releiving_condition()
emp_list = sql("""
select t1.name
from `tabEmployee` t1, `tabSalary Structure` t2
where t1.docstatus!=2 and t2.docstatus != 2
- and ifnull(t1.status, 'Left') = 'Active' and ifnull(t2.is_active, 'No') = 'Yes'
and t1.name = t2.employee
- %s """% cond)
+ %s """% cond, debug=1)
return emp_list
@@ -64,9 +63,19 @@ class DocType:
cond = ''
for f in ['company', 'branch', 'department', 'designation', 'grade']:
if self.doc.fields.get(f):
- cond += " and t1." + f + " = '" + self.doc.fields.get(f) + "'"
-
+ cond += " and t1." + f + " = '" + self.doc.fields.get(f) + "'"
+
return cond
+
+
+ def get_joining_releiving_condition(self):
+ m = self.get_month_details(self.doc.fiscal_year, self.doc.month)
+ cond = """
+ and ifnull(t1.date_of_joining, '0000-00-00') <= '%(month_end_date)s'
+ and ifnull(t1.relieving_date, '2199-12-31') >= '%(month_start_date)s'
+ """ % m
+ return cond
+
def check_mandatory(self):
@@ -74,6 +83,26 @@ class DocType:
if not self.doc.fields[f]:
msgprint("Please select %s to proceed" % f, raise_exception=1)
+
+ def get_month_details(self, year, month):
+ ysd = sql("select year_start_date from `tabFiscal Year` where name ='%s'"%year)[0][0]
+ if ysd:
+ from dateutil.relativedelta import relativedelta
+ import calendar, datetime
+ diff_mnt = cint(month)-cint(ysd.month)
+ if diff_mnt<0:
+ diff_mnt = 12-int(ysd.month)+cint(month)
+ msd = ysd + relativedelta(months=diff_mnt) # month start date
+ month_days = cint(calendar.monthrange(cint(msd.year) ,cint(month))[1]) # days in month
+ med = datetime.date(msd.year, cint(month), month_days) # month end date
+ return {
+ 'year': msd.year,
+ 'month_start_date': msd,
+ 'month_end_date': med,
+ 'month_days': month_days
+ }
+
+
def create_sal_slip(self):
"""
@@ -82,12 +111,7 @@ class DocType:
"""
emp_list = self.get_emp_list()
- log = ""
- if emp_list:
- log = "
Following Salary Slip has been created:
SAL SLIP ID
EMPLOYEE NAME
"
- else:
- log = "
No employee found for the above selected criteria
"
-
+ ss_list = []
for emp in emp_list:
if not sql("""select name from `tabSalary Slip`
where docstatus!= 2 and employee = %s and month = %s and fiscal_year = %s and company = %s
@@ -111,9 +135,18 @@ class DocType:
for d in getlist(ss_obj.doclist, 'deduction_details'):
d.save()
- log += '
' + ss.name + '
' + ss_obj.doc.employee_name + '
'
- log += '
'
- return log
+ ss_list.append(ss.name)
+
+ return self.create_log(ss_list)
+
+
+ def create_log(self, ss_list):
+ log = "No employee for the above selected criteria OR salary slip already created"
+ if ss_list:
+ log = "Created Salary Slip has been created: \
+
%s" % ' '.join(ss_list)
+ return log
+
def get_sal_slip_list(self):
"""
@@ -132,28 +165,49 @@ class DocType:
"""
Submit all salary slips based on selected criteria
"""
- ss_list = self.get_sal_slip_list()
- log = ""
- if ss_list:
- log = """
-
-
Following Salary Slip has been submitted:
-
-
-
SAL SLIP ID
-
EMPLOYEE NAME
-
- """
- else:
- log = "
No salary slip found to submit for the above selected criteria
"
-
+ ss_list = self.get_sal_slip_list()
+ not_submitted_ss = []
for ss in ss_list:
ss_obj = get_obj("Salary Slip",ss[0],with_children=1)
- set(ss_obj.doc, 'docstatus', 1)
- ss_obj.on_submit()
+ try:
+ webnotes.conn.set(ss_obj.doc, 'email_check', cint(self.doc.send_mail))
+ if cint(self.doc.send_email) == 1:
+ ss_obj.send_mail_funct()
+
+ webnotes.conn.set(ss_obj.doc, 'docstatus', 1)
+ except Exception,e:
+ not_submitted_ss.append(ss[0])
+ msgprint(e)
+ continue
+
+ return self.create_submit_log(ss_list, not_submitted_ss)
+
+
+ def create_submit_log(self, all_ss, not_submitted_ss):
+ log = ''
+ if not all_ss:
+ log = "No salary slip found to submit for the above selected criteria"
+ else:
+ all_ss = [d[0] for d in all_ss]
- log += '
' + ss[0] + '
' + ss_obj.doc.employee_name + '
'
- log += '
'
+ submitted_ss = list(set(all_ss) - set(not_submitted_ss))
+ if submitted_ss:
+ mail_sent_msg = self.doc.send_email and " (Mail has been sent to the employee)" or ""
+ log = """
+ Submitted Salary Slips%s:\
+
\
+ For 'Sales BOM' items, warehouse, serial no and batch no \
+ will be considered from the 'Packing List' table. \
+ If warehouse and batch no are same for all packing items for any 'Sales BOM' item, \
+ those values can be entered in the main item table, values will be copied to 'Packing List' table. \
+
";
+ get_field(doc.doctype, 'sales_bom_help', doc.name).options = help_msg;
+ }
+ } else {
+ $(cur_frm.fields_dict.packing_list.row.wrapper).toggle(false);
+ if (inList(['Delivery Note', 'Sales Invoice'], doc.doctype)) {
+ get_field(doc.doctype, 'sales_bom_help', doc.name).options = '';
+ }
+ }
+ refresh_field('sales_bom_help');
+}
+
// hide / unhide price list currency based on availability of price list in customer's currency
//---------------------------------------------------------------------------------------------------
@@ -340,7 +364,12 @@ cur_frm.cscript.export_rate = function(doc,cdt,cdn) {
// ************* 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/doctype/sales_common/sales_common.py b/erpnext/selling/doctype/sales_common/sales_common.py
index 74963fbc07..a658209596 100644
--- a/erpnext/selling/doctype/sales_common/sales_common.py
+++ b/erpnext/selling/doctype/sales_common/sales_common.py
@@ -385,7 +385,7 @@ class DocType(TransactionBase):
return ret
- def get_item_list(self, obj, is_stopped):
+ def get_item_list(self, obj, is_stopped=0):
"""get item list"""
il = []
for d in getlist(obj.doclist,obj.fname):
@@ -394,7 +394,7 @@ class DocType(TransactionBase):
if is_stopped:
qty = flt(d.qty) > flt(d.delivered_qty) and flt(flt(d.qty) - flt(d.delivered_qty)) or 0
- if d.prevdoc_doctype == 'Sales Order':
+ if d.prevdoc_doctype == 'Sales Order':
# used in delivery note to reduce reserved_qty
# Eg.: if SO qty is 10 and there is tolerance of 20%, then it will allow DN of 12.
# But in this case reserved qty should only be reduced by 10 and not 12.
@@ -413,7 +413,7 @@ class DocType(TransactionBase):
if p.parent_detail_docname == d.name:
# the packing details table's qty is already multiplied with parent's qty
il.append({
- 'warehouse': d.warehouse,
+ 'warehouse': p.warehouse,
'reserved_warehouse': reserved_wh,
'item_code': p.item_code,
'qty': flt(p.qty),
@@ -496,23 +496,21 @@ class DocType(TransactionBase):
pi.qty = flt(qty)
pi.actual_qty = bin and flt(bin['actual_qty']) or 0
pi.projected_qty = bin and flt(bin['projected_qty']) or 0
- pi.warehouse = warehouse
pi.prevdoc_doctype = line.prevdoc_doctype
- if packing_item_code == line.item_code:
- pi.serial_no = cstr(line.serial_no)
+ if not pi.warehouse:
+ pi.warehouse = warehouse
+ if not pi.batch_no:
pi.batch_no = cstr(line.batch_no)
pi.idx = self.packing_list_idx
- # has to be saved, since this function is called on_update of delivery note
+ # saved, since this function is called on_update of delivery note
pi.save()
self.packing_list_idx += 1
- # ------------------
- # make packing list from sales bom if exists or directly copy item with balance
- # ------------------
def make_packing_list(self, obj, fname):
+ """make packing list for sales bom item"""
self.packing_list_idx = 0
parent_items = []
for d in getlist(obj.doclist, fname):
@@ -520,10 +518,9 @@ class DocType(TransactionBase):
if self.has_sales_bom(d.item_code):
for i in self.get_sales_bom_items(d.item_code):
self.update_packing_list_item(obj, i['item_code'], flt(i['qty'])*flt(d.qty), warehouse, d)
- else:
- self.update_packing_list_item(obj, d.item_code, d.qty, warehouse, d)
- if [d.item_code, d.name] not in parent_items:
- parent_items.append([d.item_code, d.name])
+
+ if [d.item_code, d.name] not in parent_items:
+ parent_items.append([d.item_code, d.name])
self.cleanup_packing_list(obj, parent_items)
diff --git a/erpnext/selling/page/sales_browser/sales_browser.js b/erpnext/selling/page/sales_browser/sales_browser.js
index 66e1d52bc0..c98e0e47df 100644
--- a/erpnext/selling/page/sales_browser/sales_browser.js
+++ b/erpnext/selling/page/sales_browser/sales_browser.js
@@ -31,7 +31,12 @@ pscript['onload_Sales Browser'] = function(wrapper){
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 Selling');
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 4857def11b..164d3653e5 100644
--- a/erpnext/selling/page/selling_home/selling_home.html
+++ b/erpnext/selling/page/selling_home/selling_home.html
@@ -77,6 +77,11 @@
title = "Commission partners and targets"
href="#!List/Sales Partner">Sales Partner
+
To automatically create Support Tickets from your incoming mail, set your pop3 settings here.
'
- },
-
- # DocField
- {
+ 'colour': u'White:FFF',
+ 'description': u'To automatically create Support Tickets from your incoming mail, set your POP3 settings here. You must ideally create a separate email id for the erp system so that all emails will be synced into the system from that mail id. If you are not sure, please contact your EMail Provider.',
'doctype': u'DocField',
'fieldname': u'section_break0',
'fieldtype': u'Section Break',
- 'options': u'Simple'
+ 'label': u'Incoming Mail Setting'
},
# DocField
@@ -216,7 +218,7 @@
# DocField
{
'doctype': u'DocField',
- 'fieldname': u'column_break0',
+ 'fieldname': u'cb1',
'fieldtype': u'Column Break'
},
diff --git a/erpnext/setup/doctype/item_group/item_group.js b/erpnext/setup/doctype/item_group/item_group.js
index db7582ce11..e5e108a3dd 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 .
-
-
-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 \
+ Item Group Tree');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in Selling');
}
//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 7e92f53cf4..0253c8e40d 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 .
-# 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 b56b8da7b1..bd9887fafd 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
@@ -55,6 +56,54 @@
'name': u'Item Group'
},
+ # 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,
@@ -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',
@@ -137,20 +138,6 @@
'search_index': 0
},
- # 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',
@@ -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/naming_series/naming_series.js b/erpnext/setup/doctype/naming_series/naming_series.js
index 7e702c45f4..3057e62642 100644
--- a/erpnext/setup/doctype/naming_series/naming_series.js
+++ b/erpnext/setup/doctype/naming_series/naming_series.js
@@ -8,33 +8,47 @@
//
// 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 .
+// along with this program. If not, see .
// Settings
cur_frm.cscript.onload = function(doc, cdt, cdn){
- var callback = function(r, rt){
- set_field_options('select_doc_for_series', r.message);
- }
- $c_obj(make_doclist(doc.doctype, doc.name),'get_transactions','',callback);
- cur_frm.cscript.refresh();
- // add page head
- //var ph = new PageHeader(cur_frm.fields_dict['head_html'].wrapper, 'Setup Series', 'Set prefix for numbering series on your transactions');
+ cur_frm.call_server('get_transactions', '', cur_frm.cscript.update_selects);
+
+ cur_frm.cscript.select_doc_for_series(doc);
}
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
- // hide buttons
- $('.appframe-toolbar').toggle(false);
+cur_frm.cscript.update_selects = function(r) {
+ set_field_options('select_doc_for_series', r.message.transactions);
+ set_field_options('prefix', r.message.prefixes);
}
+
cur_frm.cscript.select_doc_for_series = function(doc, cdt, cdn) {
- var callback = function(r, rt){
- locals[cdt][cdn].set_options = r.message;
- refresh_field('set_options');
- }
+ cur_frm.toggle_fields(['help_html','set_options', 'user_must_always_select', 'update'],
+ doc.select_doc_for_series)
- $c_obj(make_doclist(doc.doctype, doc.name),'get_options','',callback)
+ var callback = function(r, rt){
+ locals[cdt][cdn].set_options = r.message;
+ refresh_field('set_options');
+ if(r.message && r.message.split('\n')[0]=='') {
+ cur_frm.set_value('user_must_always_select', 1)
+ }
+ }
+
+ if(doc.select_doc_for_series)
+ $c_obj(make_doclist(doc.doctype, doc.name),'get_options','',callback)
+}
+
+cur_frm.cscript.update = function() {
+ cur_frm.call_server('update_series', '', cur_frm.cscript.update_selects)
+}
+
+cur_frm.cscript.prefix = function(doc) {
+ cur_frm.call_server('get_current', '', function(r) {
+ refresh_field('current_value');
+ })
}
diff --git a/erpnext/setup/doctype/naming_series/naming_series.py b/erpnext/setup/doctype/naming_series/naming_series.py
index 5a9a26579a..6473459f8a 100644
--- a/erpnext/setup/doctype/naming_series/naming_series.py
+++ b/erpnext/setup/doctype/naming_series/naming_series.py
@@ -14,7 +14,6 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
-# Please edit this list and import only required elements
import webnotes
from webnotes.utils import cint, cstr
@@ -22,23 +21,37 @@ from webnotes import msgprint, errprint
import webnotes.model.doctype
sql = webnotes.conn.sql
-
-# -----------------------------------------------------------------------------------------
-
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
- #-----------------------------------------------------------------------------------------------------------------------------------
- def get_transactions(self):
- return "\n".join([''] + [i[0] for i in sql("SELECT `tabDocField`.`parent` FROM `tabDocField`, `tabDocType` WHERE `tabDocField`.`fieldname` = 'naming_series' and `tabDocType`.name=`tabDocField`.parent order by `tabDocField`.parent")])
+ def get_transactions(self, arg=None):
+ return {
+ "transactions": "\n".join([''] + [i[0] for i in sql("""select `tabDocField`.`parent`
+ FROM `tabDocField`, `tabDocType` WHERE `tabDocField`.`fieldname` = 'naming_series'
+ and `tabDocType`.name=`tabDocField`.parent order by `tabDocField`.parent""")]),
+ "prefixes": "\n".join([''] + [i[0] for i in sql("""select name from tabSeries""")])}
def scrub_options_list(self, ol):
options = filter(lambda x: x, [cstr(n.upper()).strip() for n in ol])
return options
+
+ def update_series(self, arg=None):
+ """update series list"""
+ self.check_duplicate()
+ series_list = self.doc.set_options.split("\n")
+
+ # set in doctype
+ self.set_series_for(self.doc.select_doc_for_series, series_list)
+
+ # create series
+ map(self.insert_series, series_list)
+
+ msgprint('Series Updated')
+
+ return self.get_transactions()
- #-----------------------------------------------------------------------------------------------------------------------------------
def set_series_for(self, doctype, ol):
options = self.scrub_options_list(ol)
@@ -78,14 +91,7 @@ class DocType:
from webnotes.utils.cache import CacheItem
CacheItem(doctype).clear()
-
- #-----------------------------------------------------------------------------------------------------------------------------------
- def update_series(self):
- self.check_duplicate()
- self.set_series_for(self.doc.select_doc_for_series, self.doc.set_options.split("\n"))
- msgprint('Series Updated')
- #-----------------------------------------------------------------------------------------------------------------------------------
def check_duplicate(self):
from core.doctype.doctype.doctype import DocType
dt = DocType()
@@ -100,27 +106,31 @@ class DocType:
if series in i[0].split("\n"):
msgprint("Oops! Series name %s is already in use in %s. Please select a new one" % (series, i[1]), raise_exception=1)
- #-----------------------------------------------------------------------------------------------------------------------------------
def validate_series_name(self, n):
import re
if not re.match('[a-zA-Z0-9]+(([-/][a-zA-Z0-9])?[-/][a-zA-Z0-9]*)*',n):
msgprint('Special Characters except "-" and "/" not allowed in naming series')
raise Exception
- #-----------------------------------------------------------------------------------------------------------------------------------
def get_options(self, arg=''):
- sr = webnotes.model.doctype.get_property(self.doc.select_doc_for_series, 'options', 'naming_series')
+ sr = webnotes.model.doctype.get_property(self.doc.select_doc_for_series,
+ 'options', 'naming_series')
return sr
+ def get_current(self, arg=None):
+ """get series current"""
+ self.doc.current_value = webnotes.conn.sql("""select current from tabSeries where name=%s""",
+ self.doc.prefix)[0][0]
+
+ def insert_series(self, series):
+ """insert series if missing"""
+ if not webnotes.conn.exists('Series', series):
+ sql("insert into tabSeries (name, current) values (%s,0)", (series))
- #-----------------------------------------------------------------------------------------------------------------------------------
def update_series_start(self):
if self.doc.prefix:
- ser_det = sql("select name from `tabSeries` where name = %s", self.doc.prefix)
- if ser_det:
- sql("update `tabSeries` set current = '%s' where name = '%s'" % (self.doc.starts_from-1,self.doc.prefix))
- else:
- sql("insert into tabSeries (name, current) values (%s,%s)",(cstr(self.doc.prefix),cint(self.doc.starts_from)-1))
+ self.insert_series(self.doc.prefix)
+ sql("update `tabSeries` set current = '%s' where name = '%s'" % (self.doc.current_value,self.doc.prefix))
msgprint("Series Updated Successfully")
else:
msgprint("Please select prefix first")
diff --git a/erpnext/setup/doctype/naming_series/naming_series.txt b/erpnext/setup/doctype/naming_series/naming_series.txt
index 6cb1dab6b4..ff83af82d5 100644
--- a/erpnext/setup/doctype/naming_series/naming_series.txt
+++ b/erpnext/setup/doctype/naming_series/naming_series.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-10 13:01:16',
+ 'creation': '2012-07-03 13:30:54',
'docstatus': 0,
- 'modified': '2012-04-10 18:45:34',
+ 'modified': '2012-07-12 15:59:52',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -16,7 +16,7 @@
'description': u'Set prefix for numbering series on your transactions',
'doctype': 'DocType',
'hide_heading': 0,
- 'hide_toolbar': 0,
+ 'hide_toolbar': 1,
'issingle': 1,
'module': u'Setup',
'name': '__common__',
@@ -24,7 +24,7 @@
'section_style': u'Tray',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 66
+ 'version': 1
},
# These values are common for all DocField
@@ -123,7 +123,7 @@
'fieldname': u'help_html',
'fieldtype': u'HTML',
'label': u'Help HTML',
- 'options': u'
\nWrite the list of series options in the list below. Each on a new line \nAllowed special characters are "/" and "-" \nExamples: \nINV- \nINV-10- \nINVK- \n
'
+ 'options': u'
\nEdit list of Series in the box below. Each Series Prefix on a new line.
\nAllowed special characters are "/" and "-" \nExamples: \nINV- \nINV-10- \nINVK- \n
'
},
# DocField
@@ -131,7 +131,7 @@
'doctype': u'DocField',
'fieldname': u'set_options',
'fieldtype': u'Text',
- 'label': u'Set Series'
+ 'label': u'Series List for this Transaction'
},
# DocField
@@ -146,16 +146,17 @@
# DocField
{
+ 'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'update',
'fieldtype': u'Button',
- 'label': u'Update',
- 'options': u'update_series'
+ 'label': u'Update'
},
# DocField
{
- 'description': u'Set starting number for series of your transactions',
+ 'colour': u'White:FFF',
+ 'description': u'Change the starting / current sequence number of an existing series.',
'doctype': u'DocField',
'fieldname': u'update_series',
'fieldtype': u'Section Break',
@@ -166,24 +167,27 @@
{
'doctype': u'DocField',
'fieldname': u'prefix',
- 'fieldtype': u'Data',
+ 'fieldtype': u'Select',
'label': u'Prefix'
},
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'This is the number of the last created transaction with this prefix',
'doctype': u'DocField',
- 'fieldname': u'starts_from',
+ 'fieldname': u'current_value',
'fieldtype': u'Int',
- 'label': u'Starts From'
+ 'label': u'Current Value'
},
# DocField
{
+ 'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'update_series_start',
'fieldtype': u'Button',
- 'label': u'Update Series Start',
+ 'label': u'Update Series Number',
'options': u'update_series_start'
}
]
\ No newline at end of file
diff --git a/erpnext/setup/doctype/notification_control/notification_control.txt b/erpnext/setup/doctype/notification_control/notification_control.txt
index 000902e54b..15c8eb2769 100644
--- a/erpnext/setup/doctype/notification_control/notification_control.txt
+++ b/erpnext/setup/doctype/notification_control/notification_control.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-05-03 16:16:21',
+ 'creation': '2012-07-03 13:30:56',
'docstatus': 0,
- 'modified': '2012-05-03 16:23:29',
+ 'modified': '2012-07-12 16:20:36',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -16,6 +16,7 @@
'allow_email': 1,
'allow_print': 1,
'colour': u'White:FFF',
+ 'description': u'Send automatic emails to Contacts on Submitting transactions.',
'doctype': 'DocType',
'issingle': 1,
'module': u'Setup',
@@ -70,10 +71,12 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'When any of the checked transactions are "Submitted", an email is automatically sent to the associated "Contact" in that transaction, with the transaction as an attachment.',
'doctype': u'DocField',
'fieldname': u'send_autonotification_for',
'fieldtype': u'Section Break',
- 'label': u'Send Auto-notification for'
+ 'label': u'Send Email Automatically on Submission of'
},
# DocField
@@ -152,6 +155,8 @@
# DocField
{
+ 'colour': u'White:FFF',
+ 'description': u'Customize the introductory text that goes as a part of that email. Each transaction has a separate introductory text.',
'doctype': u'DocField',
'fieldname': u'customize_the_notification',
'fieldtype': u'Section Break',
diff --git a/erpnext/setup/doctype/price_list/price_list.js b/erpnext/setup/doctype/price_list/price_list.js
index a222a65f08..11993f8c3b 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 .
-
-//--------- 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', '
To upload a price list, please attach a (.csv) file with 3 columns - Item Code, Price and Currency (no headings necessary). See attachments box in the right column
')
- } else {
- set_field_options('price_help', '
To update prices from the attachment, please click on "Update Prices"
')
- }
-}
+ cur_frm.set_intro('
1. Click on "Download Template" \
+ to download the template of all Items.
'
+ +'
2. Update prices and Currency.
'
+ +'
3. Save it as a CSV (.csv) file.
'
+ +'
4. Upload the file.
');
+
+ 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 be59c65816..0ec71215b3 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 .
-# 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 @@ class DocType:
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 @@ class DocType:
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 @@ class DocType:
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("%s 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 @@ class DocType:
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 2881cd7122..79a7644c67 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
@@ -105,17 +110,6 @@
'write': 1
},
- # 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',
@@ -124,55 +118,15 @@
'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 92c9966fc6..4f2aba2a19 100644
--- a/erpnext/setup/doctype/sales_partner/sales_partner.js
+++ b/erpnext/setup/doctype/sales_partner/sales_partner.js
@@ -95,55 +95,7 @@ cur_frm.cscript.make_contact = function() {
}
-// ******************** 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 0aa2de7043..4e792617ab 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
@@ -54,49 +55,6 @@
'name': u'Sales Partner'
},
- # 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,
@@ -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,23 +283,11 @@
'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
},
- # 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',
@@ -312,37 +301,17 @@
'reqd': 0
},
- # 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 453d88a454..a1cac8a8be 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 .
+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 \
+ Sales Person Tree');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in Selling');
+}
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 d8c6e43e66..3ab184750e 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 5ff8e9414d..028d828ceb 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,
@@ -126,17 +127,6 @@
'permlevel': 1
},
- # 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',
@@ -167,17 +157,6 @@
'trigger': u'Client'
},
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'sphelp',
- 'fieldtype': u'HTML',
- 'label': u'SPHelp',
- 'oldfieldtype': u'HTML',
- 'options': u'To manage Sales Person, click here',
- 'permlevel': 0
- },
-
# DocField
{
'doctype': u'DocField',
@@ -191,6 +170,14 @@
'reqd': 1
},
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'cb0',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0
+ },
+
# DocField
{
'doctype': u'DocField',
@@ -201,125 +188,6 @@
'permlevel': 0
},
- # 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'To manage Territories, click here',
- 'permlevel': 0
- },
-
# DocField
{
'doctype': u'DocField',
@@ -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/setup_control/setup_control.py b/erpnext/setup/doctype/setup_control/setup_control.py
index 444b796f3c..ee1cb7e4ab 100644
--- a/erpnext/setup/doctype/setup_control/setup_control.py
+++ b/erpnext/setup/doctype/setup_control/setup_control.py
@@ -49,9 +49,7 @@ class DocType:
master_dict = {'Fiscal Year':{
'year': curr_fiscal_year,
'year_start_date': fy_start_date,
- 'abbreviation': fy_abbr,
- 'company': args.get('company_name'),
- 'is_fiscal_year_closed': 'No'}}
+ 'company': args.get('company_name')}}
self.create_records(master_dict)
# Company
diff --git a/erpnext/setup/doctype/supplier_type/supplier_type.js b/erpnext/setup/doctype/supplier_type/supplier_type.js
index 306ead0928..945dec0823 100644
--- a/erpnext/setup/doctype/supplier_type/supplier_type.js
+++ b/erpnext/setup/doctype/supplier_type/supplier_type.js
@@ -14,14 +14,6 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-
-
-// ONLOAD
-// ===================================================================================
-cur_frm.cscript.onload = function(doc, cdt, cdn) {
-
-}
-
-cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-
+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/terms_and_conditions/terms_and_conditions.txt b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.txt
index 09d71f4ad9..c120b2c4ff 100644
--- a/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.txt
+++ b/erpnext/setup/doctype/terms_and_conditions/terms_and_conditions.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:25',
+ 'creation': '2012-07-03 13:30:54',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:25',
+ 'modified': '2012-07-12 11:37:56',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -17,6 +17,7 @@
'autoname': u'field:title',
'colour': u'White:FFF',
'default_print_format': u'Standard',
+ 'description': u'Standard Terms and Conditions that can be added to Sales and Purchases.\n\nExamples:\n\n1. Validity of the offer.\n1. Payment Terms (In Advance, On Credit, part advance etc).\n1. What is extra (or payable by the Customer).\n1. Safety / usage warning.\n1. Warranty if any.\n1. Returns Policy.\n1. Terms of shipping, if applicable.\n1. Ways of addressing disputes, indemnity, liability, etc.\n1. Address and Contact of your Company.',
'doctype': 'DocType',
'document_type': u'Master',
'module': u'Setup',
@@ -24,7 +25,7 @@
'section_style': u'Simple',
'server_code_error': u' ',
'show_in_menu': 0,
- 'version': 11
+ 'version': 1
},
# These values are common for all DocField
@@ -52,6 +53,42 @@
'name': u'Terms and Conditions'
},
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Sales Master Manager',
+ 'submit': 0,
+ '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 User',
+ 'submit': 0,
+ 'write': 0
+ },
+
# DocPerm
{
'amend': 0,
@@ -91,42 +128,6 @@
'write': 1
},
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Sales Master Manager',
- 'submit': 0,
- '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 User',
- 'submit': 0,
- 'write': 0
- },
-
# DocField
{
'doctype': u'DocField',
diff --git a/erpnext/setup/doctype/territory/territory.js b/erpnext/setup/doctype/territory/territory.js
index 46312c4e51..9b36d0c6f0 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 .
+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 \
+ Territory Tree');
+ cur_frm.frm_head.appframe.add_breadcrumb(' in Selling');
+}
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 606efa8ef9..fae33ec8dc 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 .
+# along with this program. If not, see .
# 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 363280128c..a9cdf05800 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' ',
@@ -141,20 +143,6 @@
'reqd': 1
},
- # 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',
@@ -169,17 +157,6 @@
'trigger': u'Client'
},
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'territoryhelp',
- 'fieldtype': u'HTML',
- 'label': u'TerritoryHelp',
- 'oldfieldtype': u'HTML',
- 'options': u'To manage Territories, click here',
- 'permlevel': 0
- },
-
# DocField
{
'colour': u'White:FFF',
@@ -195,6 +172,30 @@
'reqd': 1
},
+ # 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',
@@ -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/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index 0c5eae1892..d05b2ec8d3 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -40,8 +40,9 @@ def on_login_post_session(login_manager):
if webnotes.session['user'] not in ('Guest', 'demo@webnotestech.com'):
# create feed
from webnotes.utils import nowtime
+ from webnotes.profile import get_user_fullname
home.make_feed('Login', 'Profile', login_manager.user, login_manager.user,
- '%s logged in at %s' % (login_manager.user_fullname, nowtime()),
+ '%s logged in at %s' % (get_user_fullname, nowtime()),
login_manager.user=='Administrator' and '#8CA2B3' or '#1B750D')
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index ad95cf1e9e..490051bcc0 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -197,51 +197,6 @@ class DocType(TransactionBase):
get_obj('DocType Mapper', 'Sales Order-Delivery Note', with_children = 1).validate_reference_value(self, self.doc.name)
- def validate_prevdoc_details(self):
- for d in getlist(self.doclist,'delivery_note_details'):
- prevdoc = d.prevdoc_doctype
- prevdoc_docname = d.prevdoc_docname
-
- if prevdoc_docname and prevdoc:
- # Validates Transaction Date of DN and previous doc (i.e. SO , PO, PR)
- trans_date = sql("select posting_date from `tab%s` where name = '%s'" %(prevdoc,prevdoc_docname))[0][0]
- if trans_date and getdate(self.doc.posting_date) < (trans_date):
- msgprint("Your Posting Date cannot be before "+cstr(prevdoc)+" Date.")
- raise Exception
- # Validates DN and previous doc details
- get_name = sql("select name from `tab%s` where name = '%s'" % (prevdoc, prevdoc_docname))
- name = get_name and get_name[0][0] or ''
- if name: #check for incorrect docname
- if prevdoc == 'Sales Order':
- dt = sql("select company, docstatus, customer, currency, sales_partner from `tab%s` where name = '%s'" % (prevdoc, name))
- cust_name = dt and dt[0][2] or ''
- if cust_name != self.doc.customer:
- msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " customer :" + cstr(cust_name) + " does not match with customer : " + cstr(self.doc.customer) + " of current document.")
- raise Exception, "Validation Error. "
- sal_partner = dt and dt[0][4] or ''
- if sal_partner != self.doc.sales_partner:
- msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " sales partner name :" + cstr(sal_partner) + " does not match with sales partner name : " + cstr(self.doc.sales_partner_name) + " of current document.")
- raise Exception, "Validation Error. "
- else:
- dt = sql("select company, docstatus, supplier, currency from `tab%s` where name = '%s'" % (prevdoc, name))
- supp_name = dt and dt[0][2] or ''
- company_name = dt and dt[0][0] or ''
- docstatus = dt and dt[0][1] or 0
- currency = dt and dt[0][3] or ''
- if (currency != self.doc.currency):
- msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " currency : "+ cstr(currency) + "does not match with Currency: " + cstr(self.doc.currency) + "of current document")
- raise Exception, "Validation Error."
- if (company_name != self.doc.company):
- msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " does not belong to the Company: " + cstr(self.doc.company_name))
- raise Exception, "Validation Error."
- if (docstatus != 1):
- msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " is not Submitted Document.")
- raise Exception, "Validation Error."
- else:
- msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " is not a valid " + cstr(prevdoc))
- raise Exception, "Validation Error."
-
-
def validate_for_items(self):
check_list, chk_dupl_itm = [], []
for d in getlist(self.doclist,'delivery_note_details'):
@@ -292,11 +247,22 @@ class DocType(TransactionBase):
set(self.doc, 'message', 'Items against your Order #%s have been delivered. Delivery #%s: ' % (self.doc.po_no, self.doc.name))
# Check for Approving Authority
get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self)
+
+ # validate serial no for item table (non-sales-bom item) and packing list (sales-bom item)
sl_obj = get_obj("Stock Ledger")
+ sl_obj.validate_serial_no(self, 'delivery_note_details')
+ sl_obj.validate_serial_no_warehouse(self, 'delivery_note_details')
sl_obj.validate_serial_no(self, 'packing_details')
sl_obj.validate_serial_no_warehouse(self, 'packing_details')
+
+ # update delivery details in serial no
+ sl_obj.update_serial_record(self, 'delivery_note_details', is_submit = 1, is_incoming = 0)
sl_obj.update_serial_record(self, 'packing_details', is_submit = 1, is_incoming = 0)
+
+ # update delivered qty in sales order
get_obj("Sales Common").update_prevdoc_detail(1,self)
+
+ # create stock ledger entry
self.update_stock_ledger(update_stock = 1)
self.credit_limit()
@@ -332,10 +298,14 @@ class DocType(TransactionBase):
sales_com_obj = get_obj(dt = 'Sales Common')
sales_com_obj.check_stop_sales_order(self)
self.check_next_docstatus()
- get_obj('Stock Ledger').update_serial_record(self, 'packing_details', is_submit = 0, is_incoming = 0)
+
+ # remove delivery details from serial no
+ sl = get_obj('Stock Ledger')
+ sl.update_serial_record(self, 'delivery_note_details', is_submit = 0, is_incoming = 0)
+ sl.update_serial_record(self, 'packing_details', is_submit = 0, is_incoming = 0)
+
sales_com_obj.update_prevdoc_detail(0,self)
self.update_stock_ledger(update_stock = -1)
- # :::::: set DN status :::::::
set(self.doc, 'status', 'Cancelled')
self.cancel_packing_slips()
@@ -435,7 +405,8 @@ class DocType(TransactionBase):
def on_update(self):
get_obj('Sales Common').make_packing_list(self,'delivery_note_details')
- self.set_actual_qty()
- get_obj('Stock Ledger').scrub_serial_nos(self)
+ sl = get_obj('Stock Ledger')
+ sl.scrub_serial_nos(self)
+ sl.scrub_serial_nos(self, 'packing_details')
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.txt b/erpnext/stock/doctype/delivery_note/delivery_note.txt
index 7db951328b..a0c2df0e9c 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.txt
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-05-15 12:15:05',
+ 'creation': '2012-06-11 12:10:09',
'docstatus': 0,
- 'modified': '2012-05-18 18:06:26',
+ 'modified': '2012-07-11 11:56:53',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -72,26 +72,14 @@
# DocPerm
{
- 'amend': 1,
- 'cancel': 1,
- 'create': 1,
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Sales User',
- 'submit': 1,
- 'write': 1
- },
-
- # DocPerm
- {
- 'amend': 1,
- 'cancel': 1,
- 'create': 1,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Material Master Manager',
- 'submit': 1,
- 'write': 1
+ 'permlevel': 1,
+ 'role': u'Material User',
+ 'submit': 0,
+ 'write': 0
},
# DocPerm
@@ -108,16 +96,72 @@
# DocPerm
{
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
'doctype': u'DocPerm',
'permlevel': 1,
- 'role': u'All'
+ 'role': u'Material Manager',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 1,
+ 'cancel': 1,
+ 'create': 1,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Sales User',
+ 'submit': 1,
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Sales User',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Accounts User',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Accounts User'
+ },
+
+ # DocPerm
+ {
+ 'doctype': u'DocPerm',
+ 'match': u'customer_name',
+ 'permlevel': 0,
+ 'role': u'Customer'
},
# DocPerm
{
'doctype': u'DocPerm',
'permlevel': 2,
- 'role': u'All'
+ 'role': u'All',
+ 'write': 1
},
# DocField
@@ -340,6 +384,7 @@
# DocField
{
'allow_on_submit': 1,
+ 'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'delivery_note_details',
'fieldtype': u'Table',
@@ -352,6 +397,16 @@
'print_hide': 0
},
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'sales_bom_help',
+ 'fieldtype': u'HTML',
+ 'label': u'Sales BOM Help',
+ 'permlevel': 0,
+ 'print_hide': 1
+ },
+
# DocField
{
'doctype': u'DocField',
diff --git a/erpnext/stock/doctype/delivery_note_packing_item/delivery_note_packing_item.txt b/erpnext/stock/doctype/delivery_note_packing_item/delivery_note_packing_item.txt
index 51001fc9a0..db512c64c0 100644
--- a/erpnext/stock/doctype/delivery_note_packing_item/delivery_note_packing_item.txt
+++ b/erpnext/stock/doctype/delivery_note_packing_item/delivery_note_packing_item.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-13 11:56:35',
+ 'creation': '2012-06-11 12:10:10',
'docstatus': 0,
- 'modified': '2012-05-09 12:55:23',
+ 'modified': '2012-07-10 12:05:31',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -111,7 +111,7 @@
'oldfieldname': u'warehouse',
'oldfieldtype': u'Link',
'options': u'Warehouse',
- 'permlevel': 1
+ 'permlevel': 0
},
# DocField
diff --git a/erpnext/stock/doctype/item/item.txt b/erpnext/stock/doctype/item/item.txt
index 06806bac04..c624fc1379 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-06-08 12:54:51',
+ 'creation': '2012-07-03 13:30:46',
'docstatus': 0,
- 'modified': '2012-07-04 11:10:29',
+ 'modified': '2012-07-11 09:57:42',
'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'Manage Item Groups',
'doctype': u'DocField',
'fieldname': u'item_group',
'fieldtype': u'Link',
@@ -209,17 +209,6 @@
'reqd': 1
},
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'ighelp',
- 'fieldtype': u'HTML',
- 'label': u'IGHelp',
- 'oldfieldtype': u'HTML',
- 'options': u'To manage Item Groups, click here',
- 'permlevel': 0
- },
-
# DocField
{
'doctype': u'DocField',
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.js b/erpnext/stock/doctype/sales_bom/sales_bom.js
index 275af6a85a..68b9013521 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.js
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.js
@@ -14,35 +14,26 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see .
-
-
-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.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.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';
+
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.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, '');
-}
+ 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);
+ }
+}
\ 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 03e1bd04e6..1cf919894c 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 .
-# 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,139 +25,53 @@ class DocType:
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'""", self.doc.new_item_code):
+ webnotes.msgprint("""Parent Item %s is either a Stock Item or a not a Sales Item""",
+ raise_exception=1)
+ def get_item_details(self, name):
+ det = webnotes.conn.sql("""select description, stock_uom from `tabItem`
+ where name = %s""", name)
+ rate = webnotes.conn.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 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):
if len(l1)!=len(l2): return 0
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.txt b/erpnext/stock/doctype/sales_bom/sales_bom.txt
index 29fcd3142f..74268215dd 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-12 18:00:16',
'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 aggregate **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
+ {
+ '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
{
- 'amend': 0,
'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 8cf93f5702..76e3f26a9f 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
@@ -38,18 +38,6 @@
'name': u'Sales BOM Item'
},
- # 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',
@@ -64,6 +52,18 @@
'trigger': u'Client'
},
+ # 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',
@@ -87,18 +87,6 @@
'permlevel': 0
},
- # 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',
diff --git a/erpnext/stock/doctype/stock_ledger/stock_ledger.py b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
index 0cb4b96c3e..42ad6f6df7 100644
--- a/erpnext/stock/doctype/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
@@ -51,19 +51,16 @@ class DocType:
self.doclist = doclist
- # -----------------
- # scrub serial nos
- # -----------------
- def scrub_serial_nos(self, obj):
- for d in getlist(obj.doclist, obj.fname):
+ def scrub_serial_nos(self, obj, table_name = ''):
+ if not table_name:
+ table_name = obj.fname
+
+ for d in getlist(obj.doclist, table_name):
if d.serial_no:
d.serial_no = d.serial_no.replace(',', '\n')
d.save()
- # -----------------------------
- # validate serial no warehouse
- # -----------------------------
def validate_serial_no_warehouse(self, obj, fname):
for d in getlist(obj.doclist, fname):
wh = d.warehouse or d.s_warehouse
@@ -80,10 +77,8 @@ class DocType:
msgprint("Serial No : %s for Item : %s doesn't exists in Warehouse : %s" % (s, d.item_code, wh), raise_exception = 1)
- # ------------------------------------
- # check whether serial no is required
- # ------------------------------------
def validate_serial_no(self, obj, fname):
+ """check whether serial no is required"""
for d in getlist(obj.doclist, fname):
is_stock_item = get_value('Item', d.item_code, 'is_stock_item')
ar_required = get_value('Item', d.item_code, 'has_serial_no')
@@ -101,18 +96,10 @@ class DocType:
msgprint("Rejected serial no is mandatory for rejected qty of item: "+ d.item_code, raise_exception = 1)
-
-
-
- # -------------------
- # get serial no list
- # -------------------
def get_sr_no_list(self, sr_nos, qty = 0, item_code = ''):
return get_sr_no_list(sr_nos, qty, item_code)
- # ---------------------
- # set serial no values
- # ---------------------
+
def set_pur_serial_no_values(self, obj, serial_no, d, s, new_rec):
item_details = sql("select item_group, warranty_period from `tabItem` where name = '%s' and \
(ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now()) " %(d.item_code), as_dict=1)
@@ -143,9 +130,6 @@ class DocType:
s.save(new_rec)
- # ----------------------------------
- # update serial no purchase details
- # ----------------------------------
def update_serial_purchase_details(self, obj, d, serial_no, is_submit, purpose = ''):
exists = sql("select name, status, docstatus from `tabSerial No` where name = '%s'" % (serial_no))
if is_submit:
@@ -168,9 +152,6 @@ class DocType:
sql("update `tabSerial No` set docstatus = 2, status = 'Not in Use', purchase_document_type = '', purchase_document_no = '', purchase_date = null, purchase_rate = 0, supplier = null, supplier_name = '', supplier_address = '', warehouse = '' where name = '%s'" % serial_no)
- # -------------------------------
- # check whether serial no exists
- # -------------------------------
def check_serial_no_exists(self, serial_no, item_code):
chk = sql("select name, status, docstatus, item_code from `tabSerial No` where name = %s", (serial_no), as_dict=1)
if not chk:
@@ -182,9 +163,7 @@ class DocType:
elif chk and chk[0]['status'] == 'Delivered':
msgprint("Serial No: %s of Item : %s is already delivered." % (serial_no, item_code), raise_exception = 1)
- # ---------------------
- # set serial no values
- # ---------------------
+
def set_delivery_serial_no_values(self, obj, serial_no):
s = Document('Serial No', serial_no)
s.delivery_document_type = obj.doc.doctype
@@ -203,9 +182,6 @@ class DocType:
s.save()
- # ----------------------------------
- # update serial no delivery details
- # ----------------------------------
def update_serial_delivery_details(self, obj, d, serial_no, is_submit):
if is_submit:
self.check_serial_no_exists(serial_no, d.item_code)
@@ -214,9 +190,6 @@ class DocType:
sql("update `tabSerial No` set docstatus = 0, status = 'In Store', delivery_document_type = '', delivery_document_no = '', delivery_date = null, customer = null, customer_name = '', delivery_address = '', territory = null where name = '%s'" % (serial_no))
- # ---------------------
- # update serial record
- # ---------------------
def update_serial_record(self, obj, fname, is_submit = 1, is_incoming = 0):
import datetime
for d in getlist(obj.doclist, fname):
@@ -235,11 +208,6 @@ class DocType:
self.update_serial_purchase_details(obj, d, a, is_submit)
-
-
- # -------------
- # update stock
- # -------------
def update_stock(self, values, is_amended = 'No'):
for v in values:
sle_id, serial_nos = '', ''
@@ -261,9 +229,6 @@ class DocType:
v["posting_date"], sle_id, v["posting_time"], '', v["is_cancelled"],v["voucher_type"],v["voucher_no"], is_amended)
- # -----------
- # make entry
- # -----------
def make_entry(self, args):
sle = Document(doctype = 'Stock Ledger Entry')
for k in args.keys():
diff --git a/erpnext/stock/doctype/warehouse/warehouse.js b/erpnext/stock/doctype/warehouse/warehouse.js
index b218063b4a..4ad95f494f 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 .
+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 16bf59d9d5..844e3f326c 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',
@@ -170,17 +171,6 @@
'write': 1
},
- # 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',
@@ -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',
@@ -233,6 +222,17 @@
'search_index': 1
},
+ # 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',
@@ -246,24 +246,6 @@
'print_hide': 0
},
- # 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',
@@ -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 ef941ab66f..0939a77681 100644
--- a/erpnext/stock/page/stock_home/stock_home.html
+++ b/erpnext/stock/page/stock_home/stock_home.html
@@ -49,10 +49,15 @@
title = "Details packages against a delivery"
href="#!List/Packing Slip">Packing Slip
+
', data));
if(!data.enabled) {
- $('.users-area .user-card:last')
+ $(wn.pages.users).find('.layout-main .user-card:last')
.addClass('disabled')
.find('.user-fullname').html('Disabled');
}
@@ -225,8 +236,7 @@ $.extend(wn.pages.users, {
var me = wn.pages.users;
var active_users = $('.user-card:not(.disabled)');
if(wn.boot.max_users && (active_users.length >= wn.boot.max_users)) {
- msgprint(repl("Alas! \
- You already have %(active_users)s active users, \
+ msgprint(repl("You already have %(active_users)s active users, \
which is the maximum number that you are currently allowed to add.