Fixed Demo
diff --git a/erpnext/demo/user/accounts.py b/erpnext/demo/user/accounts.py
index 045c306..392d13d 100644
--- a/erpnext/demo/user/accounts.py
+++ b/erpnext/demo/user/accounts.py
@@ -67,7 +67,7 @@
 def make_payment_entries(ref_doctype, report):
 	outstanding_invoices = list(set([r[3] for r in query_report.run(report,
 	{"report_date": frappe.flags.current_date })["result"] if r[2]==ref_doctype]))
-
+	
 	# make Payment Entry
 	for inv in outstanding_invoices[:random.randint(1, 2)]:
 		pe = get_payment_entry(ref_doctype, inv)
diff --git a/erpnext/demo/user/hr.py b/erpnext/demo/user/hr.py
index 73f330d..2b80afb 100644
--- a/erpnext/demo/user/hr.py
+++ b/erpnext/demo/user/hr.py
@@ -1,25 +1,28 @@
 from __future__ import unicode_literals
 import frappe
 import random
-from frappe.utils import random_string, add_days
+from frappe.utils import random_string, add_days, cint
 from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet
 from erpnext.projects.doctype.timesheet.timesheet import make_salary_slip, make_sales_invoice
-from frappe.utils.make_random import how_many, get_random
+from frappe.utils.make_random import get_random
 from erpnext.hr.doctype.expense_claim.expense_claim import get_expense_approver, make_bank_entry
 from erpnext.hr.doctype.leave_application.leave_application import get_leave_balance_on, OverlapError
 
 def work():
 	frappe.set_user(frappe.db.get_global('demo_hr_user'))
 	year, month = frappe.flags.current_date.strftime("%Y-%m").split("-")
+	prev_month = str(cint(month)- 1).zfill(2)
+	if month=="01":
+		prev_month = "12"
 	
 	mark_attendance()
 	make_leave_application()
 
 	# process payroll
-	if not frappe.db.get_value("Salary Slip", {"month": month, "fiscal_year": year}):
+	if not frappe.db.get_value("Salary Slip", {"month": prev_month, "fiscal_year": year}):
 		process_payroll = frappe.get_doc("Process Payroll", "Process Payroll")
 		process_payroll.company = frappe.flags.company
-		process_payroll.month = month
+		process_payroll.month = prev_month
 		process_payroll.fiscal_year = year
 		process_payroll.create_sal_slip()
 		process_payroll.submit_salary_slip()
@@ -180,7 +183,7 @@
 			if leave:
 				attendance.status = "Absent"
 			else:
-				attendance.status = "Present"		
+				attendance.status = "Present"
 			attendance.save()
 			attendance.submit()		
-			frappe.db.commit()	
\ No newline at end of file
+			frappe.db.commit()
diff --git a/erpnext/demo/user/projects.py b/erpnext/demo/user/projects.py
index e7febd0..505ccfd 100644
--- a/erpnext/demo/user/projects.py
+++ b/erpnext/demo/user/projects.py
@@ -5,8 +5,7 @@
 
 import frappe
 from frappe.utils import flt
-from frappe.utils.make_random import can_make
-from frappe.utils.make_random import how_many, get_random
+from frappe.utils.make_random import get_random
 from erpnext.projects.doctype.timesheet.test_timesheet import make_timesheet
 from erpnext.demo.user.hr import make_sales_invoice_for_timesheet
 
@@ -20,13 +19,12 @@
 def make_timesheet_for_projects(current_date	):
 	for data in frappe.get_all("Task", ["name", "project"], {"status": "Open", "exp_end_date": ("<", current_date)}):
 		employee = get_random("Employee")
-		if frappe.db.get_value('Salary Structure', {'employee': employee}, 'salary_slip_based_on_timesheet'):
-			ts = make_timesheet(employee, simulate = True, billable = 1,
-				activity_type=get_random("Activity Type"), project=data.project, task =data.name)
+		ts = make_timesheet(employee, simulate = True, billable = 1,
+			activity_type=get_random("Activity Type"), project=data.project, task =data.name)
 
-			if flt(ts.total_billing_amount) > 0.0:
-				make_sales_invoice_for_timesheet(ts.name)
-				frappe.db.commit()
+		if flt(ts.total_billing_amount) > 0.0:
+			make_sales_invoice_for_timesheet(ts.name)
+			frappe.db.commit()
 
 def close_tasks(current_date):
 	for task in frappe.get_all("Task", ["name"], {"status": "Open", "exp_end_date": ("<", current_date)}):
diff --git a/erpnext/demo/user/purchase.py b/erpnext/demo/user/purchase.py
index 6f06f26..ab8ec77 100644
--- a/erpnext/demo/user/purchase.py
+++ b/erpnext/demo/user/purchase.py
@@ -27,7 +27,6 @@
 		for mr in frappe.get_all('Material Request',
 			filters={'material_request_type': 'Purchase', 'status': 'Open'},
 			limit=random.randint(1,6)):
-			print mr.name
 			if not frappe.get_all('Request for Quotation',
 				filters={'material_request': mr.name}, limit=1):
 				rfq = make_request_for_quotation(mr.name)
@@ -104,14 +103,12 @@
 		mr.material_request_type = "Purchase"
 
 	mr.transaction_date = frappe.flags.current_date
-
-	moq = frappe.db.get_value('Item', item_code, 'min_order_qty')
-
+	
 	mr.append("items", {
 		"doctype": "Material Request Item",
 		"schedule_date": frappe.utils.add_days(mr.transaction_date, 7),
 		"item_code": item_code,
-		"qty": qty if qty > moq else moq
+		"qty": qty
 	})
 	mr.insert()
 	mr.submit()
@@ -125,33 +122,33 @@
 
 def make_subcontract():
 	from erpnext.buying.doctype.purchase_order.purchase_order import make_stock_entry
-
-	# make sub-contract PO
-	po = frappe.new_doc("Purchase Order")
-	po.is_subcontracted = "Yes"
-	po.supplier = get_random("Supplier")
-
 	item_code = get_random("Item", {"is_sub_contracted_item": 1})
-	moq = frappe.db.get_value('Item', item_code, 'min_order_qty')
+	if item_code:
+		# make sub-contract PO
+		po = frappe.new_doc("Purchase Order")
+		po.is_subcontracted = "Yes"
+		po.supplier = get_random("Supplier")
 
-	po.append("items", {
-		"item_code": item_code,
-		"schedule_date": frappe.utils.add_days(frappe.flags.current_date, 7),
-		"qty": moq
-	})
-	po.set_missing_values()
-	try:
-		po.insert()
-	except InvalidCurrency:
-		return
+		item_code = get_random("Item", {"is_sub_contracted_item": 1})
+		
+		po.append("items", {
+			"item_code": item_code,
+			"schedule_date": frappe.utils.add_days(frappe.flags.current_date, 7),
+			"qty": random.randint(10, 30)
+		})
+		po.set_missing_values()
+		try:
+			po.insert()
+		except InvalidCurrency:
+			return
 
-	po.submit()
+		po.submit()
 
-	# make material request for
-	make_material_request(po.items[0].item_code, po.items[0].qty)
+		# make material request for
+		make_material_request(po.items[0].item_code, po.items[0].qty)
 
-	# transfer material for sub-contract
-	stock_entry = frappe.get_doc(make_stock_entry(po.name, po.items[0].item_code))
-	stock_entry.from_warehouse = "Stores - WPL"
-	stock_entry.to_warehouse = "Supplier - WPL"
-	stock_entry.insert()
+		# transfer material for sub-contract
+		stock_entry = frappe.get_doc(make_stock_entry(po.name, po.items[0].item_code))
+		stock_entry.from_warehouse = "Stores - WPL"
+		stock_entry.to_warehouse = "Supplier - WPL"
+		stock_entry.insert()
diff --git a/erpnext/demo/user/schools.py b/erpnext/demo/user/schools.py
new file mode 100644
index 0000000..6388f9a
--- /dev/null
+++ b/erpnext/demo/user/schools.py
@@ -0,0 +1,97 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+
+import frappe
+import random
+from frappe.utils import cstr
+from frappe.utils.make_random import get_random
+from datetime import timedelta
+from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, get_fee_schedule, collect_fees
+
+def work():
+	frappe.set_user(frappe.db.get_global('demo_schools_user'))
+	for d in xrange(20):
+		approve_random_student_applicant()
+		enroll_random_student(frappe.flags.current_date)
+	if frappe.flags.current_date.weekday()== 0:
+		make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5))	
+	mark_student_attendance(frappe.flags.current_date)
+	make_fees()
+
+def mark_student_attendance(current_date):
+	status = ["Present", "Absent"]
+	for d in frappe.db.get_list("Course Schedule", filters={"schedule_date": current_date}, fields=("name", "student_group")):
+		students = get_student_group_students(d.student_group)
+		for stud in students:
+			make_attendance_records(stud.student, stud.student_name, d.name, status[weighted_choice([9,4])])
+			
+def make_fees():
+	for d in range(1,10):
+		random_fee = get_random("Fees", {"paid_amount": 0})
+		collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount"))
+	
+def approve_random_student_applicant():
+	random_student = get_random("Student Applicant", {"application_status": "Applied"})
+	if random_student:
+		status = ["Approved", "Rejected"]
+		frappe.db.set_value("Student Applicant", random_student, "application_status", status[weighted_choice([9,3])])
+
+def enroll_random_student(current_date):
+	random_student = get_random("Student Applicant", {"application_status": "Approved"})
+	if random_student:
+		enrollment = enroll_student(random_student)
+		enrollment.academic_year = get_random("Academic Year")
+		enrollment.enrollment_date = current_date
+		fee_schedule = get_fee_schedule(enrollment.program)
+		for fee in fee_schedule:
+			enrollment.append("fees", fee)
+		enrollment.submit()
+		frappe.db.commit()
+		assign_student_group(enrollment.student, enrollment.program)
+		
+def assign_student_group(student, program):
+	courses = []
+	for d in frappe.get_list("Program Course", fields=("course"), filters={"parent": program }):
+		courses.append(d.course)
+
+	for d in xrange(3):
+		course = random.choice(courses)
+		random_sg = get_random("Student Group", {"course": course})
+		if random_sg:
+			student_group = frappe.get_doc("Student Group", random_sg)
+			student_group.append("students", {"student": student})
+			student_group.save()
+		courses.remove(course)
+		
+def make_course_schedule(start_date, end_date):
+	for d in frappe.db.get_list("Student Group"):
+		cs = frappe.new_doc("Scheduling Tool")
+		cs.student_group = d.name
+		cs.room = get_random("Room")
+		cs.instructor = get_random("Instructor")
+		cs.course_start_date = cstr(start_date)
+		cs.course_end_date = cstr(end_date)
+		day = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
+		for x in xrange(3):
+			random_day = random.choice(day)
+			cs.day = random_day
+			cs.from_time = timedelta(hours=(random.randrange(7, 17,1)))
+			cs.to_time = cs.from_time + timedelta(hours=1)
+			cs.schedule_course()
+			day.remove(random_day)
+
+
+def weighted_choice(weights):
+	totals = []
+	running_total = 0
+
+	for w in weights:
+		running_total += w
+		totals.append(running_total)
+
+	rnd = random.random() * running_total
+	for i, total in enumerate(totals):
+		if rnd < total:
+			return i
\ No newline at end of file
diff --git a/erpnext/demo/user/stock.py b/erpnext/demo/user/stock.py
index c86a11b..ac380f2 100644
--- a/erpnext/demo/user/stock.py
+++ b/erpnext/demo/user/stock.py
@@ -102,23 +102,21 @@
 def make_sales_return_records():
 	for data in frappe.get_all('Delivery Note', fields=["name"], filters={"docstatus": 1}):
 		if random.random() < 0.2:
-			print "dn"
 			try:
 				dn = make_sales_return(data.name)
 				dn.insert()
 				dn.submit()
 				frappe.db.commit()
-			except Exception, e:
+			except Exception:
 				frappe.db.rollback()
 
 def make_purchase_return_records():
 	for data in frappe.get_all('Purchase Receipt', fields=["name"], filters={"docstatus": 1}):
 		if random.random() < 0.2:
-			print "purchase"
 			try:
 				pr = make_purchase_return(data.name)
 				pr.insert()
 				pr.submit()
 				frappe.db.commit()
-			except Exception, e:
+			except Exception:
 				frappe.db.rollback()