This is excellent @nielvosloo!
It’s great how you’ve extended the assignment to effectively address the weaknesses and limitations in the original basic contract, so that now…
(i) users without an existing account can’t have balances updated;
(ii) existing users can’t have their account balance overwritten by a new user with the same id; and
(ii) users without an existing account won’t have a zero balance returned by the getter.
All of these issues are resolved skillfully and effectively by your solution, which also generates appropriate error messages depending on the situation, and all handled by just one modifier. You’ve also practised and shown that you can use and adapt modifiers, require() and assert()…
… oh, and your solution to the original problem is also correct, the most concise and also uses less gas than some of the alternatives
Well done! Fantastic progress!