Evaluate coupon codes ignoring case

Current implementation forces case which causes confusion for users
who see their entered coupon code change after input. This strategy
allows user input to be maintained, but normalizes the code before
evaulation using a single, shared method.

Fixes #3365