text: 
  frappe.provide("ifitwala_ed.setup");
  
  frappe.pages['setup-wizard'].on_page_load = function(wrapper) {
  	if(frappe.sys_defaults.organization) {
  		frappe.set_route("desk");
  		return;
  	}
  };
  
  frappe.setup.on("before_load", function () {
  	ifitwala_ed.setup.slides_settings.map(frappe.setup.add_slide);
  });
  
  ifitwala_ed.setup.slides_settings = [
  	{
  		// Brand
  		name: 'brand',
  		icon: "fa fa-bookmark",
  		title: __("The Brand"),
  		// help: __('Upload your letter head and logo. (you can edit them later).'),
  		fields: [
  			{
  				fieldtype: "Attach Image", fieldname: "attach_logo",
  				label: __("Attach Logo"),
  				description: __("100px by 100px"),
  				is_private: 0,
  				align: 'center'
  			},
  			{
  				fieldname: 'organization_name',
  				label: __('Organization Name'),
  				fieldtype: 'Data',
  				reqd: 1
  			},
  			{
  				fieldname: 'organization_abbr',
  				label: __('Organization Abbreviation'),
  				fieldtype: 'Data'
  			}
  		],
  		onload: function(slide) {
  			this.bind_events(slide);
  		},
  		bind_events: function (slide) {
  			slide.get_input("organization_name").on("change", function () {
  				var parts = slide.get_input("organization_name").val().split(" ");
  				var abbr = $.map(parts, function (p) { return p ? p.substr(0, 1) : null }).join("");
  				slide.get_field("organization_abbr").set_value(abbr.slice(0, 5).toUpperCase());
  			}).val(frappe.boot.sysdefaults.organization_name || "").trigger("change");
  
  			slide.get_input("organization_abbr").on("change", function () {
  				if (slide.get_input("organization_abbr").val().length > 5) {
  					frappe.msgprint(__("Organisation Abbreviation cannot have more than 5 characters"));
  					slide.get_field("organization_abbr").set_value("");
  				}
  			});
  		},
  		validate: function() {
  			if ((this.values.organization_name || "").toLowerCase() == "organization") {
  				frappe.msgprint(__("Organisation Name cannot be Organisation"));
  				return false;
  			}
  			if (!this.values.organization_abbr) {
  				return false;
  			}
  			if (this.values.organization_abbr.length > 5) {
  				return false;
  			}
  			return true;
  		}
  	},
  	{
  		// Organisation
  		name: 'organization',
  		title: __("Your Organization"),
  		icon: "fa fa-building",
  		// help: frappe.setup.domains.includes('Education') ?
  		// 	__('The name of the institute for which you are setting up this system.') :
  		// 	__('The name of your organization for which you are setting up this system.')),
  		fields: [
  			{
  				fieldname: 'organization_tagline',
  				label: __('What does it do?'),
  				fieldtype: 'Data',
  				placeholder: __('e.g. "Inspire Learners to build a better future"'),
  				reqd: 1
  			},
  			{ fieldname: 'bank_account', label: __('Bank Name'), fieldtype: 'Data', reqd: 1 },
  			{
  				fieldname: 'chart_of_accounts', label: __('Chart of Accounts'),
  				options: "", fieldtype: 'Select'
  			},
  			{ fieldname: 'view_coa', label: __('View Chart of Accounts'), fieldtype: 'Button' },
  			{ fieldname: 'fy_start_date', label: __('Financial Year Begins On'), fieldtype: 'Date', reqd: 1 },
  			// end date should be hidden (auto calculated)
  			{ fieldname: 'fy_end_date', label: __('End Date'), fieldtype: 'Date', reqd: 1, hidden: 1 },
  		],
  
  		onload: function (slide) {
  			this.load_chart_of_accounts(slide);
  			this.bind_events(slide);
  			this.set_fy_dates(slide);
  		},
  
  		validate: function () {
  			let me = this;
  			let exist;
  
  			if (!this.validate_fy_dates()) {
  				return false;
  			}
  
  			// Validate bank name
  			if(me.values.bank_account){
  				frappe.call({
  					async: false,
  					method: "ifitwala_ed.accounting.doctype.account.chart_of_accounts.chart_of_accounts.validate_bank_account",
  					args: {
  						"coa": me.values.chart_of_accounts,
  						"bank_account": me.values.bank_account
  					},
  					callback: function (r) {
  						if(r.message){
  							exist = r.message;
  							me.get_field("bank_account").set_value("");
  							let message = __('Account {0} already exists. Please enter a different name for your bank account.',
  								[me.values.bank_account]
  							);
  							frappe.msgprint(message);
  						}
  					}
  				});
  				return !exist; // Return False if exist = true
  			}
  
  			return true;
  		},
  
  		validate_fy_dates: function() {
  			// validate fiscal year start and end dates
  			const invalid = this.values.fy_start_date == 'Invalid date' ||
  				this.values.fy_end_date == 'Invalid date';
  			const start_greater_than_end = this.values.fy_start_date > this.values.fy_end_date;
  
  			if (invalid || start_greater_than_end) {
  				frappe.msgprint(__("Please enter valid Financial Year Start and End Dates"));
  				return false;
  			}
  
  			return true;
  		},
  
  		set_fy_dates: function (slide) {
  			var country = frappe.wizard.values.country;
  
  			if (country) {
  				var fy = ifitwala_ed.setup.fiscal_years[country];
  				var current_year = moment(new Date()).year();
  				var next_year = current_year + 1;
  				if (!fy) {
  					fy = ["01-01", "12-31"];
  					next_year = current_year;
  				}
  
  				var year_start_date = current_year + "-" + fy[0];
  				if (year_start_date > frappe.datetime.get_today()) {
  					next_year = current_year;
  					current_year -= 1;
  				}
  				slide.get_field("fy_start_date").set_value(current_year + '-' + fy[0]);
  				slide.get_field("fy_end_date").set_value(next_year + '-' + fy[1]);
  			}
  		},
  
  
  		load_chart_of_accounts: function (slide) {
  			var country = frappe.wizard.values.country;
  
  			if (country) {
  				frappe.call({
  					method: "ifitwala_ed.accounting.doctype.account.chart_of_accounts.chart_of_accounts.get_charts_for_country",
  					args: { "country": country, with_standard: true },
  					callback: function (r) {
  						if (r.message) {
  							slide.get_input("chart_of_accounts").empty()
  								.add_options(r.message);
  						}
  					}
  				})
  			}
  		},
  
  		bind_events: function (slide) {
  			let me = this;
  			slide.get_input("fy_start_date").on("change", function () {
  				var start_date = slide.form.fields_dict.fy_start_date.get_value();
  				var year_end_date =
  					frappe.datetime.add_days(frappe.datetime.add_months(start_date, 12), -1);
  				slide.form.fields_dict.fy_end_date.set_value(year_end_date);
  			});
  
  			slide.get_input("view_coa").on("click", function() {
  				let chart_template = slide.form.fields_dict.chart_of_accounts.get_value();
  				if(!chart_template) return;
  
  				me.charts_modal(slide, chart_template);
  			});
  		},
  
  		charts_modal: function(slide, chart_template) {
  			let parent = __('All Accounts');
  
  			var dialog = new frappe.ui.Dialog({
  				title: chart_template,
  				fields: [
  					{'fieldname': 'expand_all', 'label': __('Expand All'), 'fieldtype': 'Button',
  						click: function() {
  							// expand all nodes on button click
  							coa_tree.load_children(coa_tree.root_node, true);
  						}
  					},
  					{'fieldname': 'collapse_all', 'label': __('Collapse All'), 'fieldtype': 'Button',
  						click: function() {
  							// collapse all nodes
  							coa_tree.get_all_nodes(coa_tree.root_node.data.value, coa_tree.root_node.is_root)
  								.then(data_list => {
  									data_list.map(d => { coa_tree.toggle_node(coa_tree.nodes[d.parent]); });
  								});
  						}
  					}
  				]
  			});
  
  			// render tree structure in the dialog modal
  			let coa_tree = new frappe.ui.Tree({
  				parent: $(dialog.body),
  				label: parent,
  				expandable: true,
  				method: 'ifitwala_ed.accounting.utils.get_coa',
  				args: {
  					chart: chart_template,
  					parent: parent,
  					doctype: 'Account'
  				},
  				onclick: function(node) {
  					parent = node.value;
  				}
  			});
  
  			// add class to show buttons side by side
  			const form_container = $(dialog.body).find('form');
  			const buttons = $(form_container).find('.frappe-control');
  			form_container.addClass('flex');
  			buttons.map((index, button) => {
  				$(button).css({"margin-right": "1em"});
  			})
  
  			dialog.show();
  			coa_tree.load_children(coa_tree.root_node, true); // expand all node trigger
  		}
  	}
  ];
  
  // Source: https://en.wikipedia.org/wiki/Fiscal_year
  // default 1st Jan - 31st Dec
  
  ifitwala_ed.setup.fiscal_years = {
  	"Afghanistan": ["12-21", "12-20"],
  	"Australia": ["07-01", "06-30"],
  	"Bangladesh": ["07-01", "06-30"],
  	"Canada": ["04-01", "03-31"],
  	"Costa Rica": ["10-01", "09-30"],
  	"Egypt": ["07-01", "06-30"],
  	"Hong Kong": ["04-01", "03-31"],
  	"India": ["04-01", "03-31"],
  	"Iran": ["06-23", "06-22"],
  	"Myanmar": ["04-01", "03-31"],
  	"New Zealand": ["04-01", "03-31"],
  	"Pakistan": ["07-01", "06-30"],
  	"Singapore": ["04-01", "03-31"],
  	"South Africa": ["03-01", "02-28"],
  	"Thailand": ["10-01", "09-30"],
  	"United Kingdom": ["04-01", "03-31"],
  };
  