The way that you have the rules defined seem ok to me. If the charges are not working like this then there may be a problem with the session variable values you are using. If they are not set to the correct value then the rules will not work properly. It seems that all of these values should be present by the time you get the the confirm page initially. A good test would be to print out the values of these session variables to ensure that they are being set correctly. You can do that with this code:
<?php print("The value of PromoCode is: " . $_SESSION['PromoCode'] . "<br/>"); ?>
<?php print("The value of shipTo is: " . $_SESSION['shipTo'] . "<br/>"); ?>
Make sure that you put this in the visible section of your confirm page so you can ensure that the values should already be set. If you do not see the values that you are expecting then you may need to look into how you are setting the session variables to see if there is a problem. Let us know what you discover.