Merge branch 'master' of git://github.com/webnotes/erpnext
diff --git a/.gitignore b/.gitignore
index 62cc577..ba0a9a3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,4 +14,4 @@
 public/files
 public/backups
 public/css/wn-web.css
-public/js/wn-web.js
\ No newline at end of file
+public/js/wn-web.js
diff --git a/erpnext/utilities/cleanup_data.py b/erpnext/utilities/cleanup_data.py
new file mode 100644
index 0000000..bc6ea0a
--- /dev/null
+++ b/erpnext/utilities/cleanup_data.py
@@ -0,0 +1,202 @@
+#!/usr/bin/python
+
+# This script is for cleaning up of all data from system including 
+# all transactions and masters (excludes default masters). 
+# Basically after running this file, system will reset to it's 
+# initial state.
+# This script can be executed from lib/wnf.py using 
+# lib/wnf.py --cleanup-data
+
+import sys
+sys.path.append("lib/py")
+sys.path.append(".")
+sys.path.append("erpnext")
+
+import webnotes
+
+#--------------------------------
+
+def delete_transactions():
+	print "Deleting transactions..."
+
+	trans = ['Timesheet','Task','Support Ticket','Stock Reconciliation', 'Stock Ledger Entry', \
+		'Stock Entry','Sales Order','Salary Slip','Sales Invoice','Quotation', 'Quality Inspection', \
+		'Purchase Receipt','Purchase Order','Production Order', 'POS Setting','Period Closing Voucher', \
+		'Purchase Invoice','Maintenance Visit','Maintenance Schedule','Leave Application', \
+		'Leave Allocation', 'Lead', 'Journal Voucher', 'Installation Note','Purchase Request', \
+		'GL Entry','Expense Claim','Opportunity','Delivery Note','Customer Issue','Bin', \
+		'Authorization Rule','Attendance','Account Balance', 'C-Form', 'Form 16A', 'Lease Agreement', \
+		'Lease Installment', 'TDS Payment', 'TDS Return Acknowledgement', 'Appraisal', \
+		'Installation Note', 'Communication'
+	]
+	for d in trans:
+		for t in webnotes.conn.sql("select options from tabDocField where parent='%s' and fieldtype='Table'" % d):
+			webnotes.conn.sql("delete from `tab%s`" % (t))
+		webnotes.conn.sql("delete from `tab%s`" % (d))
+		webnotes.conn.sql("COMMIT")
+		webnotes.conn.sql("START TRANSACTION")
+		print "Deleted " + d
+	
+	
+	
+def delete_masters():
+	print "Deleting masters...."
+	masters = {
+		'Workstation':['Default Workstation'],
+		'Warehouse Type':['Default Warehouse Type', 'Fixed Asset', 'Rejected', 'Reserved', 
+			'Sample', 'Stores', 'WIP Warehouse'],
+		'Warehouse':['Default Warehouse'],
+		'UOM':['Kg', 'Mtr', 'Box', 'Ltr', 'Nos', 'Ft', 'Pair', 'Set'],
+		'Territory':['All Territories', 'Default Territory'],
+		'Terms and Conditions':'',
+		'Tag':'',
+		'Supplier Type':['Default Supplier Type'],
+		'Supplier':'',
+		'Serial No':'',
+		'Sales Person':['All Sales Persons'],
+		'Sales Partner':'',
+		'Sales BOM':'',
+		'Salary Structure':'',
+		'Purchase Taxes and Charges Master':'',
+		'Project':'',
+		'Print Heading':'',
+		'Price List':['Default Price List'],
+		'Period':'',
+		'Sales Taxes and Charges Master':'',
+		'Letter Head':'',
+		'Leave Type':['Leave Without Pay', 'Privilege Leave', 'Casual Leave', 'PL', 'CL', 'LWP', 
+			'Compensatory Off', 'Sick Leave'],
+		'Landed Cost Master':'',
+		'Appraisal Template':'',
+		'Item Group':['All Item Groups', 'Default'], 
+		'Item':'',
+		'Holiday List':'',
+		'Grade':'',
+		'Feed':'',
+		'Expense Claim Type':['Travel', 'Medical', 'Calls', 'Food', 'Others'],
+		'Event':'', 
+		'Employment Type':'', 
+		'Employee':'',
+		'Earning Type':['Basic', 'Conveyance', 'House Rent Allowance', 'Dearness Allowance', 
+			'Medical Allowance', 'Telephone'],
+		'Designation':'',
+		'Department':'',
+		'Deduction Type':['Income Tax', 'Professional Tax', 'Provident Fund', 'Leave Deduction'],
+		'Customer Group':['All Customer Groups', 'Default Customer Group'],
+		'Customer':'',
+		'Cost Center':'', 
+		'Contact':'',
+		'Campaign':'', 
+		'Budget Distribution':'', 
+		'Brand':'',
+		'Branch':'',
+		'Batch':'', 
+		'Appraisal':'', 
+		'Account':'', 
+		'BOM': ''
+	}
+	for d in masters.keys():
+		for t in webnotes.conn.sql("select options from tabDocField where parent='%s' \
+			and fieldtype='Table'" % d):
+			webnotes.conn.sql("delete from `tab%s`" % (t))
+		lst = '"'+'","'.join(masters[d])+ '"'
+		webnotes.conn.sql("delete from `tab%s` where name not in (%s)" % (d, lst))
+		webnotes.conn.sql("COMMIT")
+		webnotes.conn.sql("START TRANSACTION")
+		print "Deleted " + d
+
+
+
+def reset_series():
+	# Reset series
+	webnotes.conn.sql("""update tabSeries set current = 0 where name not in \
+		('FL', 'PERM', 'UR', '_SRCH', 'FileData/', 'TD', 'MI', 'EV', 'MIR', \
+		'DEF', '', 'TW', 'Ann/', 'Login Page/', 'DF', 'MDR', 'MDI', 'FMD/', \
+		'TMD/', 'GLMDetail', 'Event Updates/', '__NSO', '_ACB', 'UCDD/', 'EVP', \
+		'RFD/', 'INVTD', 'CWR/', 'TDI', 'CustomField', 'SRCH/C/', 'Letter/', 'MSD', \
+		'Mail/', 'AR', 'SA', 'SMSLOG/')
+	""")
+	print "Series updated"
+
+
+def delete_main_masters():
+	main_masters = ['Fiscal Year','Company', 'DefaultValue']
+	for d in main_masters:
+		for t in webnotes.conn.sql("select options from tabDocField where parent='%s' and fieldtype='Table'" % d):
+			webnotes.conn.sql("delete from `tab%s`" % (t))
+		webnotes.conn.sql("delete from `tab%s`" % (d))
+		webnotes.conn.sql("COMMIT")
+		webnotes.conn.sql("START TRANSACTION")
+		print "Deleted " + d
+	
+
+
+def reset_global_defaults():
+	flds = {
+		'default_company': '', 
+		'default_currency': '', 
+		'default_currency_format': 'Lacs', 
+		'default_currency_fraction': '', 
+		'current_fiscal_year': '', 
+		'date_format': 'dd-mm-yyyy', 
+		'sms_sender_name': '', 
+		'default_item_group': 'Default', 
+		'default_stock_uom': 'Nos', 
+		'default_valuation_method': 'FIFO', 
+		'default_warehouse_type': 'Default Warehouse Type', 
+		'tolerance': '', 
+		'acc_frozen_upto': '', 
+		'bde_auth_role': '', 
+		'credit_controller': '', 
+		'default_customer_group': 'Default Customer Group', 
+		'default_territory': 'Default', 
+		'default_price_list': 'Standard', 
+		'default_supplier_type': 'Default Supplier Type'
+	}
+
+	from webnotes.model.code import get_obj
+	gd = get_obj('Global Defaults', 'Global Defaults')
+	for d in flds:
+		gd.doc.fields[d] = flds[d]
+	gd.doc.save()
+	
+	webnotes.clear_cache()
+
+
+def run():
+	webnotes.connect()
+	
+	# Confirmation from user
+	confirm = ''
+	while not confirm:
+		confirm = raw_input("Are you sure you want to delete the data from the system (N/Y)?")
+	if confirm.lower() != 'y':
+		raise Exception
+
+	cleanup_type = ''
+	while cleanup_type not in ['1', '2']:
+		cleanup_type = raw_input("""\nWhat type of cleanup you want ot perform?
+	1. Only Transactions
+	2. Both Masters and Transactions
+
+	Please enter your choice (1/2):
+		""")
+		
+	# delete
+	delete_transactions()
+	
+	if cleanup_type == '1':	
+		print '\n', '*' * 10 + 'NOTE' + '*' * 10, '\n'
+		print "To reset series of the transactions go to Setup --> Numbering Series\n"
+	else:
+		delete_masters()
+		reset_series()
+		delete_main_masters()
+		reset_global_defaults()
+
+	print "System cleaned up succesfully"
+	webnotes.conn.close()
+
+
+if __name__ == '__main__':
+	run()