The code that handles this is in app/code/core/Mage/Payment/Block/Form/Container.php
in the getMethods()
method.
Look for this part of the method:
foreach ($methods as $key => $method) {
if ($this->_canUseMethod($method)
&& ($total != 0
|| $method->getCode() == 'free'
|| ($quote->hasRecurringItems()
&& $method->canManageRecurringProfiles()))) {
$this->_assignMethod($method);
} else {
unset($methods[$key]);
}
}
Look at the if statement. You can update that logic. The easiest (and sloppiest) thing you could do is change part of that if line to something like:
BEFORE: || $method->getCode() == 'free'
AFTER: || ($method->getCode() == 'free' || $method->getCode() == 'checkmo')
I'm not sure of your skill level. This way will work and it's the simplest, but you will lose this change if/when you upgrade Magento. It is bad practice to directly update the Magento core code.
See this link for how to properly override this method (it takes more steps): Magento System Overrides and Upgradability