Added modal for multi mode payment, provision to add write off and change amount
diff --git a/erpnext/selling/page/point_of_sale/point_of_sale.js b/erpnext/selling/page/point_of_sale/point_of_sale.js
index 19eb70e..f4cc355 100644
--- a/erpnext/selling/page/point_of_sale/point_of_sale.js
+++ b/erpnext/selling/page/point_of_sale/point_of_sale.js
@@ -106,9 +106,11 @@
 			// increase qty by 1
 			this.cur_frm.doc.items.forEach((item) => {
 				if (item.item_code === item_code) {
-					frappe.model.set_value(item.doctype, item.name, 'qty', item.qty + qty);
+					frappe.model.set_value(item.doctype, item.name, 'qty', item.qty + qty)
+					.then(() => {
+						this.cart.add_item(item);
+					})
 					// update cart
-					this.cart.add_item(item);
 				}
 			});
 			return;
@@ -149,6 +151,7 @@
 				frm.refresh(name);
 				frm.doc.items = [];
 				this.cur_frm = frm;
+				this.cur_frm.set_value('is_pos', 1)
 				resolve();
 			});
 		});
@@ -240,11 +243,21 @@
 			wrapper: this.wrapper.find('.number-pad-container'),
 			onclick: (btn_value) => {
 				// on click
+				if (btn_value == 'Pay') {
+					this.make_payment()
+				}
+
 				console.log(btn_value);
 			}
 		});
 	}
 
+	make_payment() {
+		this.payment = new MakePayment({
+			frm: cur_frm
+		})
+	}
+
 	add_item(item) {
 		this.wrapper.find('.cart-items .empty-state').hide();
 
@@ -268,6 +281,7 @@
 			$item.find('.rate').text(item.rate);
 		} else {
 			$item.remove();
+			frappe.model.clear_doc(item.doctype, item.name)
 		}
 	}
 
@@ -284,8 +298,8 @@
 
 	scroll_to_item(item_code) {
 		const $item = this.$cart_items.find(`[data-item-code="${item_code}"]`);
-		const scrollTop = $item.offset().top - this.$cart_items.offset().top + this.$cart_items.scrollTop();
-		this.$cart_items.animate({ scrollTop });
+		// const scrollTop = $item.offset().top - this.$cart_items.offset().top + this.$cart_items.scrollTop();
+		// this.$cart_items.animate({ scrollTop });
 	}
 
 	get_item_html(item) {
@@ -632,4 +646,165 @@
 		$btn.addClass('highlight');
 		setTimeout(() => $btn.removeClass('highlight'), 1000);
 	}
+}
+
+class MakePayment {
+	constructor({frm}) {
+		this.frm = frm
+		this.make();
+		this.set_primary_action();
+		this.show_total_amount();
+		// this.show_outstanding_amount()
+	}
+
+	make() {
+		const me = this;
+		this.update_flag()
+
+		this.dialog = new frappe.ui.Dialog({
+			title: __('Payment'),
+			fields: this.get_fields(),
+			width:800
+		});
+
+		this.dialog.show();
+		this.$body = this.dialog.body;
+
+		this.numpad = new NumberPad({
+			wrapper: $(this.$body).find('[data-fieldname = "numpad"]'),
+			onclick: (btn_value) => {
+				// on click
+			}
+		});
+	}
+
+	set_primary_action() {
+		this.dialog.set_primary_action(__("Submit"), function() {
+			//save form
+		})
+	}
+
+	get_fields() {
+		const me = this;
+		const total_amount = [
+			{
+				fieldtype: 'HTML',
+				fieldname: "total_amount",
+			},
+			{
+				fieldtype: 'Section Break',
+				label: __("Mode of Payments")
+			},
+		]
+
+		const mode_of_paymen_fields = this.frm.doc.payments.map(p => {
+			return {
+				fieldtype: 'Currency',
+				label: __(p.mode_of_payment),
+				options: me.frm.doc.currency,
+				fieldname: p.mode_of_payment,
+				default: p.amount,
+				onchange: (e) => {
+					const fieldname = $(e.target).attr('data-fieldname');
+					const value = this.dialog.get_value(fieldname);
+					me.update_payment_value(fieldname, value)
+				}
+			}
+		})
+
+		const other_fields = [
+			{
+				fieldtype: 'Column Break',
+			},
+			{
+				fieldtype: 'HTML',
+				fieldname: 'numpad'
+			},
+			{
+				fieldtype: 'Section Break',
+			},
+			{
+				fieldtype: 'Currency',
+				label: __("Write off Amount"),
+				options: me.frm.doc.currency,
+				fieldname: "write_off_amount",
+				default: me.frm.doc.write_off_amount,
+				onchange: (e) => {
+					me.update_cur_frm_value('write_off_amount', () => {
+						frappe.flags.change_amount = false;
+						me.update_change_amount()
+					})
+				}
+			},
+			{
+				fieldtype: 'Column Break',
+			},
+			{
+				fieldtype: 'Currency',
+				label: __("Change Amount"),
+				options: me.frm.doc.currency,
+				fieldname: "change_amount",
+				default: me.frm.doc.change_amount,
+				onchange: (e) => {
+					me.update_cur_frm_value('change_amount', () => {
+						frappe.flags.write_off_amount = false;
+						me.update_write_off_amount()
+					})
+				}
+			},
+		]
+
+		$.merge(total_amount, mode_of_paymen_fields)
+		return $.merge(total_amount, other_fields)
+	}
+
+	update_flag() {
+		frappe.flags.write_off_amount = true;
+		frappe.flags.change_amount = true;
+	}
+
+	update_cur_frm_value(fieldname, callback) {
+		if (frappe.flags[fieldname]) {
+			const value = this.dialog.get_value(fieldname);
+			this.frm.set_value(fieldname, value)
+			.then(() => {
+				callback()
+			})
+		}
+
+		frappe.flags[fieldname] = true;
+	}
+
+	update_payment_value(fieldname, value) {
+		var me = this;
+		$.each(this.frm.doc.payments, function(i, data) {
+			if (__(data.mode_of_payment) == __(fieldname)) {
+				frappe.model.set_value('Sales Invoice Payment', data.name, 'amount', value)
+				.then(() => {
+					me.update_change_amount();
+					me.update_write_off_amount();
+				})
+			}
+		});
+	}
+
+	update_change_amount() {
+		this.dialog.set_value("change_amount", this.frm.doc.change_amount)
+	}
+
+	update_write_off_amount() {
+		this.dialog.set_value("write_off_amount", this.frm.doc.write_off_amount)
+	}
+
+	show_total_amount() {
+		const grand_total = format_currency(this.frm.doc.grand_total, this.frm.doc.currency)
+		const template = `
+			<h3>
+				${ __("Total Amount") }:
+				<span class="label label-default">${__(grand_total)}</span>
+			</h3>
+		`
+		this.total_amount_section = $(this.$body).find("[data-fieldname = 'total_amount']")
+		this.total_amount_section.append(template)
+	}
 }
\ No newline at end of file