Merge branch 'develop' into e-commerce-refactor-develop
diff --git a/erpnext/education/doctype/program_enrollment/program_enrollment.py b/erpnext/education/doctype/program_enrollment/program_enrollment.py
index a23d492..4d0f3a9 100644
--- a/erpnext/education/doctype/program_enrollment/program_enrollment.py
+++ b/erpnext/education/doctype/program_enrollment/program_enrollment.py
@@ -6,6 +6,7 @@
 from frappe import _, msgprint
 from frappe.desk.reportview import get_match_cond
 from frappe.model.document import Document
+from frappe.query_builder.functions import Min
 from frappe.utils import comma_and, get_link_to_form, getdate
 
 
@@ -60,8 +61,15 @@
 			frappe.throw(_("Student is already enrolled."))
 
 	def update_student_joining_date(self):
-		date = frappe.db.sql("select min(enrollment_date) from `tabProgram Enrollment` where student= %s", self.student)
-		frappe.db.set_value("Student", self.student, "joining_date", date)
+		table = frappe.qb.DocType('Program Enrollment')
+		date = (
+			frappe.qb.from_(table)
+				.select(Min(table.enrollment_date).as_('enrollment_date'))
+				.where(table.student == self.student)
+		).run(as_dict=True)
+
+		if date:
+			frappe.db.set_value("Student", self.student, "joining_date", date[0].enrollment_date)
 
 	def make_fee_records(self):
 		from erpnext.education.api import get_fee_components
diff --git a/erpnext/hr/doctype/employee/test_employee_reminders.py b/erpnext/hr/doctype/employee/test_employee_reminders.py
index bdb51b0..a4097ab 100644
--- a/erpnext/hr/doctype/employee/test_employee_reminders.py
+++ b/erpnext/hr/doctype/employee/test_employee_reminders.py
@@ -207,8 +207,8 @@
 
 		# teardown: enable emp 2
 		frappe.db.set_value('Employee', self.test_employee_2.name, {
-			'status': 'Left',
-			'holiday_list': self.holiday_list_2
+			'status': 'Active',
+			'holiday_list': self.holiday_list_2.name
 		})
 
 	def test_advance_holiday_reminders_weekly(self):
@@ -232,8 +232,8 @@
 
 		# teardown: enable emp 2
 		frappe.db.set_value('Employee', self.test_employee_2.name, {
-			'status': 'Left',
-			'holiday_list': self.holiday_list_2
+			'status': 'Active',
+			'holiday_list': self.holiday_list_2.name
 		})
 
 	def test_reminder_not_sent_if_no_holdays(self):
diff --git a/erpnext/selling/page/point_of_sale/pos_controller.js b/erpnext/selling/page/point_of_sale/pos_controller.js
index 56aa24f..ea8459f 100644
--- a/erpnext/selling/page/point_of_sale/pos_controller.js
+++ b/erpnext/selling/page/point_of_sale/pos_controller.js
@@ -248,7 +248,7 @@
 
 				numpad_event: (value, action) => this.update_item_field(value, action),
 
-				checkout: () => this.payment.checkout(),
+				checkout: () => this.save_and_checkout(),
 
 				edit_cart: () => this.payment.edit_cart(),
 
@@ -713,4 +713,9 @@
 			})
 			.catch(e => console.log(e));
 	}
+
+	async save_and_checkout() {
+		this.frm.is_dirty() && await this.frm.save();
+		this.payment.checkout();
+	}
 };
diff --git a/erpnext/selling/page/point_of_sale/pos_item_cart.js b/erpnext/selling/page/point_of_sale/pos_item_cart.js
index 4920584..4a99f06 100644
--- a/erpnext/selling/page/point_of_sale/pos_item_cart.js
+++ b/erpnext/selling/page/point_of_sale/pos_item_cart.js
@@ -191,10 +191,10 @@
 			this.numpad_value = '';
 		});
 
-		this.$component.on('click', '.checkout-btn', function() {
+		this.$component.on('click', '.checkout-btn', async function() {
 			if ($(this).attr('style').indexOf('--blue-500') == -1) return;
 
-			me.events.checkout();
+			await me.events.checkout();
 			me.toggle_checkout_btn(false);
 
 			me.allow_discount_change && me.$add_discount_elem.removeClass("d-none");
@@ -985,6 +985,7 @@
 		$(frm.wrapper).off('refresh-fields');
 		$(frm.wrapper).on('refresh-fields', () => {
 			if (frm.doc.items.length) {
+				this.$cart_items_wrapper.html('');
 				frm.doc.items.forEach(item => {
 					this.update_item_html(item);
 				});