mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 08:24:47 +00:00
Merge branch 'latest' of github.com:webnotes/erpnext into latest
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
pscript.onload_dashboard = function() {
|
pscript.onload_dashboard = function() {
|
||||||
// load jqplot
|
// load jqplot
|
||||||
$.scriptPath = 'js/'
|
$.scriptPath = 'js/'
|
||||||
|
wn.require('lib/css/jqpot.css');
|
||||||
wn.require('lib/js/legacy/jquery/jquery.jqplot.min.js');
|
wn.require('lib/js/legacy/jquery/jquery.jqplot.min.js');
|
||||||
wn.require('lib/js/legacy/jquery/jqplot-plugins/jqplot.barRenderer.js');
|
wn.require('lib/js/legacy/jquery/jqplot-plugins/jqplot.barRenderer.js');
|
||||||
wn.require('lib/js/legacy/jquery/jqplot-plugins/jqplot.canvasAxisTickRenderer.min.js');
|
wn.require('lib/js/legacy/jquery/jqplot-plugins/jqplot.canvasAxisTickRenderer.min.js');
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
from webnotes.utils import cint, load_json, cstr
|
from webnotes.utils import cint, load_json, cstr
|
||||||
|
from webnotes.model.doc import Document
|
||||||
|
|
||||||
try: import json
|
try: import json
|
||||||
except: import simplejson as json
|
except: import simplejson as json
|
||||||
@@ -65,8 +66,7 @@ def add_user(args):
|
|||||||
# add profile record
|
# add profile record
|
||||||
#
|
#
|
||||||
def add_profile(args):
|
def add_profile(args):
|
||||||
from webnotes.utils import validate_email_add
|
from webnotes.utils import validate_email_add, now
|
||||||
from webnotes.model.doc import Document
|
|
||||||
email = args['user']
|
email = args['user']
|
||||||
|
|
||||||
sql = webnotes.conn.sql
|
sql = webnotes.conn.sql
|
||||||
@@ -80,7 +80,7 @@ def add_profile(args):
|
|||||||
if sql("select name from tabProfile where name = %s", email):
|
if sql("select name from tabProfile where name = %s", email):
|
||||||
# exists, enable it
|
# exists, enable it
|
||||||
sql("update tabProfile set enabled = 1, docstatus=0 where name = %s", email)
|
sql("update tabProfile set enabled = 1, docstatus=0 where name = %s", email)
|
||||||
webnotes.msgprint('Profile exists, enabled it')
|
webnotes.msgprint('Profile exists, enabled it with new password')
|
||||||
else:
|
else:
|
||||||
# does not exist, create it!
|
# does not exist, create it!
|
||||||
pr = Document('Profile')
|
pr = Document('Profile')
|
||||||
@@ -92,11 +92,25 @@ def add_profile(args):
|
|||||||
pr.user_type = 'System User'
|
pr.user_type = 'System User'
|
||||||
pr.save(1)
|
pr.save(1)
|
||||||
|
|
||||||
if args.get('password'):
|
if args.get('password'):
|
||||||
sql("""
|
sql("""
|
||||||
UPDATE tabProfile
|
UPDATE tabProfile
|
||||||
SET password = PASSWORD(%s)
|
SET password = PASSWORD(%s), modified = %s
|
||||||
WHERE name = %s""", (args.get('password'), email))
|
WHERE name = %s""", (args.get('password'), now, email))
|
||||||
|
|
||||||
|
send_welcome_mail(email, args.get('password'))
|
||||||
|
|
||||||
|
def send_welcome_mail(email, password):
|
||||||
|
"""send welcome mail to user with password and login url"""
|
||||||
|
pr = Document('Profile', email)
|
||||||
|
from webnotes.utils.email_lib import sendmail_md
|
||||||
|
args = {
|
||||||
|
'company': webnotes.conn.get_default('company'),
|
||||||
|
'name': email,
|
||||||
|
'password': password,
|
||||||
|
'account_url': webnotes.conn.get_default('account_url')
|
||||||
|
}
|
||||||
|
sendmail_md(pr.email, subject="Welcome to ERPNext", msg=welcome_txt % args)
|
||||||
|
|
||||||
#
|
#
|
||||||
# post comment
|
# post comment
|
||||||
@@ -166,3 +180,18 @@ def update_security(args=''):
|
|||||||
else:
|
else:
|
||||||
webnotes.conn.sql("update tabProfile set password=password(%s) where name=%s", (args['new_password'], args['user']))
|
webnotes.conn.sql("update tabProfile set password=password(%s) where name=%s", (args['new_password'], args['user']))
|
||||||
else: webnotes.msgprint('Settings Updated')
|
else: webnotes.msgprint('Settings Updated')
|
||||||
|
|
||||||
|
welcome_txt = """
|
||||||
|
## %(company)s
|
||||||
|
|
||||||
|
#### Welcome!
|
||||||
|
|
||||||
|
A new account has been created for you, here are your details:
|
||||||
|
|
||||||
|
login-id: %(name)s
|
||||||
|
password: %(password)s
|
||||||
|
|
||||||
|
To login to your new ERPNext account, please go to:
|
||||||
|
|
||||||
|
%(account_url)s
|
||||||
|
"""
|
||||||
@@ -2,8 +2,10 @@ import webnotes
|
|||||||
from webnotes.model.doc import Document
|
from webnotes.model.doc import Document
|
||||||
|
|
||||||
def execute():
|
def execute():
|
||||||
|
from webnotes.modules import reload_doc
|
||||||
add_default_home_page()
|
add_default_home_page()
|
||||||
cleanup()
|
cleanup()
|
||||||
|
reload_doc('setup','doctype','manage_account')
|
||||||
|
|
||||||
def cleanup():
|
def cleanup():
|
||||||
from webnotes.model import delete_doc
|
from webnotes.model import delete_doc
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// Validate
|
// Validate
|
||||||
cur_frm.cscript.validate = function(doc, cdt, cdn) {
|
cur_frm.cscript.validate = function(doc, cdt, cdn) {
|
||||||
$c_obj(make_doclist(cdt, cdn), 'update_cp', '', function(r, rt){
|
$c_obj(make_doclist(cdt, cdn), 'get_defaults', '', function(r, rt){
|
||||||
sys_defaults = r.message;
|
sys_defaults = r.message;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -1,66 +1,60 @@
|
|||||||
# Please edit this list and import only required elements
|
"""Global Defaults"""
|
||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
from webnotes.utils import cint, cstr, get_defaults, set_default, fmt_money, get_last_day, get_first_day
|
keydict = {
|
||||||
from webnotes import session, form, is_testing, msgprint, errprint
|
"fiscal_year": "current_fiscal_year",
|
||||||
|
'company': 'default_company',
|
||||||
sql = webnotes.conn.sql
|
'currency': 'default_currency',
|
||||||
|
'price_list_name': 'default_price_list',
|
||||||
|
'price_list_currency': 'default_price_list_currency',
|
||||||
# -----------------------------------------------------------------------------------------
|
'item_group': 'default_item_group',
|
||||||
|
'customer_group': 'default_customer_group',
|
||||||
|
'cust_master_name': 'cust_master_name',
|
||||||
|
'supplier_type': 'default_supplier_type',
|
||||||
|
'supp_master_name': 'supp_master_name',
|
||||||
|
'territory': 'default_territory',
|
||||||
|
'stock_uom': 'default_stock_uom',
|
||||||
|
'fraction_currency': 'default_currency_fraction',
|
||||||
|
'valuation_method': 'default_valuation_method',
|
||||||
|
'date_format': 'date_format',
|
||||||
|
'currency_format':'default_currency_format',
|
||||||
|
'account_url':'account_url'
|
||||||
|
}
|
||||||
|
|
||||||
class DocType:
|
class DocType:
|
||||||
def __init__(self, d, dl):
|
def __init__(self, d, dl):
|
||||||
self.doc, self.doclist = d, dl
|
self.doc, self.doclist = d, dl
|
||||||
|
|
||||||
#---------------------------------------------------------------------------------------------------------------------------------------------
|
def get_bal(self,arg):
|
||||||
def get_bal(self,arg):
|
"""get account balance (??)"""
|
||||||
bal = sql("select `tabAccount Balance`.balance,`tabAccount`.debit_or_credit from `tabAccount`,`tabAccount Balance` where `tabAccount Balance`.account=%s and `tabAccount Balance`.period=%s and `tabAccount Balance`.account=`tabAccount`.name ",(arg,self.doc.current_fiscal_year))
|
from webnotes.utils import fmt_money, flt
|
||||||
if bal:
|
bal = webnotes.conn.sql("select `tabAccount Balance`.balance,`tabAccount`.debit_or_credit from `tabAccount`,`tabAccount Balance` where `tabAccount Balance`.account=%s and `tabAccount Balance`.period=%s and `tabAccount Balance`.account=`tabAccount`.name ",(arg,self.doc.current_fiscal_year))
|
||||||
return fmt_money(flt(bal[0][0])) + ' ' + bal[0][1]
|
if bal:
|
||||||
|
return fmt_money(flt(bal[0][0])) + ' ' + bal[0][1]
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
"""validate"""
|
||||||
|
if not (self.doc.account_url and (self.doc.account_url.startswith('http://') \
|
||||||
|
or self.doc.account_url.startswith('https://'))):
|
||||||
|
webnotes.msgprint("Account URL must start with 'http://' or 'https://'", raise_exception=1)
|
||||||
|
|
||||||
# =========================================================================================================================================
|
def on_update(self):
|
||||||
|
"""update defaults"""
|
||||||
|
self.validate()
|
||||||
|
|
||||||
# Update Default
|
for key in keydict:
|
||||||
# ---------------
|
webnotes.conn.set_default(key, self.doc.fields.get(keydict[key], ''))
|
||||||
def set_system_default(self, defkey, defvalue):
|
|
||||||
set_default(defkey, defvalue)
|
|
||||||
|
|
||||||
if defkey == 'fiscal_year':
|
# update year start date and year end date from fiscal_year
|
||||||
ysd = sql("select year_start_date from `tabFiscal Year` where name=%s", cstr(defvalue))
|
ysd = webnotes.conn.sql("""select year_start_date from `tabFiscal Year`
|
||||||
ysd = ysd and ysd[0][0] or ''
|
where name=%s""", self.doc.fiscal_year)
|
||||||
if ysd:
|
|
||||||
set_default('year_start_date', ysd.strftime('%Y-%m-%d'))
|
|
||||||
set_default('year_end_date', get_last_day(get_first_day(ysd,0,11)).strftime('%Y-%m-%d'))
|
|
||||||
|
|
||||||
|
ysd = ysd and ysd[0][0] or ''
|
||||||
|
from webnotes.utils import get_first_day, get_last_day
|
||||||
|
if ysd:
|
||||||
|
webnotes.conn.set_default('year_start_date', ysd.strftime('%Y-%m-%d'))
|
||||||
|
webnotes.conn.set_default('year_end_date', \
|
||||||
|
get_last_day(get_first_day(ysd,0,11)).strftime('%Y-%m-%d'))
|
||||||
|
|
||||||
# Update
|
def get_defaults(self):
|
||||||
# --------
|
return webnotes.conn.get_defaults()
|
||||||
def update_cp(self):
|
|
||||||
def_list = [['fiscal_year',self.doc.current_fiscal_year],
|
|
||||||
['company',self.doc.default_company],
|
|
||||||
['currency',self.doc.default_currency],
|
|
||||||
['price_list_name',self.doc.default_price_list or ''],
|
|
||||||
['price_list_currency', self.doc.default_price_list_currency or ''],
|
|
||||||
['item_group',self.doc.default_item_group or ''],
|
|
||||||
['customer_group',self.doc.default_customer_group or ''],
|
|
||||||
['cust_master_name',self.doc.cust_master_name or ''],
|
|
||||||
['supplier_type',self.doc.default_supplier_type or ''],
|
|
||||||
['supp_master_name',self.doc.supp_master_name],
|
|
||||||
['territory',self.doc.default_territory or ''],
|
|
||||||
['stock_uom',self.doc.default_stock_uom or ''],
|
|
||||||
['fraction_currency',self.doc.default_currency_fraction or ''],
|
|
||||||
['valuation_method',self.doc.default_valuation_method]]
|
|
||||||
|
|
||||||
for d in def_list:
|
|
||||||
self.set_system_default(d[0],d[1])
|
|
||||||
# Update Currency Format
|
|
||||||
|
|
||||||
sql("update `tabSingles` set value = '%s' where field = 'currency_format' and doctype = 'Control Panel'" % self.doc.default_currency_format)
|
|
||||||
sql("update `tabSingles` set value = '%s' where field = 'date_format' and doctype = 'Control Panel'" %self.doc.date_format)
|
|
||||||
|
|
||||||
|
|
||||||
return get_defaults()
|
|
||||||
|
|
||||||
@@ -5,14 +5,13 @@
|
|||||||
{
|
{
|
||||||
'creation': '2010-08-08 17:09:09',
|
'creation': '2010-08-08 17:09:09',
|
||||||
'docstatus': 0,
|
'docstatus': 0,
|
||||||
'modified': '2011-12-21 13:22:33',
|
'modified': '2012-01-20 11:25:18',
|
||||||
'modified_by': 'Administrator',
|
'modified_by': 'Administrator',
|
||||||
'owner': 'Administrator'
|
'owner': 'Administrator'
|
||||||
},
|
},
|
||||||
|
|
||||||
# These values are common for all DocType
|
# These values are common for all DocType
|
||||||
{
|
{
|
||||||
|
|
||||||
'_last_update': '1323855502',
|
'_last_update': '1323855502',
|
||||||
'allow_copy': 1,
|
'allow_copy': 1,
|
||||||
'allow_email': 1,
|
'allow_email': 1,
|
||||||
@@ -29,7 +28,7 @@
|
|||||||
'section_style': 'Tabbed',
|
'section_style': 'Tabbed',
|
||||||
'server_code_error': ' ',
|
'server_code_error': ' ',
|
||||||
'show_in_menu': 1,
|
'show_in_menu': 1,
|
||||||
'version': 515
|
'version': 517
|
||||||
},
|
},
|
||||||
|
|
||||||
# These values are common for all DocField
|
# These values are common for all DocField
|
||||||
@@ -102,6 +101,37 @@
|
|||||||
'write': 1
|
'write': 1
|
||||||
},
|
},
|
||||||
|
|
||||||
|
# DocField
|
||||||
|
{
|
||||||
|
'doctype': 'DocField',
|
||||||
|
'fieldtype': 'Section Break',
|
||||||
|
'label': 'System'
|
||||||
|
},
|
||||||
|
|
||||||
|
# DocField
|
||||||
|
{
|
||||||
|
'colour': 'White:FFF',
|
||||||
|
'description': 'Example: http://frappe.erpnext.com',
|
||||||
|
'doctype': 'DocField',
|
||||||
|
'fieldname': 'account_url',
|
||||||
|
'fieldtype': 'Data',
|
||||||
|
'label': 'Account URL'
|
||||||
|
},
|
||||||
|
|
||||||
|
# DocField
|
||||||
|
{
|
||||||
|
'doctype': 'DocField',
|
||||||
|
'fieldtype': 'Column Break'
|
||||||
|
},
|
||||||
|
|
||||||
|
# DocField
|
||||||
|
{
|
||||||
|
'doctype': 'DocField',
|
||||||
|
'fieldname': 'sms_sender_name',
|
||||||
|
'fieldtype': 'Data',
|
||||||
|
'label': 'SMS Sender Name'
|
||||||
|
},
|
||||||
|
|
||||||
# DocField
|
# DocField
|
||||||
{
|
{
|
||||||
'doctype': 'DocField',
|
'doctype': 'DocField',
|
||||||
@@ -173,14 +203,6 @@
|
|||||||
'label': 'Default Currency Fraction'
|
'label': 'Default Currency Fraction'
|
||||||
},
|
},
|
||||||
|
|
||||||
# DocField
|
|
||||||
{
|
|
||||||
'doctype': 'DocField',
|
|
||||||
'fieldname': 'sms_sender_name',
|
|
||||||
'fieldtype': 'Data',
|
|
||||||
'label': 'SMS Sender Name'
|
|
||||||
},
|
|
||||||
|
|
||||||
# DocField
|
# DocField
|
||||||
{
|
{
|
||||||
'doctype': 'DocField',
|
'doctype': 'DocField',
|
||||||
|
|||||||
@@ -22,67 +22,10 @@ class DocType:
|
|||||||
self.doc, self.doclist = d,dl
|
self.doc, self.doclist = d,dl
|
||||||
self.last_profile = None
|
self.last_profile = None
|
||||||
|
|
||||||
# Sync Profile with Gateway
|
|
||||||
# -------------------------
|
|
||||||
def sync_with_gateway(self,pid):
|
|
||||||
p = Document('Profile',pid)
|
|
||||||
|
|
||||||
# login to gateway
|
|
||||||
from webnotes.utils.webservice import FrameworkServer
|
|
||||||
fw = FrameworkServer('www.erpnext.com','/','__system@webnotestech.com','password',https=1)
|
|
||||||
|
|
||||||
account_id = sql("select value from tabSingles where doctype='Control Panel' and field='account_id'")[0][0]
|
|
||||||
|
|
||||||
# call add profile
|
|
||||||
ret = fw.runserverobj('Profile Control','Profile Control','add_profile_gateway',str([p.first_name, p.middle_name, p.last_name, p.email, p.name, account_id]))
|
|
||||||
|
|
||||||
if ret.get('exc'):
|
|
||||||
msgprint(ret['exc'])
|
|
||||||
raise Exception
|
|
||||||
|
|
||||||
def get_role_permission(self,role):
|
def get_role_permission(self,role):
|
||||||
perm = sql("select distinct t1.`parent`, t1.`read`, t1.`write`, t1.`create`, t1.`submit`,t1.`cancel`,t1.`amend` from `tabDocPerm` t1, `tabDocType` t2 where t1.`role` ='%s' and t1.docstatus !=2 and t1.permlevel = 0 and t1.`read` = 1 and t2.module != 'Recycle Bin' and t1.parent=t2.name "%role)
|
perm = sql("select distinct t1.`parent`, t1.`read`, t1.`write`, t1.`create`, t1.`submit`,t1.`cancel`,t1.`amend` from `tabDocPerm` t1, `tabDocType` t2 where t1.`role` ='%s' and t1.docstatus !=2 and t1.permlevel = 0 and t1.`read` = 1 and t2.module != 'Recycle Bin' and t1.parent=t2.name "%role)
|
||||||
return perm or ''
|
return perm or ''
|
||||||
|
|
||||||
|
|
||||||
# Check if password is expired
|
|
||||||
# --------------------------------
|
|
||||||
def has_pwd_expired(self):
|
|
||||||
if session['user'] != 'Administrator' and session['user'].lower() != 'demo':
|
|
||||||
last_pwd_date = None
|
|
||||||
try:
|
|
||||||
last_pwd_date = sql("select password_last_updated from tabProfile where name=%s",session['user'])[0][0] or ''
|
|
||||||
except:
|
|
||||||
return 'No'
|
|
||||||
if cstr(last_pwd_date) == '':
|
|
||||||
sql("update tabProfile set password_last_updated = '%s' where name='%s'"% (nowdate(),session['user']))
|
|
||||||
return 'No'
|
|
||||||
else:
|
|
||||||
date_diff = (getdate(nowdate()) - last_pwd_date).days
|
|
||||||
expiry_period = sql("select value from tabSingles where doctype='Control Panel' and field='password_expiry_days'")
|
|
||||||
if expiry_period and cint(expiry_period[0][0]) and cint(expiry_period[0][0]) < date_diff:
|
|
||||||
return 'Yes'
|
|
||||||
return 'No'
|
|
||||||
|
|
||||||
def reset_password(self,pwd):
|
|
||||||
if sql("select name from tabProfile where password=PASSWORD(%s) and name=%s", (pwd,session['user'])):
|
|
||||||
return 'Password cannot be same as old password'
|
|
||||||
sql("update tabProfile set password=PASSWORD(%s),password_last_updated=%s where name = %s", (pwd,nowdate(),session['user']))
|
|
||||||
return 'ok'
|
|
||||||
|
|
||||||
#-------------------------------------------------------------------------------------------------------
|
|
||||||
#functions for manage user page
|
|
||||||
#-----------Enable/Disable Profile-----------------------------------------------------------------------------------------------
|
|
||||||
def change_login(self,args):
|
|
||||||
args = eval(args)
|
|
||||||
|
|
||||||
if cint(args['set_disabled'])==0:
|
|
||||||
sql("update `tabProfile` set enabled=1 where name='%s'"%args['user'])
|
|
||||||
else:
|
|
||||||
sql("update `tabProfile` set enabled=0 where name='%s'"%args['user'])
|
|
||||||
|
|
||||||
return 'ok'
|
|
||||||
|
|
||||||
#------------return role list -------------------------------------------------------------------------------------------------
|
#------------return role list -------------------------------------------------------------------------------------------------
|
||||||
# All roles of Role Master
|
# All roles of Role Master
|
||||||
def get_role(self):
|
def get_role(self):
|
||||||
@@ -113,75 +56,3 @@ class DocType:
|
|||||||
pr.parentfield = 'userroles'
|
pr.parentfield = 'userroles'
|
||||||
pr.save(1)
|
pr.save(1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Add new member
|
|
||||||
# ---------------
|
|
||||||
def add_profile(self,arg):
|
|
||||||
|
|
||||||
# Check credit balance
|
|
||||||
get_obj('WN ERP Client Control').check_credit_balance()
|
|
||||||
|
|
||||||
arg=eval(arg)
|
|
||||||
pr=Document('Profile')
|
|
||||||
for d in arg.keys():
|
|
||||||
if d!='role':
|
|
||||||
pr.fields[d] = arg[d]
|
|
||||||
|
|
||||||
pr.enabled=0
|
|
||||||
pr.user_type='System User'
|
|
||||||
pr.save(1)
|
|
||||||
pr_obj = get_obj('Profile',pr.name)
|
|
||||||
if (pr.name):
|
|
||||||
msg="New member is added"
|
|
||||||
pr_obj.on_update()
|
|
||||||
else:
|
|
||||||
msg="Profile not created"
|
|
||||||
|
|
||||||
return cstr(msg)
|
|
||||||
|
|
||||||
# to find currently login user
|
|
||||||
def current_login(self):
|
|
||||||
cl_list=sql("select distinct user from tabSessions")
|
|
||||||
if cl_list:
|
|
||||||
cl_list=[x[0] for x in cl_list]
|
|
||||||
|
|
||||||
return cl_list
|
|
||||||
|
|
||||||
|
|
||||||
# Remove Profile
|
|
||||||
# ---------------
|
|
||||||
def remove_profile(self, user):
|
|
||||||
# delete profile
|
|
||||||
webnotes.model.delete_doc('Profile',user)
|
|
||||||
|
|
||||||
# Update WN ERP Client Control
|
|
||||||
sql("update tabSingles set value = value - 1 where field = 'total_users' and doctype = 'WN ERP Client Control'")
|
|
||||||
|
|
||||||
# login to gateway
|
|
||||||
from webnotes.utils.webservice import FrameworkServer
|
|
||||||
fw = FrameworkServer('www.erpnext.com','/','__system@webnotestech.com','password',https=1)
|
|
||||||
|
|
||||||
account_id = sql("select value from tabSingles where doctype='Control Panel' and field='account_id'")[0][0]
|
|
||||||
|
|
||||||
# call remove profile
|
|
||||||
ret = fw.runserverobj('Profile Control','Profile Control','remove_app_sub',str([user, account_id, session['user']]))
|
|
||||||
|
|
||||||
if ret.get('exc'):
|
|
||||||
msgprint(ret['exc'])
|
|
||||||
raise Exception
|
|
||||||
|
|
||||||
return "User Removed Successfully"
|
|
||||||
|
|
||||||
|
|
||||||
# Create Profile
|
|
||||||
# ---------------
|
|
||||||
def create_profile(self, email):
|
|
||||||
if sql("select name from tabProfile where name = %s", email):
|
|
||||||
sql("update tabProfile set docstatus = 0 where name = %s", email)
|
|
||||||
else:
|
|
||||||
pr = Document('Profile')
|
|
||||||
pr.email = email
|
|
||||||
pr.enabled=0
|
|
||||||
pr.user_type='System User'
|
|
||||||
pr.save(1)
|
|
||||||
|
|||||||
@@ -3,7 +3,8 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<title>ERPNext</title>
|
<title>ERPNext</title>
|
||||||
<meta name="author" content="">
|
<meta name="author" content="">
|
||||||
<script type="text/javascript">window._version_number="49"
|
<script type="text/javascript">window._version_number="52"
|
||||||
|
|
||||||
wn={}
|
wn={}
|
||||||
wn.provide=function(namespace){var nsl=namespace.split('.');var l=nsl.length;var parent=window;for(var i=0;i<l;i++){var n=nsl[i];if(!parent[n]){parent[n]={}}
|
wn.provide=function(namespace){var nsl=namespace.split('.');var l=nsl.length;var parent=window;for(var i=0;i<l;i++){var n=nsl[i];if(!parent[n]){parent[n]={}}
|
||||||
parent=parent[n];}}
|
parent=parent[n];}}
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
49
|
52
|
||||||
Reference in New Issue
Block a user