diff --git a/erpnext/public/js/controllers/accounts.js b/erpnext/public/js/controllers/accounts.js
index 47b88a0..d03a07c 100644
--- a/erpnext/public/js/controllers/accounts.js
+++ b/erpnext/public/js/controllers/accounts.js
@@ -3,319 +3,267 @@
 
 // get tax rate
 frappe.provide("erpnext.taxes");
-frappe.provide("erpnext.taxes.flags");
 
-frappe.ui.form.on(cur_frm.doctype, {
-	setup: function(frm) {
-		// set conditional display for rate column in taxes
-		$(frm.wrapper).on('grid-row-render', function(e, grid_row) {
-			if(in_list(['Sales Taxes and Charges', 'Purchase Taxes and Charges'], grid_row.doc.doctype)) {
-				erpnext.taxes.set_conditional_mandatory_rate_or_amount(grid_row);
+erpnext.accounts.taxes = {
+	setup_tax_validations: function(doctype) {
+		let me = this;
+		frappe.ui.form.on(doctype, {
+			setup: function(frm) {
+				// set conditional display for rate column in taxes
+				$(frm.wrapper).on('grid-row-render', function(e, grid_row) {
+					if(in_list(['Sales Taxes and Charges', 'Purchase Taxes and Charges'], grid_row.doc.doctype)) {
+						me.set_conditional_mandatory_rate_or_amount(grid_row);
+					}
+				});
+			},
+			onload: function(frm) {
+				if(frm.get_field("taxes")) {
+					frm.set_query("account_head", "taxes", function(doc) {
+						if(frm.cscript.tax_table == "Sales Taxes and Charges") {
+							var account_type = ["Tax", "Chargeable", "Expense Account"];
+						} else {
+							var account_type = ["Tax", "Chargeable", "Income Account", "Expenses Included In Valuation"];
+						}
+
+						return {
+							query: "erpnext.controllers.queries.tax_account_query",
+							filters: {
+								"account_type": account_type,
+								"company": doc.company,
+								"disabled": 0
+							}
+						}
+					});
+					frm.set_query("cost_center", "taxes", function(doc) {
+						return {
+							filters: {
+								"company": doc.company,
+								"is_group": 0
+							}
+						};
+					});
+				}
+			},
+			validate: function(frm) {
+				// neither is absolutely mandatory
+				if(frm.get_docfield("taxes")) {
+					frm.get_docfield("taxes", "rate").reqd = 0;
+					frm.get_docfield("taxes", "tax_amount").reqd = 0;
+				}
+
+			},
+			taxes_on_form_rendered: function(frm) {
+				me.set_conditional_mandatory_rate_or_amount(frm.open_grid_row());
+			},
+		});
+	},
+
+	set_conditional_mandatory_rate_or_amount: function(grid_row) {
+		if(grid_row) {
+			if(grid_row.doc.charge_type==="Actual") {
+				grid_row.toggle_editable("tax_amount", true);
+				grid_row.toggle_reqd("tax_amount", true);
+				grid_row.toggle_editable("rate", false);
+				grid_row.toggle_reqd("rate", false);
+			} else {
+				grid_row.toggle_editable("rate", true);
+				grid_row.toggle_reqd("rate", true);
+				grid_row.toggle_editable("tax_amount", false);
+				grid_row.toggle_reqd("tax_amount", false);
+			}
+		}
+	},
+
+	validate_taxes_and_charges: function(cdt, cdn) {
+		let d = locals[cdt][cdn];
+		let msg = "";
+
+		if (d.account_head && !d.description) {
+			// set description from account head
+			d.description = d.account_head.split(' - ').slice(0, -1).join(' - ');
+		}
+
+		if (!d.charge_type && (d.row_id || d.rate || d.tax_amount)) {
+			msg = __("Please select Charge Type first");
+			d.row_id = "";
+			d.rate = d.tax_amount = 0.0;
+		} else if ((d.charge_type == 'Actual' || d.charge_type == 'On Net Total' || d.charge_type == 'On Paid Amount') && d.row_id) {
+			msg = __("Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'");
+			d.row_id = "";
+		} else if ((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) {
+			if (d.idx == 1) {
+				msg = __("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row");
+				d.charge_type = '';
+			} else if (!d.row_id) {
+				msg = __("Please specify a valid Row ID for row {0} in table {1}", [d.idx, __(d.doctype)]);
+				d.row_id = "";
+			} else if (d.row_id && d.row_id >= d.idx) {
+				msg = __("Cannot refer row number greater than or equal to current row number for this Charge type");
+				d.row_id = "";
+			}
+		}
+		if (msg) {
+			frappe.validated = false;
+			refresh_field("taxes");
+			frappe.throw(msg);
+		}
+
+	},
+
+	setup_tax_filters: function(doctype) {
+		let me = this;
+		frappe.ui.form.on(doctype, {
+			account_head: function(frm, cdt, cdn) {
+				let d = locals[cdt][cdn];
+
+				if (doc.docstatus == 1) {
+					// Should not trigger any changes on change post submit
+					return;
+				}
+
+				if(!d.charge_type && d.account_head){
+					frappe.msgprint(__("Please select Charge Type first"));
+					frappe.model.set_value(cdt, cdn, "account_head", "");
+				} else if (d.account_head) {
+					frappe.call({
+						type:"GET",
+						method: "erpnext.controllers.accounts_controller.get_tax_rate",
+						args: {"account_head":d.account_head},
+						callback: function(r) {
+							if (d.charge_type!=="Actual") {
+								frappe.model.set_value(cdt, cdn, "rate", r.message.tax_rate || 0);
+							}
+							frappe.model.set_value(cdt, cdn, "description", r.message.account_name);
+						}
+					})
+				}
+			},
+			row_id: function(frm, cdt, cdn) {
+				me.validate_taxes_and_charges(cdt, cdn);
+			},
+			rate: function(frm, cdt, cdn) {
+				me.validate_taxes_and_charges(cdt, cdn);
+			},
+			tax_amount: function(frm, cdt, cdn) {
+				me.validate_taxes_and_charges(cdt, cdn);
+			},
+			charge_type: function(frm, cdt, cdn) {
+				me.validate_taxes_and_charges(cdt, cdn);
+				let open_form = frm.open_grid_row();
+				if(open_form) {
+					me.set_conditional_mandatory_rate_or_amount(open_form);
+				} else {
+					// apply in current row
+					me.set_conditional_mandatory_rate_or_amount(frm.get_field('taxes').grid.get_row(cdn));
+				}
+			},
+			included_in_print_rate: function(frm, cdt, cdn) {
+				let tax = frappe.get_doc(cdt, cdn);
+				try {
+					me.validate_taxes_and_charges(cdt, cdn);
+					me.validate_inclusive_tax(tax);
+				} catch(e) {
+					tax.included_in_print_rate = 0;
+					refresh_field("included_in_print_rate", tax.name, tax.parentfield);
+					throw e;
+				}
 			}
 		});
 	},
-	onload: function(frm) {
-		if(frm.get_field("taxes")) {
-			frm.set_query("account_head", "taxes", function(doc) {
-				if(frm.cscript.tax_table == "Sales Taxes and Charges") {
-					var account_type = ["Tax", "Chargeable", "Expense Account"];
-				} else {
-					var account_type = ["Tax", "Chargeable", "Income Account", "Expenses Included In Valuation"];
+
+	validate_inclusive_tax: function(tax) {
+		let actual_type_error = function() {
+			var msg = __("Actual type tax cannot be included in Item rate in row {0}", [tax.idx])
+			frappe.throw(msg);
+		};
+
+		let on_previous_row_error = function(row_range) {
+			var msg = __("For row {0} in {1}. To include {2} in Item rate, rows {3} must also be included",
+				[tax.idx, __(tax.doctype), tax.charge_type, row_range])
+			frappe.throw(msg);
+		};
+
+		if(cint(tax.included_in_print_rate)) {
+			if(tax.charge_type == "Actual") {
+				// inclusive tax cannot be of type Actual
+				actual_type_error();
+			} else if(tax.charge_type == "On Previous Row Amount" &&
+				!cint(this.frm.doc["taxes"][tax.row_id - 1].included_in_print_rate)
+			) {
+				// referred row should also be an inclusive tax
+				on_previous_row_error(tax.row_id);
+			} else if(tax.charge_type == "On Previous Row Total") {
+				var taxes_not_included = $.map(this.frm.doc["taxes"].slice(0, tax.row_id),
+					function(t) { return cint(t.included_in_print_rate) ? null : t; });
+				if(taxes_not_included.length > 0) {
+					// all rows above this tax should be inclusive
+					on_previous_row_error(tax.row_id == 1 ? "1" : "1 - " + tax.row_id);
 				}
-
-				return {
-					query: "erpnext.controllers.queries.tax_account_query",
-					filters: {
-						"account_type": account_type,
-						"company": doc.company,
-						"disabled": 0
-					}
-				}
-			});
-			frm.set_query("cost_center", "taxes", function(doc) {
-				return {
-					filters: {
-						"company": doc.company,
-						"is_group": 0
-					}
-				};
-			});
-		}
-	},
-	validate: function(frm) {
-		// neither is absolutely mandatory
-		if(frm.get_docfield("taxes")) {
-			frm.get_docfield("taxes", "rate").reqd = 0;
-			frm.get_docfield("taxes", "tax_amount").reqd = 0;
-		}
-
-	},
-	taxes_on_form_rendered: function(frm) {
-		erpnext.taxes.set_conditional_mandatory_rate_or_amount(frm.open_grid_row());
-	},
-
-	allocate_advances_automatically: function(frm) {
-		frm.trigger('fetch_advances');
-	},
-
-	only_include_allocated_payments: function(frm) {
-		frm.trigger('fetch_advances');
-	},
-
-	fetch_advances: function(frm) {
-		if(frm.doc.allocate_advances_automatically) {
-			frappe.call({
-				doc: frm.doc,
-				method: "set_advances",
-				callback: function(r, rt) {
-					refresh_field("advances");
-				}
-			})
-		}
-	}
-});
-
-frappe.ui.form.on('Sales Invoice Payment', {
-	mode_of_payment: function(frm, cdt, cdn) {
-		var d = locals[cdt][cdn];
-		get_payment_mode_account(frm, d.mode_of_payment, function(account){
-			frappe.model.set_value(cdt, cdn, 'account', account)
-		})
-	}
-});
-
-frappe.ui.form.on("Sales Invoice", {
-	payment_terms_template: function() {
-		cur_frm.trigger("disable_due_date");
-	}
-});
-
-frappe.ui.form.on('Purchase Invoice', {
-	setup: (frm) => {
-		frm.make_methods = {
-			'Landed Cost Voucher': function () { frm.trigger('create_landedcost_voucher') },
-		}
-	},
-
-	mode_of_payment: function(frm) {
-		get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){
-			frm.set_value('cash_bank_account', account);
-		})
-	},
-
-	payment_terms_template: function() {
-		cur_frm.trigger("disable_due_date");
-	},
-
-	create_landedcost_voucher: function (frm) {
-		let lcv = frappe.model.get_new_doc('Landed Cost Voucher');
-		lcv.company = frm.doc.company;
-
-		let lcv_receipt = frappe.model.get_new_doc('Landed Cost Purchase Invoice');
-		lcv_receipt.receipt_document_type = 'Purchase Invoice';
-		lcv_receipt.receipt_document = frm.doc.name;
-		lcv_receipt.supplier = frm.doc.supplier;
-		lcv_receipt.grand_total = frm.doc.grand_total;
-		lcv.purchase_receipts = [lcv_receipt];
-
-		frappe.set_route("Form", lcv.doctype, lcv.name);
-	}
-});
-
-frappe.ui.form.on("Payment Schedule", {
-	payment_schedule_remove: function() {
-		cur_frm.trigger("disable_due_date");
-	},
-
-});
-
-frappe.ui.form.on('Payment Entry', {
-	mode_of_payment: function(frm) {
-		get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){
-			var payment_account_field = frm.doc.payment_type == "Receive" ? "paid_to" : "paid_from";
-			frm.set_value(payment_account_field, account);
-		})
-	}
-})
-
-frappe.ui.form.on('Salary Structure', {
-	mode_of_payment: function(frm) {
-		get_payment_mode_account(frm, frm.doc.mode_of_payment, function(account){
-			frm.set_value("payment_account", account);
-		})
-	}
-})
-
-var get_payment_mode_account = function(frm, mode_of_payment, callback) {
-	if(!frm.doc.company) {
-		frappe.throw({message:__("Please select a Company first."), title: __("Mandatory")});
-	}
-
-	if(!mode_of_payment) {
-		return;
-	}
-
-	return  frappe.call({
-		method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
-		args: {
-			"mode_of_payment": mode_of_payment,
-			"company": frm.doc.company
-		},
-		callback: function(r, rt) {
-			if(r.message) {
-				callback(r.message.account)
+			} else if(tax.category == "Valuation") {
+				frappe.throw(__("Valuation type charges can not marked as Inclusive"));
 			}
 		}
-	});
+	}
 }
 
-cur_frm.cscript.account_head = function(doc, cdt, cdn) {
-	var d = locals[cdt][cdn];
+erpnext.accounts.payment_triggers = {
+	setup: function(doctype) {
+		frappe.form.ui.on(doctype, {
+			allocate_advances_automatically(frm) {
+				frm.trigger('fetch_advances');
+			},
 
-	if (doc.docstatus == 1) {
-		// Should not trigger any changes on change post submit
-		return;
-	}
+			only_include_allocated_payments(frm) {
+				frm.trigger('fetch_advances');
+			},
 
-	if(!d.charge_type && d.account_head){
-		frappe.msgprint(__("Please select Charge Type first"));
-		frappe.model.set_value(cdt, cdn, "account_head", "");
-	} else if (d.account_head) {
-		frappe.call({
-			type:"GET",
-			method: "erpnext.controllers.accounts_controller.get_tax_rate",
-			args: {"account_head":d.account_head},
-			callback: function(r) {
-				if (d.charge_type!=="Actual") {
-					frappe.model.set_value(cdt, cdn, "rate", r.message.tax_rate || 0);
+			fetch_advances(frm) {
+				if(frm.doc.allocate_advances_automatically) {
+					frappe.call({
+						doc: frm.doc,
+						method: "set_advances",
+						callback: function(r, rt) {
+							refresh_field("advances");
+						}
+					})
 				}
-				frappe.model.set_value(cdt, cdn, "description", r.message.account_name);
 			}
-		})
-	}
+		});
+	},
 }
 
-cur_frm.cscript.validate_taxes_and_charges = function(cdt, cdn) {
-	var d = locals[cdt][cdn];
-	var msg = "";
-
-	if (d.account_head && !d.description) {
-		// set description from account head
-		d.description = d.account_head.split(' - ').slice(0, -1).join(' - ');
-	}
-
-	if (!d.charge_type && (d.row_id || d.rate || d.tax_amount)) {
-		msg = __("Please select Charge Type first");
-		d.row_id = "";
-		d.rate = d.tax_amount = 0.0;
-	} else if ((d.charge_type == 'Actual' || d.charge_type == 'On Net Total' || d.charge_type == 'On Paid Amount') && d.row_id) {
-		msg = __("Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'");
-		d.row_id = "";
-	} else if ((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) {
-		if (d.idx == 1) {
-			msg = __("Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row");
-			d.charge_type = '';
-		} else if (!d.row_id) {
-			msg = __("Please specify a valid Row ID for row {0} in table {1}", [d.idx, __(d.doctype)]);
-			d.row_id = "";
-		} else if (d.row_id && d.row_id >= d.idx) {
-			msg = __("Cannot refer row number greater than or equal to current row number for this Charge type");
-			d.row_id = "";
-		}
-	}
-	if (msg) {
-		frappe.validated = false;
-		refresh_field("taxes");
-		frappe.throw(msg);
-	}
-
-}
-
-cur_frm.cscript.validate_inclusive_tax = function(tax) {
-	var actual_type_error = function() {
-		var msg = __("Actual type tax cannot be included in Item rate in row {0}", [tax.idx])
-		frappe.throw(msg);
-	};
-
-	var on_previous_row_error = function(row_range) {
-		var msg = __("For row {0} in {1}. To include {2} in Item rate, rows {3} must also be included",
-			[tax.idx, __(tax.doctype), tax.charge_type, row_range])
-		frappe.throw(msg);
-	};
-
-	if(cint(tax.included_in_print_rate)) {
-		if(tax.charge_type == "Actual") {
-			// inclusive tax cannot be of type Actual
-			actual_type_error();
-		} else if(tax.charge_type == "On Previous Row Amount" &&
-			!cint(this.frm.doc["taxes"][tax.row_id - 1].included_in_print_rate)
-		) {
-			// referred row should also be an inclusive tax
-			on_previous_row_error(tax.row_id);
-		} else if(tax.charge_type == "On Previous Row Total") {
-			var taxes_not_included = $.map(this.frm.doc["taxes"].slice(0, tax.row_id),
-				function(t) { return cint(t.included_in_print_rate) ? null : t; });
-			if(taxes_not_included.length > 0) {
-				// all rows above this tax should be inclusive
-				on_previous_row_error(tax.row_id == 1 ? "1" : "1 - " + tax.row_id);
+erpnext.accounts.pos = {
+	setup: function(doctype) {
+		frappe.ui.form.on(doctype, {
+			mode_of_payment: function(frm, cdt, cdn) {
+				var d = locals[cdt][cdn];
+				get_payment_mode_account(frm, d.mode_of_payment, function(account){
+					frappe.model.set_value(cdt, cdn, 'account', account)
+				})
 			}
-		} else if(tax.category == "Valuation") {
-			frappe.throw(__("Valuation type charges can not marked as Inclusive"));
+		});
+	},
+
+	get_payment_mode_account: function(frm, mode_of_payment, callback) {
+		if(!frm.doc.company) {
+			frappe.throw({message:__("Please select a Company first."), title: __("Mandatory")});
 		}
-	}
-}
 
-if(!erpnext.taxes.flags[cur_frm.cscript.tax_table]) {
-	erpnext.taxes.flags[cur_frm.cscript.tax_table] = true;
-
-	frappe.ui.form.on(cur_frm.cscript.tax_table, "row_id", function(frm, cdt, cdn) {
-		cur_frm.cscript.validate_taxes_and_charges(cdt, cdn);
-	});
-
-	frappe.ui.form.on(cur_frm.cscript.tax_table, "rate", function(frm, cdt, cdn) {
-		cur_frm.cscript.validate_taxes_and_charges(cdt, cdn);
-	});
-
-	frappe.ui.form.on(cur_frm.cscript.tax_table, "tax_amount", function(frm, cdt, cdn) {
-		cur_frm.cscript.validate_taxes_and_charges(cdt, cdn);
-	});
-
-	frappe.ui.form.on(cur_frm.cscript.tax_table, "charge_type", function(frm, cdt, cdn) {
-		frm.cscript.validate_taxes_and_charges(cdt, cdn);
-		var open_form = frm.open_grid_row();
-		if(open_form) {
-			erpnext.taxes.set_conditional_mandatory_rate_or_amount(open_form);
-		} else {
-			// apply in current row
-			erpnext.taxes.set_conditional_mandatory_rate_or_amount(frm.get_field('taxes').grid.get_row(cdn));
+		if(!mode_of_payment) {
+			return;
 		}
-	});
 
-	frappe.ui.form.on(cur_frm.cscript.tax_table, "included_in_print_rate", function(frm, cdt, cdn) {
-		var tax = frappe.get_doc(cdt, cdn);
-		try {
-			cur_frm.cscript.validate_taxes_and_charges(cdt, cdn);
-			cur_frm.cscript.validate_inclusive_tax(tax);
-		} catch(e) {
-			tax.included_in_print_rate = 0;
-			refresh_field("included_in_print_rate", tax.name, tax.parentfield);
-			throw e;
-		}
-	});
-}
-
-erpnext.taxes.set_conditional_mandatory_rate_or_amount = function(grid_row) {
-	if(grid_row) {
-		if(grid_row.doc.charge_type==="Actual") {
-			grid_row.toggle_editable("tax_amount", true);
-			grid_row.toggle_reqd("tax_amount", true);
-			grid_row.toggle_editable("rate", false);
-			grid_row.toggle_reqd("rate", false);
-		} else {
-			grid_row.toggle_editable("rate", true);
-			grid_row.toggle_reqd("rate", true);
-			grid_row.toggle_editable("tax_amount", false);
-			grid_row.toggle_reqd("tax_amount", false);
-		}
+		return  frappe.call({
+			method: "erpnext.accounts.doctype.sales_invoice.sales_invoice.get_bank_cash_account",
+			args: {
+				"mode_of_payment": mode_of_payment,
+				"company": frm.doc.company
+			},
+			callback: function(r, rt) {
+				if(r.message) {
+					callback(r.message.account)
+				}
+			}
+		});
 	}
 }
diff --git a/erpnext/public/js/erpnext.bundle.js b/erpnext/public/js/erpnext.bundle.js
index 85a2e24..0f4a650 100644
--- a/erpnext/public/js/erpnext.bundle.js
+++ b/erpnext/public/js/erpnext.bundle.js
@@ -24,5 +24,6 @@
 import "./utils/crm_activities";
 import "./templates/crm_activities.html";
 import "./templates/crm_notes.html";
+import "./controllers/accounts.js"
 
 // import { sum } from 'frappe/public/utils/util.js'
