feat: Recurring Addtional Salary
diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.js b/erpnext/hr/doctype/additional_salary/additional_salary.js
index 18f6b8b..fb42b6f 100644
--- a/erpnext/hr/doctype/additional_salary/additional_salary.js
+++ b/erpnext/hr/doctype/additional_salary/additional_salary.js
@@ -13,5 +13,5 @@
 				}
 			};
 		});
-	}
+	},
 });
diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.json b/erpnext/hr/doctype/additional_salary/additional_salary.json
index 9819b38..91bcdc3 100644
--- a/erpnext/hr/doctype/additional_salary/additional_salary.json
+++ b/erpnext/hr/doctype/additional_salary/additional_salary.json
@@ -17,8 +17,10 @@
   "ref_docname",
   "column_break_5",
   "company",
+  "is_recurring",
+  "from_date",
+  "to_date",
   "payroll_date",
-  "salary_slip",
   "type",
   "department",
   "amount",
@@ -76,12 +78,13 @@
    "fieldtype": "Column Break"
   },
   {
+   "depends_on": "eval:(doc.is_recurring==0)",
    "description": "Date on which this component is applied",
    "fieldname": "payroll_date",
    "fieldtype": "Date",
    "in_list_view": 1,
    "label": "Payroll Date",
-   "reqd": 1,
+   "mandatory_depends_on": "eval:(doc.is_recurring==0)",
    "search_index": 1
   },
   {
@@ -108,13 +111,6 @@
    "reqd": 1
   },
   {
-   "fieldname": "salary_slip",
-   "fieldtype": "Link",
-   "label": "Salary Slip",
-   "options": "Salary Slip",
-   "read_only": 1
-  },
-  {
    "fetch_from": "salary_component.type",
    "fieldname": "type",
    "fieldtype": "Data",
@@ -131,6 +127,26 @@
    "read_only": 1
   },
   {
+   "default": "0",
+   "fieldname": "is_recurring",
+   "fieldtype": "Check",
+   "label": "Is Recurring"
+  },
+  {
+   "depends_on": "eval:(doc.is_recurring==1)",
+   "fieldname": "from_date",
+   "fieldtype": "Date",
+   "label": "From Date",
+   "mandatory_depends_on": "eval:(doc.is_recurring==1)"
+  },
+  {
+   "depends_on": "eval:(doc.is_recurring==1)",
+   "fieldname": "to_date",
+   "fieldtype": "Date",
+   "label": "To Date",
+   "mandatory_depends_on": "eval:(doc.is_recurring==1)"
+  },
+   {
    "fieldname": "ref_doctype",
    "fieldtype": "Link",
    "label": "Reference Document Type",
diff --git a/erpnext/hr/doctype/additional_salary/additional_salary.py b/erpnext/hr/doctype/additional_salary/additional_salary.py
index bc7dcee..a6f34cc 100644
--- a/erpnext/hr/doctype/additional_salary/additional_salary.py
+++ b/erpnext/hr/doctype/additional_salary/additional_salary.py
@@ -21,10 +21,23 @@
 			frappe.throw(_("Amount should not be less than zero."))
 
 	def validate_dates(self):
- 		date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee,
+		date_of_joining, relieving_date = frappe.db.get_value("Employee", self.employee,
 			["date_of_joining", "relieving_date"])
- 		if date_of_joining and getdate(self.payroll_date) < getdate(date_of_joining):
- 			frappe.throw(_("Payroll date can not be less than employee's joining date"))
+
+		if not self.is_recurring and not self.payroll_date:
+			frappe.msgprint(_("Please enter Payroll Date."), indicator='blue', raise_exception=1)
+		if self.is_recurring and not self.from_date and not self.to_date:
+			frappe.msgprint(_("Please enter From Date and To Date."), indicator='blue', raise_exception=1)
+		if getdate(self.from_date) > getdate(self.to_date):
+			frappe.throw(_("From Date can not be greater than To Date."))
+
+		if date_of_joining:
+			if getdate(self.payroll_date) < getdate(date_of_joining):
+				frappe.throw(_("Payroll date can not be less than employee's joining date."))
+			elif getdate(self.from_date) < getdate(date_of_joining):
+				frappe.throw(_("From date can not be less than employee's joining date."))
+			elif getdate(self.to_date) > getdate(relieving_date):
+				frappe.throw(_("To date can not be greater than employee's relieving date."))
 
 	def get_amount(self, sal_start_date, sal_end_date):
 		start_date = getdate(sal_start_date)
@@ -45,8 +58,12 @@
 		from `tabAdditional Salary`
 		where employee=%(employee)s
 			and docstatus = 1
-			and payroll_date between %(from_date)s and %(to_date)s
-			and type = %(component_type)s
+			and (payroll_date between %(from_date)s and %(to_date)s)
+			or (
+				(from_date between %(from_date)s and %(to_date)s)
+				or(to_date between %(from_date)s and %(to_date)s)
+			)
+		and type = %(component_type)s
 		group by salary_component, overwrite_salary_structure_amount
 		order by salary_component, overwrite_salary_structure_amount
 	""", {
diff --git a/erpnext/hr/doctype/salary_slip/salary_slip.py b/erpnext/hr/doctype/salary_slip/salary_slip.py
index d03a3dd..a78f55c 100644
--- a/erpnext/hr/doctype/salary_slip/salary_slip.py
+++ b/erpnext/hr/doctype/salary_slip/salary_slip.py
@@ -410,6 +410,7 @@
 		if additional_components:
 			for additional_component in additional_components:
 				amount = additional_component.amount
+				print("-------------[>>>]", amount)
 				overwrite = additional_component.overwrite
 				self.update_component_row(frappe._dict(additional_component.struct_row), amount,
 					component_type, overwrite=overwrite)