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()