public client_connect( id ) g_bDonateUsed[ id ] = false;
public CSBase_PlayerPost_Spawn( id ) g_bDonateUsed[ id ] = false;
public client_disconnect( id ) g_bDonateUsed[ id ] = false;
Right there you've got 3 forwards doing the same thing. Ham_Spawn is called once when player connects so that would be the only one you need.
In some cases you send info in menu_additem() but you don't retrieve it, which means no need to send it. Also, player indexes can change, so when selecting a player you should use the player's userid and send that in menu_additem() instead of player index. Something you've missed aswell is checking to see if the player is still connected - you might donate to the wrong player otherwise.
You may also want to revise your readability with variable names, eg. g_szDonationTarget is numerical.