Hello,
I'm faced with a similar scenario. But I need to move staff leave to the next year.
So, I wrote a scheduled action for this situation based on start dates and ages. But I'm not sure of the accuracy, maybe it can give you an idea.
I created two fields in hr.employee object : 
class HrEmployee(models.Model):
    _inherit = 'hr.employee'
    age = fields.Char(string='Yaş')
    annual_leave_calc_number = fields.Integer(string="Annual Leave Calculation Number")
    annual_leave_calc_date = fields.Datetime(string="Annual Leave Calculation Date")
After , method for ir_cron  
    @api.model
    def _cron_employee_remaining_leaves(self):
      for employee in self.search([('active', '=', True)]):
            _emp_leave_right = 0
            _emp_age = employee.age
            _emp_date_job_start = datetime.strptime(employee.ise_giris_tarihi, '%Y-%m-%d').date()
            _current_date = datetime.now().date()
            if int(_emp_age) >= 15:
               .... (some calculations )
                #After:
                temp_start_date = _emp_date_job_start
                if employee.annual_leave_calculation_number > 0:
                    temp_start_date = employee.annual_leave_calculation_date
                while _current_date == self.addYears(temp_start_date, 1):
                    employee.remaining_leaves += _emp_leave_right
                    employee.annual_leave_calc_date = _current_date
                    employee.annual_leave_calc_number += 1
            else:
                _logger.info('15 yaşından küçük personel çalıştıramazsınız ve izin hakkı yoktur.')
    
    
    # This method for getting next year or years from the starting date 
    def addYears(self, date_start, years):
        try:
            return date_start.replace(year=date_start.year + years)
        except ValueError:
            return date_start + (date(date_start.year + years, 1, 1) - date(date_start.year, 1, 1))