[demo] New ERPNext Demo
diff --git a/utilities/demo/__init__.py b/utilities/demo/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/utilities/demo/__init__.py
diff --git a/utilities/demo/demo-login.css b/utilities/demo/demo-login.css
new file mode 100644
index 0000000..f3464a3
--- /dev/null
+++ b/utilities/demo/demo-login.css
@@ -0,0 +1,3 @@
+body, #container, .outer {
+	background-color: #888 !important;
+}
\ No newline at end of file
diff --git a/utilities/demo/demo-login.html b/utilities/demo/demo-login.html
new file mode 100644
index 0000000..ef24678
--- /dev/null
+++ b/utilities/demo/demo-login.html
@@ -0,0 +1,25 @@
+<div class="container">
+	<div class="row" style="margin-top: 100px;">
+		<div class="col-sm-offset-3 col-sm-6">
+			<div class="panel panel-default">
+				<div class="panel-heading">
+					Start ERPNext Demo
+				</div>
+				<div class="panel-body">
+					<p>
+					<input id="lead-email" type="email"
+						class="form-control" placeholder="Your Email Id">
+					</p>
+					<p>
+						<button type="submit" id="login_btn" 
+							class="btn btn-primary btn-large">Launch Demo</button>
+					</p>
+					<hr>
+					<p class="text-muted small">Some functionality is disabled for the demo app. The demo data will be cleared regulary. To start your own ERPNext Trial, <a href="https://erpnext.com/pricing-and-signup">click here</a></p>
+				</div>
+			</div>
+		</div>
+	</div>
+	<div class="row">
+	</div>
+</div>
diff --git a/utilities/demo/demo-login.js b/utilities/demo/demo-login.js
new file mode 100644
index 0000000..229d169
--- /dev/null
+++ b/utilities/demo/demo-login.js
@@ -0,0 +1,27 @@
+$(document).ready(function() {
+    $(".navbar, footer, .banner, #user-tools").toggle(false);
+    
+    $("#login_btn").click(function() {
+        var me = this;
+        $(this).html("Logging In...").attr("disabled", "disabled");
+        wn.call({
+            "method": "login",
+            args: {
+                usr: "demo@erpnext.com",
+                pwd: "demo",
+                lead_email: $("#lead-email").val(),
+            },
+            callback: function(r) {
+                $(me).attr("disabled", false);
+                if(r.exc) {
+                    alert("Error, please contact support@erpnext.com");
+                } else {
+                    console.log("Logged In");
+                    window.location.href = "app.html";
+                }
+            }
+        })
+        return false;
+    })
+    .attr("disabled", false);
+})
\ No newline at end of file
diff --git a/utilities/demo/demo_control_panel.py b/utilities/demo/demo_control_panel.py
new file mode 100644
index 0000000..c70913e
--- /dev/null
+++ b/utilities/demo/demo_control_panel.py
@@ -0,0 +1,13 @@
+
+  def on_login(self):
+    from webnotes.utils import validate_email_add
+	import conf
+	if hasattr(conf, "demo_notify_url"):
+      if webnotes.form_dict.lead_email and validate_email_add(webnotes.form_dict.lead_email):
+        import requests
+        response = requests.post(conf.demo_notify_url, data={
+          "cmd":"website.helpers.contact.send_message",
+          "subject":"Logged into Demo",
+          "sender": webnotes.form_dict.lead_email,
+          "message": "via demo.erpnext.com"
+        })
diff --git a/utilities/demo_docs/Address.csv b/utilities/demo/demo_docs/Address.csv
similarity index 100%
rename from utilities/demo_docs/Address.csv
rename to utilities/demo/demo_docs/Address.csv
diff --git a/utilities/demo_docs/BOM.csv b/utilities/demo/demo_docs/BOM.csv
similarity index 100%
rename from utilities/demo_docs/BOM.csv
rename to utilities/demo/demo_docs/BOM.csv
diff --git a/utilities/demo_docs/Contact.csv b/utilities/demo/demo_docs/Contact.csv
similarity index 100%
rename from utilities/demo_docs/Contact.csv
rename to utilities/demo/demo_docs/Contact.csv
diff --git a/utilities/demo_docs/Customer.csv b/utilities/demo/demo_docs/Customer.csv
similarity index 100%
rename from utilities/demo_docs/Customer.csv
rename to utilities/demo/demo_docs/Customer.csv
diff --git a/utilities/demo_docs/Employee.csv b/utilities/demo/demo_docs/Employee.csv
similarity index 100%
rename from utilities/demo_docs/Employee.csv
rename to utilities/demo/demo_docs/Employee.csv
diff --git a/utilities/demo_docs/Fiscal_Year.csv b/utilities/demo/demo_docs/Fiscal_Year.csv
similarity index 100%
rename from utilities/demo_docs/Fiscal_Year.csv
rename to utilities/demo/demo_docs/Fiscal_Year.csv
diff --git a/utilities/demo_docs/Item.csv b/utilities/demo/demo_docs/Item.csv
similarity index 100%
rename from utilities/demo_docs/Item.csv
rename to utilities/demo/demo_docs/Item.csv
diff --git a/utilities/demo_docs/Item_Price.csv b/utilities/demo/demo_docs/Item_Price.csv
similarity index 100%
rename from utilities/demo_docs/Item_Price.csv
rename to utilities/demo/demo_docs/Item_Price.csv
diff --git a/utilities/demo_docs/Lead.csv b/utilities/demo/demo_docs/Lead.csv
similarity index 100%
rename from utilities/demo_docs/Lead.csv
rename to utilities/demo/demo_docs/Lead.csv
diff --git a/utilities/demo_docs/Profile.csv b/utilities/demo/demo_docs/Profile.csv
similarity index 100%
rename from utilities/demo_docs/Profile.csv
rename to utilities/demo/demo_docs/Profile.csv
diff --git a/utilities/demo_docs/Salary_Structure.csv b/utilities/demo/demo_docs/Salary_Structure.csv
similarity index 100%
rename from utilities/demo_docs/Salary_Structure.csv
rename to utilities/demo/demo_docs/Salary_Structure.csv
diff --git a/utilities/demo_docs/Stock Reconcilation Template.csv b/utilities/demo/demo_docs/Stock Reconcilation Template.csv
similarity index 100%
rename from utilities/demo_docs/Stock Reconcilation Template.csv
rename to utilities/demo/demo_docs/Stock Reconcilation Template.csv
diff --git a/utilities/demo_docs/Supplier.csv b/utilities/demo/demo_docs/Supplier.csv
similarity index 100%
rename from utilities/demo_docs/Supplier.csv
rename to utilities/demo/demo_docs/Supplier.csv
diff --git a/utilities/demo_docs/bearing-block.png b/utilities/demo/demo_docs/bearing-block.png
similarity index 100%
rename from utilities/demo_docs/bearing-block.png
rename to utilities/demo/demo_docs/bearing-block.png
Binary files differ
diff --git a/utilities/demo_docs/wind-turbine.png b/utilities/demo/demo_docs/wind-turbine.png
similarity index 100%
rename from utilities/demo_docs/wind-turbine.png
rename to utilities/demo/demo_docs/wind-turbine.png
Binary files differ
diff --git a/utilities/make_demo.py b/utilities/demo/make_demo.py
similarity index 93%
rename from utilities/make_demo.py
rename to utilities/demo/make_demo.py
index 2884144..fc07767 100644
--- a/utilities/make_demo.py
+++ b/utilities/demo/make_demo.py
@@ -19,9 +19,9 @@
 country = "United States"
 currency = "USD"
 time_zone = "America/New York"
-start_date = '2010-01-01'
+start_date = '2013-01-01'
 bank_name = "Citibank"
-runs_for = 20
+runs_for = None
 prob = {
 	"default": { "make": 0.6, "qty": (1,5) },
 	"Sales Order": { "make": 0.4, "qty": (1,3) },
@@ -50,21 +50,24 @@
 	# make_opening_accounts()
 
 def simulate():
-	current_date = None
-	for i in xrange(runs_for):
-		if not current_date:
-			# get last stock ledger posting date or use default
-			last_posting = webnotes.conn.sql("""select max(posting_date) from `tabStock Ledger Entry`""")
-			if last_posting[0][0]:
-				current_date = webnotes.utils.add_days(last_posting[0][0], 1)
-			else:
-				current_date = webnotes.utils.getdate(start_date)
-		else:
-			current_date = webnotes.utils.add_days(current_date, 1)
-		
+	global runs_for
+	current_date = webnotes.utils.getdate(start_date)
+	
+	# continue?
+	last_posting = webnotes.conn.sql("""select max(posting_date) from `tabStock Ledger Entry`""")
+	if last_posting[0][0]:
+		current_date = webnotes.utils.add_days(last_posting[0][0], 1)
+
+	# run till today
+	if not runs_for:
+		runs_for = webnotes.utils.date_diff(webnotes.utils.nowdate(), current_date)
+	
+	for i in xrange(runs_for):		
 		print current_date.strftime("%Y-%m-%d")
+		webnotes.utils.current_date = current_date
 		
 		if current_date.weekday() in (5, 6):
+			current_date = webnotes.utils.add_days(current_date, 1)
 			continue
 
 		run_sales(current_date)
@@ -72,6 +75,8 @@
 		run_manufacturing(current_date)
 		run_stock(current_date)
 		run_accounts(current_date)
+
+		current_date = webnotes.utils.add_days(current_date, 1)
 		
 def run_sales(current_date):
 	if can_make("Quotation"):
@@ -136,7 +141,7 @@
 		for po in list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="Total"]))[:how_many("Purchase Receipt")]:
 			pr = webnotes.bean(make_purchase_receipt(po))
 			pr.doc.posting_date = current_date
-			pr.doc.fiscal_year = "2010"
+			pr.doc.fiscal_year = "2013"
 			pr.insert()
 			pr.submit()
 			webnotes.conn.commit()
@@ -150,7 +155,7 @@
 		for so in list(set([r[0] for r in query_report.run(report)["result"] if r[0]!="Total"]))[:how_many("Delivery Note")]:
 			dn = webnotes.bean(make_delivery_note(so))
 			dn.doc.posting_date = current_date
-			dn.doc.fiscal_year = "2010"
+			dn.doc.fiscal_year = "2013"
 			dn.insert()
 			try:
 				dn.submit()
@@ -173,7 +178,7 @@
 			mr = webnotes.new_bean("Material Request")
 			mr.doc.material_request_type = "Purchase"
 			mr.doc.transaction_date = current_date
-			mr.doc.fiscal_year = "2010"
+			mr.doc.fiscal_year = "2013"
 			mr.doclist.append({
 				"doctype": "Material Request Item",
 				"parentfield": "indent_details",
@@ -192,7 +197,7 @@
 			if row[0] != "Total":
 				sq = webnotes.bean(make_supplier_quotation(row[0]))
 				sq.doc.transaction_date = current_date
-				sq.doc.fiscal_year = "2010"
+				sq.doc.fiscal_year = "2013"
 				sq.insert()
 				sq.submit()
 				webnotes.conn.commit()
@@ -205,7 +210,7 @@
 			if row[0] != "Total":
 				po = webnotes.bean(make_purchase_order(row[0]))
 				po.doc.transaction_date = current_date
-				po.doc.fiscal_year = "2010"
+				po.doc.fiscal_year = "2013"
 				po.insert()
 				po.submit()
 				webnotes.conn.commit()
@@ -263,7 +268,7 @@
 
 	st = webnotes.bean(make_stock_entry(pro_id, purpose))
 	st.doc.posting_date = current_date
-	st.doc.fiscal_year = "2010"
+	st.doc.fiscal_year = "2013"
 	st.doc.expense_adjustment_account = "Stock in Hand - WP"
 	try:
 		st.insert()
@@ -282,7 +287,7 @@
 		"customer": get_random("Customer"),
 		"order_type": "Sales",
 		"transaction_date": current_date,
-		"fiscal_year": "2010"
+		"fiscal_year": "2013"
 	}])
 	
 	add_random_children(b, {
@@ -349,8 +354,9 @@
 def install():
 	print "Creating Fresh Database..."
 	from webnotes.install_lib.install import Installer
+	import conf
 	inst = Installer('root')
-	inst.import_from_db("demo", verbose = 1)
+	inst.import_from_db(conf.demo_db_name, verbose = 1)
 
 def complete_setup():
 	print "Complete Setup..."
@@ -392,6 +398,7 @@
 	}).insert()
 	
 	webnotes.set_value("Company", company, "default_bank_account", ba.doc.name)
+	webnotes.conn.commit()
 
 def import_data(dt, submit=False):
 	if not isinstance(dt, (tuple, list)):
diff --git a/utilities/demo/make_erpnext_demo.py b/utilities/demo/make_erpnext_demo.py
new file mode 100644
index 0000000..fde05f6
--- /dev/null
+++ b/utilities/demo/make_erpnext_demo.py
@@ -0,0 +1,77 @@
+import webnotes, os
+
+def make_demo_app():
+	import utilities.demo.make_demo
+	utilities.demo.make_demo.make(reset=True)
+
+def make_demo_user():
+	if webnotes.conn.exists("Profile", "demo@erpnext.com"):
+		webnotes.delete_doc("Profile", "demo@erpnext.com")
+
+	p = webnotes.new_bean("Profile")
+	p.doc.email = "demo@erpnext.com"
+	p.doc.first_name = "Demo"
+	p.doc.last_name = "User"
+	p.doc.enabled = 1
+	p.doc.user_type = "ERPNext Demo"
+	p.doc.send_invite_email = 0
+	p.doc.new_password = "demo"
+	p.insert()
+	
+	for role in ("Accounts Manager", "Analytics", "Expense Approver", "Accounts User", 
+		"Leave Approver", "Blogger", "Customer", "Sales Manager", "Employee", "Support Manager", 
+		"HR Manager", "HR User", "Maintenance Manager", "Maintenance User", "Material Manager", 
+		"Material Master Manager", "Material User", "Partner", "Manufacturing Manager", 
+		"Manufacturing User", "Projects User", "Purchase Manager", "Purchase Master Manager", 
+		"Purchase User", "Quality Manager", "Report Manager", "Sales Master Manager", "Sales User", 
+		"Supplier", "Support Team"):
+		p.doclist.append({
+			"doctype": "UserRole",
+			"parentfield": "user_roles",
+			"role": role
+		})
+
+	p.save()
+	webnotes.conn.commit()
+
+def make_demo_login_page():
+	webnotes.conn.set_value("Website Settings", None, "home_page", "")
+
+	webnotes.conn.sql("""delete from `tabWeb Page` where name='demo-login'""")
+	p = webnotes.new_bean("Web Page")
+	p.doc.title = "Demo Login"
+	p.doc.published = 1
+	p.doc.description = "ERPNext Demo Login"
+
+	with open(os.path.join(os.path.dirname(__file__), "demo-login.html"), "r") as dfile:
+		p.doc.main_section = dfile.read()
+
+	p.doc.insert_code = 1
+	with open(os.path.join(os.path.dirname(__file__), "demo-login.js"), "r") as dfile:
+		p.doc.javascript = dfile.read()
+
+	p.doc.insert_style = 1
+	with open(os.path.join(os.path.dirname(__file__), "demo-login.css"), "r") as dfile:
+		p.doc.css = dfile.read()
+		
+	p.insert()
+	
+	webnotes.conn.set_value("Website Settings", None, "home_page", "demo-login")
+	
+	webnotes.conn.commit()
+
+def make_demo_on_login_script():
+	webnotes.conn.sql("""delete from `tabCustom Script` where dt='Control Panel'""")
+	s = webnotes.new_bean("Custom Script")
+	s.doc.dt = "Control Panel"
+	s.doc.script_type = "Server"
+	with open(os.path.join(os.path.dirname(__file__), "demo_control_panel.py"), "r") as dfile:
+		s.doc.script = dfile.read()
+
+if __name__=="__main__":
+	webnotes.connect()
+	webnotes.mute_emails = 1
+	make_demo_app()
+	make_demo_user()
+	make_demo_login_page()
+	make_demo_on_login_script()
\ No newline at end of file