Merge branch 'shf_rename' of github.com:webnotes/erpnext into shf_rename
diff --git a/css/all-app.css b/css/all-app.css
index 66229fd..41feae8 100644
--- a/css/all-app.css
+++ b/css/all-app.css
@@ -3615,3 +3615,12 @@
max-width: 260px !important;
}
+.expiry-info {
+ margin-top: 40px;
+ margin-bottom: -40px;
+ text-align: center;
+ background-color: rgb(255, 255, 204);
+ padding: 7px;
+ z-index: 1;
+}
+
diff --git a/css/all-web.css b/css/all-web.css
index c7ab6f8..c3139d4 100644
--- a/css/all-web.css
+++ b/css/all-web.css
@@ -2313,6 +2313,15 @@
max-width: 260px !important;
}
+.expiry-info {
+ margin-top: 40px;
+ margin-bottom: -40px;
+ text-align: center;
+ background-color: rgb(255, 255, 204);
+ padding: 7px;
+ z-index: 1;
+}
+
/*
* erpnext/website/css/website.css
diff --git a/erpnext/setup/doctype/setup_control/setup_control.py b/erpnext/setup/doctype/setup_control/setup_control.py
index ba39358..af7bf9a 100644
--- a/erpnext/setup/doctype/setup_control/setup_control.py
+++ b/erpnext/setup/doctype/setup_control/setup_control.py
@@ -27,42 +27,6 @@
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
- #Default Naming Series
- #---------------------------------------------------
- def naming_series(self):
- ns = [['TDS Payment', 'TDSP'], ['Purchase Invoice', 'BILL'], ['Journal Voucher', 'JV'], ['Sales Invoice', 'INV'], ['Lead', 'Lead'], ['Purchase Request', 'IDT'], ['Opportunity', 'Opportunity'], ['Purchase Order', 'PO'], ['Quotation', 'QTN'], ['Purchase Receipt', 'GRN'], ['Stock Entry', 'STE'], ['Sales Order', 'SO'], ['Delivery Note', 'DN'], ['Employee', 'EMP/']]
- for r in ns:
- rec = Document('Naming Series')
- rec.select_doc_for_series = r[0]
- rec.new_series = r[1]
- rec_obj = get_obj(doc=rec)
- rec_obj.add_series()
-
- # set account details
- #-----------------------
- def set_account_details(self, args):
- """
- Called from gateway after allocation
- """
- import json
- args = json.loads(args)
-
- self.set_cp_defaults(args['company'], args['industry'], args['time_zone'], args['country'], args['account_name'])
- self.create_profile(args['user'], args['first_name'], args['last_name'], args.get('pwd'))
-
- # Domain related updates
- try:
- from server_tools.gateway_utils import add_domain_map
- add_domain_map(args)
- except ImportError, e:
- pass
-
- # add record in domain_list of Website Settings
- account_url = args['url_name'] + '.erpnext.com'
- webnotes.conn.set_value('Website Settings', 'Website Settings',
- 'subdomain', account_url)
-
-
# Account Setup
# ---------------
def setup_account(self, args):
@@ -117,6 +81,7 @@
# Set
self.set_defaults(def_args)
+ self.set_cp_defaults(**args)
self.create_feed_and_todo()
@@ -204,14 +169,12 @@
# Set Control Panel Defaults
# --------------------------
- def set_cp_defaults(self, cname, industry, timezone, country, acc_name):
+ def set_cp_defaults(self, industry, country, timezone, company_name):
cp = Document('Control Panel','Control Panel')
- cp.account_id = acc_name
- cp.company_name = cname
+ cp.company_name = company_name
cp.industry = industry
cp.time_zone = timezone
cp.country = country
- cp.client_name = '<div style="padding:4px; font-size:20px;">'+cname+'</div>'
cp.save()
# Create Profile
@@ -238,25 +201,4 @@
for r in roles_list:
d = addchild(pr,'userroles', 'UserRole', 1)
d.role = r
- d.save(1)
-
-
- def is_setup_okay(self, args):
- """
- Validates if setup has been performed after database allocation
- """
-
- from server_tools.gateway_utils import get_total_users
-
- args = eval(args)
- cp_defaults = webnotes.conn.get_value('Control Panel', None, 'account_id')
- user_profile = webnotes.conn.get_value('Profile', args['user'], 'name')
-
- from webnotes.utils import cint
-
- total_users = get_total_users()
-
- if (cp_defaults==args['account_name']) and user_profile and \
- (total_users==cint(args['total_users'])):
- return 'True'
-
+ d.save(1)
\ No newline at end of file
diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index 0527045..fc0e118 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -34,7 +34,10 @@
sid!=%s""", \
(webnotes.session['user'], webnotes.session['sid']), as_list=1)
- if webnotes.session['user'] not in ('Guest', 'demo@webnotestech.com') and webnotes.conn.cur_db_name!='accounts':
+ # check if account is expired
+ check_if_expired()
+
+ if webnotes.session['user'] not in ('Guest', 'demo@webnotestech.com'):
# create feed
from webnotes.utils import nowtime
home.make_feed('Login', 'Profile', login_manager.user, login_manager.user,
@@ -82,6 +85,11 @@
tabCompany limit 1""") and 'Yes' or 'No'
bootinfo['user_background'] = webnotes.conn.get_value("Profile", webnotes.session['user'], 'background_image') or ''
+
+ # load subscription info
+ import conf
+ if hasattr(conf, 'max_users'): bootinfo['max_users'] = conf.max_users
+ if hasattr(conf, 'expires_on'): bootinfo['expires_on'] = conf.expires_on
def get_letter_heads():
@@ -90,27 +98,37 @@
ret = webnotes.conn.sql("""select name, content from `tabLetter Head`
where ifnull(disabled,0)=0""")
return dict(ret)
+
-def login_as(login_manager):
- """
- Login as functionality -- allows signin from signin.erpnext.com
- """
- # login as user
- user = webnotes.form.getvalue('login_as')
- if user:
- if isinstance(webnotes.session, dict):
- webnotes.session['user'] = user
- else:
- webnotes.session = {'user': user}
-
- login_manager.user = user
- first_name, last_name = webnotes.conn.sql("select first_name, last_name from `tabProfile` where name=%s", user)[0]
-
- login_manager.user_fullname = (first_name and first_name or "") + (last_name and " " + last_name or "")
-
- # alisaing here... so check if the user is disabled
- if not webnotes.conn.sql("select ifnull(enabled,0) from tabProfile where name=%s", user)[0][0]:
- # throw execption
- webnotes.msgprint("Authentication Failed", raise_exception=1)
-
- return login_manager
+def check_if_expired():
+ """check if account is expired. If expired, do not allow login"""
+ import conf
+ # check if expires_on is specified
+ if not hasattr(conf, 'expires_on'): return
+
+ # check if expired
+ from datetime import datetime, date
+ expires_on = datetime.strptime(conf.expires_on, '%Y-%m-%d').date()
+ if date.today() <= expires_on: return
+
+ # if expired, stop user from logging in
+ from webnotes.utils import formatdate
+ if 'System Manager' in webnotes.user.roles:
+ webnotes.response['server_messages'] = """Oops! \
+ Your subscription expired on <b>%s</b>.
+
+ Nothing catastrophic.
+
+ Just drop in a mail at <b>support@erpnext.com</b> and \
+ we will guide you to get your account re-activated.""" % formatdate(conf.expires_on)
+ else:
+ webnotes.response['server_messages'] = """Oops! \
+ Your subscription expired on <b>%s</b>.
+
+ Nothing catastrophic.
+
+ Just ask your System Manager to drop in a mail at <b>support@erpnext.com</b> and \
+ we will guide him to get your account re-activated.""" % formatdate(conf.expires_on)
+
+ webnotes.response['message'] = 'Account Expired'
+ raise webnotes.AuthenticationError
\ No newline at end of file
diff --git a/erpnext/startup/js/complete_setup.js b/erpnext/startup/js/complete_setup.js
index c643813..88fb1f0 100644
--- a/erpnext/startup/js/complete_setup.js
+++ b/erpnext/startup/js/complete_setup.js
@@ -16,78 +16,463 @@
// complete my company registration
// --------------------------------
+wn.provide('erpnext.complete_setup');
-erpnext.complete_setup = function() {
- var currency_list = ['', 'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AZN',
- 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL', 'BSD', 'BTN', 'BYR',
- 'BZD', 'CAD', 'CDF', 'CFA', 'CFP', 'CHF', 'CLP', 'CNY', 'COP', 'CRC', 'CUC', 'CZK', 'DJF',
- 'DKK', 'DOP', 'DZD', 'EEK', 'EGP', 'ERN', 'ETB', 'EUR', 'EURO', 'FJD', 'FKP', 'FMG', 'GBP',
- 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GQE', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF',
- 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF',
- 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LTL', 'LVL', 'LYD',
- 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRO', 'MUR', 'MVR', 'MWK', 'MXN', 'MYR',
- 'MZM', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NRs', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP',
- 'PKR', 'PLN', 'PYG', 'QAR', 'RMB', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SCR', 'SDG', 'SDR',
- 'SEK', 'SGD', 'SHP', 'SOS', 'SRD', 'STD', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TRY',
- 'TTD', 'TWD', 'TZS', 'UAE', 'UAH', 'UGX', 'USD', 'USh', 'UYU', 'UZS', 'VEB', 'VND', 'VUV',
- 'WST', 'XAF', 'XCD', 'XDR', 'XOF', 'XPF', 'YEN', 'YER', 'YTL', 'ZAR', 'ZMK', 'ZWR'];
+$.extend(erpnext.complete_setup, {
+
+ show: function() {
+ d = erpnext.complete_setup.prepare_dialog();
+ d.show();
+ },
- var d = new wn.widgets.Dialog({
- title: "Setup",
- fields: [
- {fieldname:'first_name', label:'Your First Name', fieldtype:'Data', reqd: 1},
- {fieldname:'last_name', label:'Your Last Name', fieldtype:'Data'},
- {fieldname:'company_name', label:'Company Name', fieldtype:'Data', reqd:1,
- description: 'e.g. "My Company LLC"'},
- {fieldname:'company_abbr', label:'Company Abbreviation', fieldtype:'Data',
- description:'e.g. "MC"',reqd:1},
- {fieldname:'fy_start', label:'Financial Year Start Date', fieldtype:'Select',
- description:'Your financial year begins on"', reqd:1,
- options: ['', '1st Jan', '1st Apr', '1st Jul', '1st Oct'].join('\n')},
- {fieldname:'currency', label: 'Default Currency', reqd:1,
- options: currency_list.join('\n'), fieldtype: 'Select'},
- {fieldname:'update', label:'Setup',fieldtype:'Button'}
- ]
- })
-
- // prepare
- if(user != 'Administrator'){
- d.no_cancel(); // Hide close image
- $('header').toggle(false); // hide toolbar
- }
-
- // company name already set
- if(wn.control_panel.company_name) {
- var inp = d.fields_dict.company_name.input;
- inp.value = wn.control_panel.company_name;
- inp.disabled = true;
- }
-
- // set first name, last name
- if(user_fullname) {
- u = user_fullname.split(' ');
- if(u[0]) {
- d.fields_dict.first_name.input.value = u[0];
- }
- if(u[1]) {
- d.fields_dict.last_name.input.value = u[1];
- }
- }
-
- // setup
- d.fields_dict.update.input.onclick = function() {
- var data = d.get_values();
- if(!data) return;
- $(this).set_working();
- $c_obj('Setup Control','setup_account',data,function(r, rt){
- sys_defaults = r.message;
- user_fullname = r.message.user_fullname;
- wn.boot.user_info[user].fullname = user_fullname;
- d.hide();
- $('header').toggle(true);
- wn.container.wntoolbar.set_user_name();
+ prepare_dialog: function() {
+
+ var d = new wn.widgets.Dialog({
+ title: "Setup",
+ fields: [
+ {fieldname:'first_name', label:'Your First Name', fieldtype:'Data', reqd: 1},
+ {fieldname:'last_name', label:'Your Last Name', fieldtype:'Data'},
+ {fieldname:'company_name', label:'Company Name', fieldtype:'Data', reqd:1,
+ description: 'e.g. "My Company LLC"'},
+ {fieldname:'company_abbr', label:'Company Abbreviation', fieldtype:'Data',
+ description:'e.g. "MC"',reqd:1},
+ {fieldname:'fy_start', label:'Financial Year Start Date', fieldtype:'Select',
+ description:'Your financial year begins on"', reqd:1,
+ options: erpnext.complete_setup.fy_start_list.join('\n')},
+ {fieldname:'currency', label: 'Default Currency', reqd:1,
+ options: erpnext.complete_setup.currency_list.join('\n'), fieldtype: 'Select'},
+ {fieldname:'industry', label: 'Industry', reqd:1,
+ options: erpnext.complete_setup.industry_list.join('\n'), fieldtype: 'Select'},
+ {fieldname:'country', label: 'Country', reqd:1,
+ options: erpnext.complete_setup.country_list.join('\n'), fieldtype: 'Select'},
+ {fieldname:'timezone', label: 'Time Zone', reqd:1,
+ options: "", fieldtype: 'Select'},
+ {fieldname:'update', label:'Setup',fieldtype:'Button'},
+ ],
});
- }
+
+ if(user != 'Administrator'){
+ $(d.appframe.$titlebar).find('.close').toggle(false); // Hide close image
+ $('header').toggle(false); // hide toolbar
+ }
+
+ // on clicking update
+ d.fields_dict.update.input.onclick = function() {
+ var data = d.get_values();
+ if(!data) return;
+ $(this).set_working();
+ $c_obj('Setup Control','setup_account',data,function(r, rt){
+ sys_defaults = r.message;
+ user_fullname = r.message.user_fullname;
+ wn.boot.user_info[user].fullname = user_fullname;
+ d.hide();
+ $('header').toggle(true);
+ wn.container.wntoolbar.set_user_name();
+ });
+ };
+
+ d.fields_dict.country.input.onchange = function() {
+ var country = d.fields_dict.country.input.value;
+ var $timezone = $(d.fields_dict.timezone.input);
+ $timezone.empty();
+ if(country){
+ var timezone_list = erpnext.complete_setup.timezone_dict[country];
+ if(timezone_list.length > 1) {
+ timezone_list = [""].concat(timezone_list);
+ }
+ $timezone.add_options(timezone_list);
+ }
+ };
+
+ // company name already set
+ if(wn.control_panel.company_name) {
+ var inp = d.fields_dict.company_name.input;
+ inp.value = wn.control_panel.company_name;
+ inp.disabled = true;
+ }
+
+ // set first name, last name
+ if(user_fullname) {
+ u = user_fullname.split(' ');
+ if(u[0]) {
+ d.fields_dict.first_name.input.value = u[0];
+ }
+ if(u[1]) {
+ d.fields_dict.last_name.input.value = u[1];
+ }
+ }
+
+ return d;
+ },
- d.show();
-}
+ fy_start_list: ['', '1st Jan', '1st Apr', '1st Jul', '1st Oct'],
+
+ currency_list: ['', 'AED', 'AFN', 'ALL', 'AMD', 'ANG', 'AOA', 'ARS', 'AUD', 'AZN',
+ 'BAM', 'BBD', 'BDT', 'BGN', 'BHD', 'BIF', 'BMD', 'BND', 'BOB', 'BRL', 'BSD', 'BTN', 'BYR',
+ 'BZD', 'CAD', 'CDF', 'CFA', 'CFP', 'CHF', 'CLP', 'CNY', 'COP', 'CRC', 'CUC', 'CZK', 'DJF',
+ 'DKK', 'DOP', 'DZD', 'EEK', 'EGP', 'ERN', 'ETB', 'EUR', 'EURO', 'FJD', 'FKP', 'FMG', 'GBP',
+ 'GEL', 'GHS', 'GIP', 'GMD', 'GNF', 'GQE', 'GTQ', 'GYD', 'HKD', 'HNL', 'HRK', 'HTG', 'HUF',
+ 'IDR', 'ILS', 'INR', 'IQD', 'IRR', 'ISK', 'JMD', 'JOD', 'JPY', 'KES', 'KGS', 'KHR', 'KMF',
+ 'KPW', 'KRW', 'KWD', 'KYD', 'KZT', 'LAK', 'LBP', 'LKR', 'LRD', 'LSL', 'LTL', 'LVL', 'LYD',
+ 'MAD', 'MDL', 'MGA', 'MKD', 'MMK', 'MNT', 'MOP', 'MRO', 'MUR', 'MVR', 'MWK', 'MXN', 'MYR',
+ 'MZM', 'NAD', 'NGN', 'NIO', 'NOK', 'NPR', 'NRs', 'NZD', 'OMR', 'PAB', 'PEN', 'PGK', 'PHP',
+ 'PKR', 'PLN', 'PYG', 'QAR', 'RMB', 'RON', 'RSD', 'RUB', 'RWF', 'SAR', 'SCR', 'SDG', 'SDR',
+ 'SEK', 'SGD', 'SHP', 'SOS', 'SRD', 'STD', 'SYP', 'SZL', 'THB', 'TJS', 'TMT', 'TND', 'TRY',
+ 'TTD', 'TWD', 'TZS', 'UAE', 'UAH', 'UGX', 'USD', 'USh', 'UYU', 'UZS', 'VEB', 'VND', 'VUV',
+ 'WST', 'XAF', 'XCD', 'XDR', 'XOF', 'XPF', 'YEN', 'YER', 'YTL', 'ZAR', 'ZMK', 'ZWR'],
+
+ industry_list: ['', 'Aerospace and Defence', 'Agriculture', 'Apparel', 'Automobile',
+ 'Banking', 'Biotechnology', 'Chemical', 'Communications', 'Consulting', 'Customer Service',
+ 'Education', 'Electronics', 'Energy', 'Engineering', 'Entertainment', 'Environmental',
+ 'Finance', 'Food and Beverage', 'Government', 'Healthcare', 'Hospitality',
+ 'Information Technology', 'Insurance', 'Machinery', 'Manufacturing', 'Media',
+ 'Not For Profit', 'Recreation', 'Retail', 'Shipping', 'Technology',
+ 'Telecommunications', 'Transportation', 'Trading', 'Utilities', 'Other'],
+
+ country_list: ["", 'Afghanistan', 'Albania', 'Algeria', 'Andorra', 'Angola', 'Antigua and Barbuda',
+ 'Argentina', 'Armenia', 'Australia', 'Austria', 'Azerbaijan', 'Bahamas', 'Bahrain',
+ 'Bangladesh', 'Barbados', 'Belarus', 'Belgium', 'Belize', 'Benin', 'Bhutan', 'Bolivia',
+ 'Bosnia and Herzegovina', 'Botswana', 'Brazil', 'Brunei Darussalam', 'Bulgaria',
+ 'Burkina Faso', 'Burundi', 'Cambodia', 'Cameroon', 'Canada', 'Cape Verde',
+ 'Central African Republic', 'Chad', 'Chile', 'Colombia', 'Comoros', 'Costa Rica',
+ 'Croatia', 'Cuba', 'Cyprus', 'Czech Republic', "C\xc3\xb4te d'Ivoire",
+ 'Democratic Republic of the Congo', 'Denmark', 'Djibouti', 'Dominica',
+ 'Dominican Republic', 'East Timor', 'Ecuador', 'Egypt', 'El Salvador',
+ 'Equatorial Guinea', 'Eritrea', 'Estonia', 'Ethiopia', 'Federated States of Micronesia',
+ 'Fiji', 'Finland', 'France', 'Gabon', 'Georgia', 'Germany', 'Ghana', 'Greece',
+ 'Grenada', 'Guatemala', 'Guinea', 'Guinea-Bissau', 'Guyana', 'Haiti', 'Honduras',
+ 'Hungary', 'Iceland', 'India', 'Indonesia', 'Iran', 'Iraq', 'Israel', 'Italy',
+ 'Jamaica', 'Japan', 'Jordan', 'Kazakhstan', 'Kenya', 'Kingdom of the Netherlands',
+ 'Kiribati', 'Kuwait', 'Kyrgyzstan', 'Laos', 'Latvia', 'Lebanon', 'Lesotho', 'Liberia',
+ 'Libya', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Macedonia', 'Madagascar', 'Malawi',
+ 'Malaysia', 'Maldives', 'Mali', 'Malta', 'Marshall Islands', 'Mauritania', 'Mauritius',
+ 'Mexico', 'Moldova', 'Monaco', 'Mongolia', 'Montenegro', 'Morocco', 'Mozambique',
+ 'Myanmar', 'Namibia', 'Nauru', 'Nepal', 'New Zealand', 'Nicaragua', 'Niger', 'Nigeria',
+ 'North Korea', 'Norway', 'Oman', 'Pakistan', 'Palau', 'Panama', 'Papua New Guinea',
+ 'Paraguay', "People's Republic of China", 'Peru', 'Philippines', 'Poland', 'Portugal',
+ 'Qatar', 'Republic of Ireland', 'Republic of the Congo', 'Romania', 'Russia', 'Rwanda',
+ 'Saint Kitts and Nevis', 'Saint Lucia', 'Saint Vincent and the Grenadines', 'Samoa',
+ 'San Marino', 'Saudi Arabia', 'Senegal', 'Serbia', 'Seychelles', 'Sierra Leone',
+ 'Singapore', 'Slovakia', 'Slovenia', 'Solomon Islands', 'Somalia', 'South Africa',
+ 'South Korea', 'Spain', 'Sri Lanka', 'Sudan', 'Suriname', 'Swaziland', 'Sweden',
+ 'Switzerland', 'Syria', 'S\xc3\xa3o Tom\xc3\xa9 and Pr\xc3\xadncipe', 'Tajikistan',
+ 'Tanzania', 'Thailand', 'The Gambia', 'Togo', 'Tonga', 'Trinidad and Tobago', 'Tunisia',
+ 'Turkey', 'Turkmenistan', 'Tuvalu', 'Uganda', 'Ukraine', 'United Arab Emirates',
+ 'United Kingdom', 'United States', 'Uruguay', 'Uzbekistan', 'Vanuatu', 'Vatican City',
+ 'Venezuela', 'Vietnam', 'Yemen', 'Zambia', 'Zimbabwe'],
+
+ timezone_dict: {
+ 'Afghanistan': ['Asia/Kabul'],
+ 'Albania': ['Europe/Tirane'],
+ 'Algeria': ['Africa/Algiers'],
+ 'Andorra': ['Europe/Andorra'],
+ 'Angola': ['Africa/Luanda'],
+ 'Antigua and Barbuda': ['America/Antigua'],
+ 'Argentina': ['America/Argentina/Buenos_Aires',
+ 'America/Argentina/Cordoba',
+ 'America/Argentina/Jujuy',
+ 'America/Argentina/Tucuman',
+ 'America/Argentina/Catamarca',
+ 'America/Argentina/La_Rioja',
+ 'America/Argentina/San_Juan',
+ 'America/Argentina/Mendoza',
+ 'America/Argentina/Rio_Gallegos',
+ 'America/Argentina/Ushuaia'],
+ 'Armenia': ['Asia/Yerevan'],
+ 'Australia': ['Australia/Lord_Howe',
+ 'Australia/Hobart',
+ 'Australia/Currie',
+ 'Australia/Melbourne',
+ 'Australia/Sydney',
+ 'Australia/Broken_Hill',
+ 'Australia/Brisbane',
+ 'Australia/Lindeman',
+ 'Australia/Adelaide',
+ 'Australia/Darwin',
+ 'Australia/Perth'],
+ 'Austria': ['Europe/Vienna'],
+ 'Azerbaijan': ['Asia/Baku'],
+ 'Bahamas': ['America/Nassau'],
+ 'Bahrain': ['Asia/Bahrain'],
+ 'Bangladesh': ['Asia/Dhaka'],
+ 'Barbados': ['America/Barbados'],
+ 'Belarus': ['Europe/Minsk'],
+ 'Belgium': ['Europe/Brussels'],
+ 'Belize': ['America/Belize'],
+ 'Benin': ['Africa/Porto-Novo'],
+ 'Bhutan': ['Asia/Thimphu'],
+ 'Bolivia': ['America/La_Paz'],
+ 'Bosnia and Herzegovina': ['Europe/Sarajevo'],
+ 'Botswana': ['Africa/Gaborone'],
+ 'Brazil': ['America/Noronha',
+ 'America/Belem',
+ 'America/Fortaleza',
+ 'America/Recife',
+ 'America/Araguaina',
+ 'America/Maceio',
+ 'America/Bahia',
+ 'America/Sao_Paulo',
+ 'America/Campo_Grande',
+ 'America/Cuiaba',
+ 'America/Porto_Velho',
+ 'America/Boa_Vista',
+ 'America/Manaus',
+ 'America/Eirunepe',
+ 'America/Rio_Branco'],
+ 'Brunei Darussalam': ['Asia/Brunei'],
+ 'Bulgaria': ['Europe/Sofia'],
+ 'Burkina Faso': ['Africa/Ouagadougou'],
+ 'Burundi': ['Africa/Bujumbura'],
+ 'Cambodia': ['Asia/Phnom_Penh'],
+ 'Cameroon': ['Africa/Douala'],
+ 'Canada': ['America/St_Johns',
+ 'America/Halifax',
+ 'America/Glace_Bay',
+ 'America/Moncton',
+ 'America/Goose_Bay',
+ 'America/Blanc-Sablon',
+ 'America/Montreal',
+ 'America/Toronto',
+ 'America/Nipigon',
+ 'America/Thunder_Bay',
+ 'America/Pangnirtung',
+ 'America/Iqaluit',
+ 'America/Atikokan',
+ 'America/Rankin_Inlet',
+ 'America/Winnipeg',
+ 'America/Rainy_River',
+ 'America/Cambridge_Bay',
+ 'America/Regina',
+ 'America/Swift_Current',
+ 'America/Edmonton',
+ 'America/Yellowknife',
+ 'America/Inuvik',
+ 'America/Dawson_Creek',
+ 'America/Vancouver',
+ 'America/Whitehorse',
+ 'America/Dawson'],
+ 'Cape Verde': ['Atlantic/Cape_Verde'],
+ 'Central African Republic': ['Africa/Bangui'],
+ 'Chad': ['Africa/Ndjamena'],
+ 'Chile': ['America/Santiago', 'Pacific/Easter'],
+ 'Colombia': ['America/Bogota'],
+ 'Comoros': ['Indian/Comoro'],
+ 'Costa Rica': ['America/Costa_Rica'],
+ 'Croatia': ['Europe/Zagreb'],
+ 'Cuba': ['America/Havana'],
+ 'Cyprus': ['Asia/Nicosia'],
+ 'Czech Republic': ['Europe/Prague'],
+ "C\xc3\xb4te d'Ivoire": ['Africa/Abidjan'],
+ 'Democratic Republic of the Congo': ['Africa/Kinshasa', 'Africa/Lubumbashi'],
+ 'Denmark': ['Europe/Copenhagen'],
+ 'Djibouti': ['Africa/Djibouti'],
+ 'Dominica': ['America/Dominica'],
+ 'Dominican Republic': ['America/Santo_Domingo'],
+ 'East Timor': ['Asia/Dili'],
+ 'Ecuador': ['America/Guayaquil', 'Pacific/Galapagos'],
+ 'Egypt': ['Africa/Cairo'],
+ 'El Salvador': ['America/El_Salvador'],
+ 'Equatorial Guinea': ['Africa/Malabo'],
+ 'Eritrea': ['Africa/Asmera'],
+ 'Estonia': ['Europe/Tallinn'],
+ 'Ethiopia': ['Africa/Addis_Ababa'],
+ 'Federated States of Micronesia': ['Pacific/Truk',
+ 'Pacific/Ponape',
+ 'Pacific/Kosrae'],
+ 'Fiji': ['Pacific/Fiji'],
+ 'Finland': ['Europe/Helsinki'],
+ 'France': ['Europe/Paris'],
+ 'Gabon': ['Africa/Libreville'],
+ 'Georgia': ['Asia/Tbilisi'],
+ 'Germany': ['Europe/Berlin'],
+ 'Ghana': ['Africa/Accra'],
+ 'Greece': ['Europe/Athens'],
+ 'Grenada': ['America/Grenada'],
+ 'Guatemala': ['America/Guatemala'],
+ 'Guinea': ['Africa/Conakry'],
+ 'Guinea-Bissau': ['Africa/Bissau'],
+ 'Guyana': ['America/Guyana'],
+ 'Haiti': ['America/Guatemala'],
+ 'Honduras': ['America/Tegucigalpa'],
+ 'Hungary': ['Europe/Budapest'],
+ 'Iceland': ['Atlantic/Reykjavik'],
+ 'India': ['Asia/Calcutta'],
+ 'Indonesia': ['Asia/Jakarta',
+ 'Asia/Pontianak',
+ 'Asia/Makassar',
+ 'Asia/Jayapura'],
+ 'Iran': ['Asia/Tehran'],
+ 'Iraq': ['Asia/Baghdad'],
+ 'Israel': ['Asia/Jerusalem'],
+ 'Italy': ['Europe/Rome'],
+ 'Jamaica': ['America/Jamaica'],
+ 'Japan': ['Asia/Tokyo'],
+ 'Jordan': ['Asia/Amman'],
+ 'Kazakhstan': ['Asia/Almaty',
+ 'Asia/Qyzylorda',
+ 'Asia/Aqtobe',
+ 'Asia/Aqtau',
+ 'Asia/Oral'],
+ 'Kenya': ['Africa/Nairobi'],
+ 'Kingdom of the Netherlands': ['Europe/Amsterdam'],
+ 'Kiribati': ['Pacific/Tarawa', 'Pacific/Enderbury', 'Pacific/Kiritimati'],
+ 'Kuwait': ['Asia/Kuwait'],
+ 'Kyrgyzstan': ['Asia/Bishkek'],
+ 'Laos': ['Asia/Vientiane'],
+ 'Latvia': ['Europe/Riga'],
+ 'Lebanon': ['Asia/Beirut'],
+ 'Lesotho': ['Africa/Maseru'],
+ 'Liberia': ['Africa/Monrovia'],
+ 'Libya': ['Africa/Tripoli'],
+ 'Liechtenstein': ['Europe/Vaduz'],
+ 'Lithuania': ['Europe/Vilnius'],
+ 'Luxembourg': ['Europe/Luxembourg'],
+ 'Macedonia': ['Europe/Skopje'],
+ 'Madagascar': ['Indian/Antananarivo'],
+ 'Malawi': ['Africa/Blantyre'],
+ 'Malaysia': ['Asia/Kuala_Lumpur', 'Asia/Kuching'],
+ 'Maldives': ['Indian/Maldives'],
+ 'Mali': ['Africa/Bamako'],
+ 'Malta': ['Europe/Malta'],
+ 'Marshall Islands': ['Pacific/Majuro', 'Pacific/Kwajalein'],
+ 'Mauritania': ['Africa/Nouakchott'],
+ 'Mauritius': ['Indian/Mauritius'],
+ 'Mexico': ['America/Mexico_City',
+ 'America/Cancun',
+ 'America/Merida',
+ 'America/Monterrey',
+ 'America/Mazatlan',
+ 'America/Chihuahua',
+ 'America/Hermosillo',
+ 'America/Tijuana'],
+ 'Moldova': ['Europe/Chisinau'],
+ 'Monaco': ['Europe/Monaco'],
+ 'Mongolia': ['Asia/Ulaanbaatar', 'Asia/Hovd', 'Asia/Choibalsan'],
+ 'Montenegro': ['Europe/Podgorica'],
+ 'Morocco': ['Africa/Casablanca'],
+ 'Mozambique': ['Africa/Maputo'],
+ 'Myanmar': ['Asia/Rangoon'],
+ 'Namibia': ['Africa/Windhoek'],
+ 'Nauru': ['Pacific/Nauru'],
+ 'Nepal': ['Asia/Katmandu'],
+ 'New Zealand': ['Pacific/Auckland', 'Pacific/Chatham'],
+ 'Nicaragua': ['America/Managua'],
+ 'Niger': ['Africa/Niamey'],
+ 'Nigeria': ['Africa/Lagos'],
+ 'North Korea': ['Asia/Pyongyang'],
+ 'Norway': ['Europe/Oslo'],
+ 'Oman': ['Asia/Muscat'],
+ 'Pakistan': ['Asia/Karachi'],
+ 'Palau': ['Pacific/Palau'],
+ 'Panama': ['America/Panama'],
+ 'Papua New Guinea': ['Pacific/Port_Moresby'],
+ 'Paraguay': ['America/Asuncion'],
+ "People's Republic of China": ['Asia/Shanghai',
+ 'Asia/Harbin',
+ 'Asia/Chongqing',
+ 'Asia/Urumqi',
+ 'Asia/Kashgar'],
+ 'Peru': ['America/Lima'],
+ 'Philippines': ['Asia/Manila'],
+ 'Poland': ['Europe/Warsaw'],
+ 'Portugal': ['Europe/Lisbon', 'Atlantic/Madeira', 'Atlantic/Azores'],
+ 'Qatar': ['Asia/Qatar'],
+ 'Republic of Ireland': ['Europe/Dublin'],
+ 'Republic of the Congo': ['Africa/Brazzaville'],
+ 'Romania': ['Europe/Bucharest'],
+ 'Russia': ['Europe/Kaliningrad',
+ 'Europe/Moscow',
+ 'Europe/Volgograd',
+ 'Europe/Samara',
+ 'Asia/Yekaterinburg',
+ 'Asia/Omsk',
+ 'Asia/Novosibirsk',
+ 'Asia/Krasnoyarsk',
+ 'Asia/Irkutsk',
+ 'Asia/Yakutsk',
+ 'Asia/Vladivostok',
+ 'Asia/Sakhalin',
+ 'Asia/Magadan',
+ 'Asia/Kamchatka',
+ 'Asia/Anadyr'],
+ 'Rwanda': ['Africa/Kigali'],
+ 'Saint Kitts and Nevis': ['America/St_Kitts'],
+ 'Saint Lucia': ['America/St_Lucia'],
+ 'Saint Vincent and the Grenadines': ['America/St_Vincent'],
+ 'Samoa': ['Pacific/Apia'],
+ 'San Marino': ['Europe/San_Marino'],
+ 'Saudi Arabia': ['Asia/Riyadh'],
+ 'Senegal': ['Africa/Dakar'],
+ 'Serbia': ['Europe/Belgrade'],
+ 'Seychelles': ['Indian/Mahe'],
+ 'Sierra Leone': ['Africa/Freetown'],
+ 'Singapore': ['Asia/Singapore'],
+ 'Slovakia': ['Europe/Bratislava'],
+ 'Slovenia': ['Europe/Ljubljana'],
+ 'Solomon Islands': ['Pacific/Guadalcanal'],
+ 'Somalia': ['Africa/Mogadishu'],
+ 'South Africa': ['Africa/Johannesburg'],
+ 'South Korea': ['Asia/Seoul'],
+ 'Spain': ['Europe/Madrid', 'Africa/Ceuta', 'Atlantic/Canary'],
+ 'Sri Lanka': ['Asia/Colombo'],
+ 'Sudan': ['Africa/Khartoum'],
+ 'Suriname': ['America/Paramaribo'],
+ 'Swaziland': ['Africa/Mbabane'],
+ 'Sweden': ['Europe/Stockholm'],
+ 'Switzerland': ['Europe/Zurich'],
+ 'Syria': ['Asia/Damascus'],
+ 'S\xc3\xa3o Tom\xc3\xa9 and Pr\xc3\xadncipe': ['Africa/Sao_Tome'],
+ 'Tajikistan': ['Asia/Dushanbe'],
+ 'Tanzania': ['Africa/Dar_es_Salaam'],
+ 'Thailand': ['Asia/Bangkok'],
+ 'The Gambia': ['Africa/Banjul'],
+ 'Togo': ['Africa/Lome'],
+ 'Tonga': ['Pacific/Tongatapu'],
+ 'Trinidad and Tobago': ['America/Port_of_Spain'],
+ 'Tunisia': ['Africa/Tunis'],
+ 'Turkey': ['Europe/Istanbul'],
+ 'Turkmenistan': ['Asia/Ashgabat'],
+ 'Tuvalu': ['Pacific/Funafuti'],
+ 'Uganda': ['Africa/Kampala'],
+ 'Ukraine': ['Europe/Kiev',
+ 'Europe/Uzhgorod',
+ 'Europe/Zaporozhye',
+ 'Europe/Simferopol'],
+ 'United Arab Emirates': ['Asia/Dubai'],
+ 'United Kingdom': ['Europe/London'],
+ 'United States': ['America/New_York',
+ 'America/Detroit',
+ 'America/Kentucky/Louisville',
+ 'America/Kentucky/Monticello',
+ 'America/Indiana/Indianapolis',
+ 'America/Indiana/Marengo',
+ 'America/Indiana/Knox',
+ 'America/Indiana/Vevay',
+ 'America/Chicago',
+ 'America/Indiana/Vincennes',
+ 'America/Indiana/Petersburg',
+ 'America/Menominee',
+ 'America/North_Dakota/Center',
+ 'America/North_Dakota/New_Salem',
+ 'America/Denver',
+ 'America/Boise',
+ 'America/Shiprock',
+ 'America/Phoenix',
+ 'America/Los_Angeles',
+ 'America/Anchorage',
+ 'America/Juneau',
+ 'America/Yakutat',
+ 'America/Nome',
+ 'America/Adak',
+ 'Pacific/Honolulu'],
+ 'Uruguay': ['America/Montevideo'],
+ 'Uzbekistan': ['Asia/Samarkand', 'Asia/Tashkent'],
+ 'Vanuatu': ['Pacific/Efate'],
+ 'Vatican City': ['Europe/Vatican'],
+ 'Venezuela': ['America/Caracas'],
+ 'Vietnam': ['Asia/Saigon'],
+ 'Yemen': ['Asia/Aden'],
+ 'Zambia': ['Africa/Lusaka'],
+ 'Zimbabwe': ['Africa/Harare']
+ },
+});
\ No newline at end of file
diff --git a/erpnext/startup/startup.css b/erpnext/startup/startup.css
index 5ba72f3..490b2f4 100644
--- a/erpnext/startup/startup.css
+++ b/erpnext/startup/startup.css
@@ -52,3 +52,12 @@
min-width: 160px !important;
max-width: 260px !important;
}
+
+.expiry-info {
+ margin-top: 40px;
+ margin-bottom: -40px;
+ text-align: center;
+ background-color: rgb(255, 255, 204);
+ padding: 7px;
+ z-index: 1;
+}
diff --git a/erpnext/startup/startup.js b/erpnext/startup/startup.js
index 9c14d2e..23a02cf 100644
--- a/erpnext/startup/startup.js
+++ b/erpnext/startup/startup.js
@@ -48,6 +48,7 @@
}
erpnext.startup.start = function() {
+ console.log('Starting up...');
$('#startup_div').html('Starting up...').toggle(true);
@@ -87,9 +88,26 @@
// complete registration
if(in_list(user_roles,'System Manager') && (wn.boot.setup_complete=='No')) {
wn.require("erpnext/startup/js/complete_setup.js");
- erpnext.complete_setup();
+ erpnext.complete_setup.show();
}
-
+
+ if(wn.boot.expires_on) {
+ var today = dateutil.str_to_obj(dateutil.get_today());
+ var expires_on = dateutil.str_to_obj(wn.boot.expires_on);
+ var diff = dateutil.get_diff(expires_on, today);
+ if (0 <= diff && diff <= 15) {
+ var expiry_string = diff==0 ? "today" : repl("in %(diff)s day(s)", { diff: diff });
+ $('header').append(repl('<div class="expiry-info"> \
+ Ahem! Your ERPNext subscription will <b>expire %(expiry_string)s</b>. \
+ Please renew your subscription to continue using ERPNext \
+ (and remove this annoying banner). \
+ </div>', { expiry_string: expiry_string }));
+ } else if (diff < 0) {
+ $('header').append(repl('<div class="expiry-info"> \
+ Ahem! This ERPNext subscription <b>has expired</b> and should be deleted. \
+ </div>', { expiry_string: expiry_string }));
+ }
+ }
}
erpnext.set_about();
diff --git a/erpnext/utilities/page/users/users.css b/erpnext/utilities/page/users/users.css
index 1a85d15..b739a57 100644
--- a/erpnext/utilities/page/users/users.css
+++ b/erpnext/utilities/page/users/users.css
@@ -32,4 +32,15 @@
text-align: center;
border-bottom: 1px solid #aaa;
min-width: 30px;
+}
+
+.subscription-info-box {
+ margin: 0px 11px;
+ background-color: #EEEEEE;
+ border: 1px solid #DDDBDB;
+ padding: 5px 3px;
+}
+
+.subscription-info {
+ padding: 0px 10px;
}
\ No newline at end of file
diff --git a/erpnext/utilities/page/users/users.js b/erpnext/utilities/page/users/users.js
index ad238ae..704682e 100644
--- a/erpnext/utilities/page/users/users.js
+++ b/erpnext/utilities/page/users/users.js
@@ -63,6 +63,21 @@
}
}
});
+ if(!$('.subscription-info').length && (wn.boot.max_users || wn.boot.expires_on)) {
+ var $sub_info = $('<div class="subscription-info-box"><div>').insertAfter('.help');
+ if(wn.boot.max_users) {
+ $sub_info.append(repl('\
+ <span class="subscription-info"> \
+ Max Users: <b>%(max_users)s</b> \
+ </span>', { max_users: wn.boot.max_users }));
+ }
+ if(wn.boot.expires_on) {
+ $sub_info.append(repl('\
+ <span class="subscription-info"> \
+ Expires On: <b>%(expires_on)s</b> \
+ </span>', { expires_on: dateutil.str_to_user(wn.boot.expires_on) }));
+ }
+ }
},
render: function(data) {
if(data.file_list) {
@@ -207,6 +222,17 @@
},
add_user: function() {
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! <br />\
+ You already have <b>%(active_users)s</b> active users, \
+ which is the maximum number that you are currently allowed to add. <br /><br /> \
+ So, to add more users, you can:<br /> \
+ 1. <b>Upgrade to the unlimited users plan</b>, or<br /> \
+ 2. <b>Disable one or more of your existing users and try again</b>",
+ {active_users: active_users.length}));
+ return;
+ }
var d = new wn.widgets.Dialog({
title: 'Add User',
width: 400,
diff --git a/erpnext/utilities/page/users/users.py b/erpnext/utilities/page/users/users.py
index 6735dc0..819f7bb 100644
--- a/erpnext/utilities/page/users/users.py
+++ b/erpnext/utilities/page/users/users.py
@@ -103,9 +103,24 @@
@webnotes.whitelist()
def add_profile(args):
from webnotes.utils import validate_email_add, now
- email = args['user']
-
+ email = args['user']
sql = webnotes.conn.sql
+
+ # validate max number of users exceeded or not
+ import conf
+ if hasattr(conf, 'max_users'):
+ active_users = sql("""select count(*) from tabProfile
+ where ifnull(enabled, 0)=1 and docstatus<2
+ and name not in ('Administrator', 'Guest')""")[0][0]
+ if active_users >= conf.max_users:
+ # same message as in users.js
+ webnotes.msgprint("""Alas! <br />\
+ You already have <b>%(active_users)s</b> active users, \
+ which is the maximum number that you are currently allowed to add. <br /><br /> \
+ So, to add more users, you can:<br /> \
+ 1. <b>Upgrade to the unlimited users plan</b>, or<br /> \
+ 2. <b>Disable one or more of your existing users and try again</b>""" \
+ % {'active_users': active_users}, raise_exception=1)
if not email:
email = webnotes.form_dict.get('user')
diff --git a/index.cgi b/index.cgi
index 31da310..bf84c5f 100755
--- a/index.cgi
+++ b/index.cgi
@@ -50,8 +50,8 @@
return True
except webnotes.AuthenticationError, e:
return True
- except webnotes.UnknownDomainError, e:
- print "Location: " + (conf.redirect_404)
+ #except webnotes.UnknownDomainError, e:
+ # print "Location: " + (conf.redirect_404)
except webnotes.SessionStopped, e:
if 'cmd' in webnotes.form_dict:
webnotes.handler.print_json()
diff --git a/js/all-app.js b/js/all-app.js
index 7e5ce41..7090e15 100644
--- a/js/all-app.js
+++ b/js/all-app.js
@@ -2217,11 +2217,18 @@
*/
var current_module;var is_system_manager=0;wn.provide('erpnext.startup');erpnext.modules={'Selling':'selling-home','Accounts':'accounts-home','Stock':'stock-home','Buying':'buying-home','Support':'support-home','Projects':'projects-home','Production':'production-home','Website':'website-home','HR':'hr-home','Setup':'Setup','Activity':'activity','To Do':'todo','Calendar':'calendar','Messages':'messages','Knowledge Base':'questions','Dashboard':'dashboard'}
wn.provide('wn.modules');$.extend(wn.modules,erpnext.modules);wn.modules['Core']='Setup';erpnext.startup.set_globals=function(){if(inList(user_roles,'System Manager'))is_system_manager=1;}
-erpnext.startup.start=function(){$('#startup_div').html('Starting up...').toggle(true);erpnext.startup.set_globals();if(wn.boot.user_background){erpnext.set_user_background(wn.boot.user_background);}
+erpnext.startup.start=function(){console.log('Starting up...');$('#startup_div').html('Starting up...').toggle(true);erpnext.startup.set_globals();if(wn.boot.user_background){erpnext.set_user_background(wn.boot.user_background);}
if(user=='Guest'){if(wn.boot.custom_css){set_style(wn.boot.custom_css);}
if(wn.boot.website_settings.title_prefix){wn.title_prefix=wn.boot.website_settings.title_prefix;}}else{wn.boot.profile.allow_modules=wn.boot.profile.allow_modules.concat(['To Do','Knowledge Base','Calendar','Activity','Messages'])
if(user_roles.indexOf('Accounts Manager')!=-1){wn.boot.profile.allow_modules.push('Dashboard');}
-erpnext.toolbar.setup();erpnext.startup.set_periodic_updates();if(in_list(user_roles,'System Manager')&&(wn.boot.setup_complete=='No')){wn.require("erpnext/startup/js/complete_setup.js");erpnext.complete_setup();}}
+erpnext.toolbar.setup();erpnext.startup.set_periodic_updates();if(in_list(user_roles,'System Manager')&&(wn.boot.setup_complete=='No')){wn.require("erpnext/startup/js/complete_setup.js");erpnext.complete_setup.show();}
+if(wn.boot.expires_on){var today=dateutil.str_to_obj(dateutil.get_today());var expires_on=dateutil.str_to_obj(wn.boot.expires_on);var diff=dateutil.get_diff(expires_on,today);if(0<=diff&&diff<=15){var expiry_string=diff==0?"today":repl("in %(diff)s day(s)",{diff:diff});$('header').append(repl('<div class="expiry-info"> \
+ Ahem! Your ERPNext subscription will <b>expire %(expiry_string)s</b>. \
+ Please renew your subscription to continue using ERPNext \
+ (and remove this annoying banner). \
+ </div>',{expiry_string:expiry_string}));}else if(diff<0){$('header').append(repl('<div class="expiry-info"> \
+ Ahem! This ERPNext subscription <b>has expired</b> and should be deleted. \
+ </div>',{expiry_string:expiry_string}));}}}
erpnext.set_about();$('#startup_div').toggle(false);}
show_chart_browser=function(nm,chart_type){var call_back=function(){if(nm=='Sales Browser'){var sb_obj=new SalesBrowser();sb_obj.set_val(chart_type);}
else if(nm=='Accounts Browser')
diff --git a/js/all-web.js b/js/all-web.js
index 4cda922..b2b1fb8 100644
--- a/js/all-web.js
+++ b/js/all-web.js
@@ -824,11 +824,18 @@
*/
var current_module;var is_system_manager=0;wn.provide('erpnext.startup');erpnext.modules={'Selling':'selling-home','Accounts':'accounts-home','Stock':'stock-home','Buying':'buying-home','Support':'support-home','Projects':'projects-home','Production':'production-home','Website':'website-home','HR':'hr-home','Setup':'Setup','Activity':'activity','To Do':'todo','Calendar':'calendar','Messages':'messages','Knowledge Base':'questions','Dashboard':'dashboard'}
wn.provide('wn.modules');$.extend(wn.modules,erpnext.modules);wn.modules['Core']='Setup';erpnext.startup.set_globals=function(){if(inList(user_roles,'System Manager'))is_system_manager=1;}
-erpnext.startup.start=function(){$('#startup_div').html('Starting up...').toggle(true);erpnext.startup.set_globals();if(wn.boot.user_background){erpnext.set_user_background(wn.boot.user_background);}
+erpnext.startup.start=function(){console.log('Starting up...');$('#startup_div').html('Starting up...').toggle(true);erpnext.startup.set_globals();if(wn.boot.user_background){erpnext.set_user_background(wn.boot.user_background);}
if(user=='Guest'){if(wn.boot.custom_css){set_style(wn.boot.custom_css);}
if(wn.boot.website_settings.title_prefix){wn.title_prefix=wn.boot.website_settings.title_prefix;}}else{wn.boot.profile.allow_modules=wn.boot.profile.allow_modules.concat(['To Do','Knowledge Base','Calendar','Activity','Messages'])
if(user_roles.indexOf('Accounts Manager')!=-1){wn.boot.profile.allow_modules.push('Dashboard');}
-erpnext.toolbar.setup();erpnext.startup.set_periodic_updates();if(in_list(user_roles,'System Manager')&&(wn.boot.setup_complete=='No')){wn.require("erpnext/startup/js/complete_setup.js");erpnext.complete_setup();}}
+erpnext.toolbar.setup();erpnext.startup.set_periodic_updates();if(in_list(user_roles,'System Manager')&&(wn.boot.setup_complete=='No')){wn.require("erpnext/startup/js/complete_setup.js");erpnext.complete_setup.show();}
+if(wn.boot.expires_on){var today=dateutil.str_to_obj(dateutil.get_today());var expires_on=dateutil.str_to_obj(wn.boot.expires_on);var diff=dateutil.get_diff(expires_on,today);if(0<=diff&&diff<=15){var expiry_string=diff==0?"today":repl("in %(diff)s day(s)",{diff:diff});$('header').append(repl('<div class="expiry-info"> \
+ Ahem! Your ERPNext subscription will <b>expire %(expiry_string)s</b>. \
+ Please renew your subscription to continue using ERPNext \
+ (and remove this annoying banner). \
+ </div>',{expiry_string:expiry_string}));}else if(diff<0){$('header').append(repl('<div class="expiry-info"> \
+ Ahem! This ERPNext subscription <b>has expired</b> and should be deleted. \
+ </div>',{expiry_string:expiry_string}));}}}
erpnext.set_about();$('#startup_div').toggle(false);}
show_chart_browser=function(nm,chart_type){var call_back=function(){if(nm=='Sales Browser'){var sb_obj=new SalesBrowser();sb_obj.set_val(chart_type);}
else if(nm=='Accounts Browser')