I suggest that your client's apparent anger is nothing more than a negotiation tactic - whether they are consciously aware of this or not.
If you have agreed a list of requirements and a price, and you have this written down and signed off by both parties, then you should stick to your guns. Giving in to your client's demands will most likely lead to them asking for more and more things not in the original list. They will simply stomp all over you.
When I worked freelance I included a clause that said something along the lines of: "Any additional work required that is not included in this document will be quoted for on a new project basis."
I made sure I charged at quite a higher rate than I had done for the original quote, due to the extra effort involved in ensuring that the new request(s) didn't break functionality elsewhere or result in me having to refactor significant portions of code.
This is sort of what happened when they asked for the new features, we responded with estimates for that work and explained why it wasn't included ... they got pretty upset. Implied WE were the ones playing a game or something, when of course, from our end this is just totally straightforward.
If you have agreed a list of requirements and a price, and you have this written down and signed off by both parties, then you should stick to your guns. Giving in to your client's demands will most likely lead to them asking for more and more things not in the original list. They will simply stomp all over you.
When I worked freelance I included a clause that said something along the lines of: "Any additional work required that is not included in this document will be quoted for on a new project basis."
I made sure I charged at quite a higher rate than I had done for the original quote, due to the extra effort involved in ensuring that the new request(s) didn't break functionality elsewhere or result in me having to refactor significant portions of code.