def validate_max_benefit(self, earning_component_name):
		max_benefit_amount = frappe.db.get_value("Salary Component", earning_component_name, "max_benefit_amount")
		benefit_amount = 0
		for employee_benefit in self.employee_benefits:
			if employee_benefit.earning_component == earning_component_name:
				benefit_amount += employee_benefit.amount
		prev_sal_slip_flexi_amount = get_sal_slip_total_benefit_given(self.employee, frappe.get_doc("Payroll Period", self.payroll_period), earning_component_name)
		benefit_amount += prev_sal_slip_flexi_amount
		if rounded(benefit_amount, 2) > max_benefit_amount:
			frappe.throw(_("Maximum benefit amount of component {0} exceeds {1}").format(earning_component_name, max_benefit_amount))
	def validate_max_benefit(self, earning_component_name):
		max_benefit_amount = frappe.db.get_value("Salary Component", earning_component_name, "max_benefit_amount")
		benefit_amount = 0
		for employee_benefit in self.employee_benefits:
			if employee_benefit.earning_component == earning_component_name:
				benefit_amount += employee_benefit.amount
		prev_sal_slip_flexi_amount = get_sal_slip_total_benefit_given(self.employee, frappe.get_doc("Payroll Period", self.payroll_period), earning_component_name)
		benefit_amount += prev_sal_slip_flexi_amount
		if rounded(benefit_amount, 2) > max_benefit_amount:
			frappe.throw(_("Maximum benefit amount of component {0} exceeds {1}").format(earning_component_name, max_benefit_amount))
	def validate_prev_benefit_claim(self):
		if self.employee_benefits:
			for benefit in self.employee_benefits:
				if benefit.pay_against_benefit_claim == 1:
					payroll_period = frappe.get_doc("Payroll Period", self.payroll_period)
					benefit_claimed = get_previous_claimed_amount(self.employee, payroll_period, component = benefit.earning_component)
					benefit_given = get_sal_slip_total_benefit_given(self.employee, payroll_period, component = benefit.earning_component)
					benefit_claim_remining = benefit_claimed - benefit_given
					if benefit_claimed > 0 and benefit_claim_remining > benefit.amount:
						frappe.throw(_("An amount of {0} already claimed for the component {1},\
						 set the amount equal or greater than {2}").format(benefit_claimed, benefit.earning_component, benefit_claim_remining))
	def validate_prev_benefit_claim(self):
		if self.employee_benefits:
			for benefit in self.employee_benefits:
				if benefit.pay_against_benefit_claim == 1:
					payroll_period = frappe.get_doc("Payroll Period", self.payroll_period)
					benefit_claimed = get_previous_claimed_amount(self.employee, payroll_period, component = benefit.earning_component)
					benefit_given = get_sal_slip_total_benefit_given(self.employee, payroll_period, component = benefit.earning_component)
					benefit_claim_remining = benefit_claimed - benefit_given
					if benefit_claimed > 0 and benefit_claim_remining > benefit.amount:
						frappe.throw(_("An amount of {0} already claimed for the component {1},\
						 set the amount equal or greater than {2}").format(benefit_claimed, benefit.earning_component, benefit_claim_remining))
def get_max_benefits_remaining(employee, on_date, payroll_period):
    max_benefits = get_max_benefits(employee, on_date)
    if max_benefits and max_benefits > 0:
        have_depends_on_payment_days = False
        per_day_amount_total = 0
        payroll_period_days = get_payroll_period_days(on_date, on_date,
                                                      employee)[0]
        payroll_period_obj = frappe.get_doc("Payroll Period", payroll_period)

        # Get all salary slip flexi amount in the payroll period
        prev_sal_slip_flexi_total = get_sal_slip_total_benefit_given(
            employee, payroll_period_obj)

        if prev_sal_slip_flexi_total > 0:
            # Check salary structure hold depends_on_payment_days component
            # If yes then find the amount per day of each component and find the sum
            sal_struct_name = get_assigned_salary_structure(employee, on_date)
            if sal_struct_name:
                sal_struct = frappe.get_doc("Salary Structure",
                                            sal_struct_name)
                for sal_struct_row in sal_struct.get("earnings"):
                    salary_component = frappe.get_doc(
                        "Salary Component", sal_struct_row.salary_component)
                    if salary_component.depends_on_payment_days == 1 and salary_component.pay_against_benefit_claim != 1:
                        have_depends_on_payment_days = True
                        benefit_amount = get_benefit_pro_rata_ratio_amount(
                            sal_struct, salary_component.max_benefit_amount)
                        amount_per_day = benefit_amount / payroll_period_days
                        per_day_amount_total += amount_per_day

            # Then the sum multiply with the no of lwp in that period
            # Include that amount to the prev_sal_slip_flexi_total to get the actual
            if have_depends_on_payment_days and per_day_amount_total > 0:
                holidays = get_holidays_for_employee(
                    employee, payroll_period_obj.start_date, on_date)
                working_days = date_diff(on_date,
                                         payroll_period_obj.start_date) + 1
                leave_days = calculate_lwp(employee,
                                           payroll_period_obj.start_date,
                                           holidays, working_days)
                leave_days_amount = leave_days * per_day_amount_total
                prev_sal_slip_flexi_total += leave_days_amount

            return max_benefits - prev_sal_slip_flexi_total
    return max_benefits
def get_max_benefits_remaining(employee, on_date, payroll_period):
	max_benefits = get_max_benefits(employee, on_date)
	if max_benefits and max_benefits > 0:
		have_depends_on_payment_days = False
		per_day_amount_total = 0
		payroll_period_days = get_payroll_period_days(on_date, on_date, employee)[0]
		payroll_period_obj = frappe.get_doc("Payroll Period", payroll_period)

		# Get all salary slip flexi amount in the payroll period
		prev_sal_slip_flexi_total = get_sal_slip_total_benefit_given(employee, payroll_period_obj)

		if prev_sal_slip_flexi_total > 0:
			# Check salary structure hold depends_on_payment_days component
			# If yes then find the amount per day of each component and find the sum
			sal_struct_name = get_assigned_salary_structure(employee, on_date)
			if sal_struct_name:
				sal_struct = frappe.get_doc("Salary Structure", sal_struct_name)
				for sal_struct_row in sal_struct.get("earnings"):
					salary_component = frappe.get_doc("Salary Component", sal_struct_row.salary_component)
					if salary_component.depends_on_payment_days == 1 and salary_component.pay_against_benefit_claim != 1:
						have_depends_on_payment_days = True
						benefit_amount = get_benefit_pro_rata_ratio_amount(sal_struct, salary_component.max_benefit_amount)
						amount_per_day = benefit_amount / payroll_period_days
						per_day_amount_total += amount_per_day

			# Then the sum multiply with the no of lwp in that period
			# Include that amount to the prev_sal_slip_flexi_total to get the actual
			if have_depends_on_payment_days and per_day_amount_total > 0:
				holidays = get_holidays_for_employee(employee, payroll_period_obj.start_date, on_date)
				working_days = date_diff(on_date, payroll_period_obj.start_date) + 1
				leave_days = calculate_lwp(employee, payroll_period_obj.start_date, holidays, working_days)
				leave_days_amount = leave_days * per_day_amount_total
				prev_sal_slip_flexi_total += leave_days_amount

			return max_benefits - prev_sal_slip_flexi_total
	return max_benefits