[demo] new cleaner, more-flexible demo
diff --git a/erpnext/demo/user/sales.py b/erpnext/demo/user/sales.py
new file mode 100644
index 0000000..7432ba0
--- /dev/null
+++ b/erpnext/demo/user/sales.py
@@ -0,0 +1,109 @@
+# 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, random
+from frappe.utils.make_random import add_random_children, get_random
+from erpnext.setup.utils import get_exchange_rate
+from erpnext.accounts.party import get_party_account_currency
+
+def work():
+	frappe.set_user(frappe.db.get_global('demo_sales_user_2'))
+	if random.random() < 0.5:
+		for i in xrange(random.randint(1,7)):
+			make_opportunity()
+
+	if random.random() < 0.5:
+		for i in xrange(random.randint(1,3)):
+			make_quotation()
+
+	# lost quotations / inquiries
+	if random.random() < 0.3:
+		for i in xrange(random.randint(1,3)):
+			quotation = get_random('Quotation', doc=True)
+			if quotation and quotation.status == 'Submitted':
+				quotation.declare_order_lost('Did not ask')
+
+		for i in xrange(random.randint(1,3)):
+			opportunity = get_random('Opportunity', doc=True)
+			if opportunity and opportunity.status in ('Open', 'Replied'):
+				opportunity.declare_enquiry_lost('Did not ask')
+
+	if random.random() < 0.3:
+		for i in xrange(random.randint(1,3)):
+			make_sales_order()
+
+def make_opportunity():
+	b = frappe.get_doc({
+		"doctype": "Opportunity",
+		"enquiry_from": "Customer",
+		"customer": get_random("Customer"),
+		"enquiry_type": "Sales",
+		"transaction_date": frappe.flags.current_date,
+	})
+
+	add_random_children(b, "items", rows=4, randomize = {
+		"qty": (1, 5),
+		"item_code": ("Item", {"has_variants": "0"})
+	}, unique="item_code")
+
+	b.insert()
+	frappe.db.commit()
+
+def make_quotation():
+	# get open opportunites
+	opportunity = get_random("Opportunity", {"status": "Open"})
+
+	if opportunity:
+		from erpnext.crm.doctype.opportunity.opportunity import make_quotation
+		qtn = frappe.get_doc(make_quotation(opportunity))
+		qtn.insert()
+		frappe.db.commit()
+		qtn.submit()
+		frappe.db.commit()
+	else:
+		# make new directly
+
+		# get customer, currency and exchange_rate
+		customer = get_random("Customer")
+
+		company_currency = frappe.db.get_value("Company", "Wind Power LLC", "default_currency")
+		party_account_currency = get_party_account_currency("Customer", customer, "Wind Power LLC")
+		if company_currency == party_account_currency:
+			exchange_rate = 1
+		else:
+			exchange_rate = get_exchange_rate(party_account_currency, company_currency)
+
+		qtn = frappe.get_doc({
+			"creation": frappe.flags.current_date,
+			"doctype": "Quotation",
+			"quotation_to": "Customer",
+			"customer": customer,
+			"currency": party_account_currency or company_currency,
+			"conversion_rate": exchange_rate,
+			"order_type": "Sales",
+			"transaction_date": frappe.flags.current_date,
+		})
+
+		add_random_children(qtn, "items", rows=3, randomize = {
+			"qty": (1, 5),
+			"item_code": ("Item", {"has_variants": "0"})
+		}, unique="item_code")
+
+		qtn.insert()
+		frappe.db.commit()
+		qtn.submit()
+		frappe.db.commit()
+
+def make_sales_order():
+	q = get_random("Quotation", {"status": "Submitted"})
+	if q:
+		from erpnext.selling.doctype.quotation.quotation import make_sales_order
+		so = frappe.get_doc(make_sales_order(q))
+		so.transaction_date = frappe.flags.current_date
+		so.delivery_date = frappe.utils.add_days(frappe.flags.current_date, 10)
+		so.insert()
+		frappe.db.commit()
+		so.submit()
+		frappe.db.commit()