Employee Transfer allow same company, update internal work history (#14430)

diff --git a/erpnext/hr/doctype/employee_promotion/employee_promotion.py b/erpnext/hr/doctype/employee_promotion/employee_promotion.py
index 5fcceed..4994921 100644
--- a/erpnext/hr/doctype/employee_promotion/employee_promotion.py
+++ b/erpnext/hr/doctype/employee_promotion/employee_promotion.py
@@ -21,10 +21,10 @@
 
 	def on_submit(self):
 		employee = frappe.get_doc("Employee", self.employee)
-		employee = update_employee(employee, self.promotion_details)
+		employee = update_employee(employee, self.promotion_details, date=self.promotion_date)
 		employee.save()
 
 	def on_cancel(self):
 		employee = frappe.get_doc("Employee", self.employee)
-		employee = update_employee(employee, self.promotion_details, True)
+		employee = update_employee(employee, self.promotion_details, cancel=True)
 		employee.save()
diff --git a/erpnext/hr/doctype/employee_transfer/employee_transfer.py b/erpnext/hr/doctype/employee_transfer/employee_transfer.py
index 6cdd22f..d542290 100644
--- a/erpnext/hr/doctype/employee_transfer/employee_transfer.py
+++ b/erpnext/hr/doctype/employee_transfer/employee_transfer.py
@@ -13,8 +13,6 @@
 	def validate(self):
 		if frappe.get_value("Employee", self.employee, "status") == "Left":
 			frappe.throw(_("Cannot transfer Employee with status Left"))
-		if self.new_company and self.company == self.new_company:
-			frappe.throw(_("New Company must be different from current company"))
 
 	def before_submit(self):
 		if getdate(self.transfer_date) > getdate():
@@ -27,7 +25,9 @@
 			new_employee = frappe.copy_doc(employee)
 			new_employee.name = None
 			new_employee.employee_number = None
-			new_employee = update_employee(new_employee, self.transfer_details)
+			if self.company != self.new_company:
+				new_employee.internal_work_history = []
+			new_employee = update_employee(new_employee, self.transfer_details, date=self.transfer_date)
 			if self.new_company:
 				new_employee.company = self.new_company
 			#move user_id to new employee before insert
@@ -40,7 +40,7 @@
 			employee.db_set("relieving_date", self.transfer_date)
 			employee.db_set("status", "Left")
 		else:
-			employee = update_employee(employee, self.transfer_details)
+			employee = update_employee(employee, self.transfer_details, date=self.transfer_date)
 			if self.new_company:
 				employee.company = self.new_company
 			employee.save()
@@ -54,10 +54,11 @@
 			#mark the employee as active
 			employee.status = "Active"
 			employee.relieving_date = ''
-			employee.save()
 		else:
-			employee = update_employee(employee, self.transfer_details, True)
-			employee.save()
+			employee = update_employee(employee, self.transfer_details, cancel=True)
+		if self.new_company != self.company:
+			employee.company = self.company
+		employee.save()
 
 	def validate_user_in_details(self):
 		for item in self.transfer_details:
diff --git a/erpnext/hr/utils.py b/erpnext/hr/utils.py
index 01c9784..11dbdf2 100644
--- a/erpnext/hr/utils.py
+++ b/erpnext/hr/utils.py
@@ -88,7 +88,8 @@
 	if doc.employee and not doc.employee_name:
 		doc.employee_name = frappe.db.get_value("Employee", doc.employee, "employee_name")
 
-def update_employee(employee, details, cancel=False):
+def update_employee(employee, details, date=None, cancel=False):
+	internal_work_history = {}
 	for item in details:
 		fieldtype = frappe.get_meta("Employee").get_field(item.fieldname).fieldtype
 		new_data = item.new if not cancel else item.current
@@ -97,6 +98,11 @@
 		elif fieldtype =="Datetime" and new_data:
 			new_data = get_datetime(new_data)
 		setattr(employee, item.fieldname, new_data)
+		if item.fieldname in ["department", "designation", "branch"]:
+			internal_work_history[item.fieldname] = item.new
+	if internal_work_history and not cancel:
+		internal_work_history["from_date"] = date
+		employee.append("internal_work_history", internal_work_history)
 	return employee
 
 @frappe.whitelist()
@@ -343,4 +349,4 @@
 	elif frequency == "Monthly":
 		return amount * 12
 	elif frequency == "Bimonthly":
-		return amount * 6
\ No newline at end of file
+		return amount * 6