diff --git a/.gitignore b/.gitignore index 62cc5771bae2..ba0a9a311b2e 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,4 @@ public/images/lib 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 000000000000..bc6ea0a83bcc --- /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()