I'm w/ nonny on this. It sounds like your friend made plans w/o really clearing them with you. Sure, she may be bummed that you won't have as much time, but if she really wanted to spend a lot of time w/ you- she would have cleared the dates before booking anything.
The fact that she booked w/o checking w/ you tells me that you really aren't the focus of her trip.
I have unpopular opinion. In today's world and job market I believe that even if something is presented to you as optional you should do it, because jobs are not that easy to get these days. There are some instances when cancelling on other might not be ok, but she is your casual friend who was coming because she decided to come for her birthday. In the mean time you have a job that requires you to be there and it will give you extra $1000. So you let her know you are not available and she can come other time. You can offer to pay the fees for switching the flights. I don't see how you are being a bad friend.
Okay, with your clarifications it sounds like maybe she's just coming to Capetown rather than coming to visit you. That makes me feel much better about things
The more you share the more I think this is on her.
I agree. From the OP I presumed you had said "you have to come visit me!" and planned this visit together, which I realize now is actually not at all the case. Given how it did happen, I think it's totally fair game to say "hey bad news, my schedule changed for that week. Not only will I not be able to take two days off, but I have to work a conference, which means I might actually have to work MORE than usual. I'm so sorry, the timing really sucks. I would love to see you if you can come another time, but I know you wanted to come for your birthday, so please don't feel that you have to change it on my account." And then it's up to her to decide whether to still come and visit CT on her own, or reschedule for a time when you can see her.