Hi,
Generally when using stock code and modules Zen Cart has no problems handling orders with zero value, even if you are using Paypal.
There is logic to test the order total and skip even going to paypal if it is.
I therefore suspect an incompatibility with some of the extra contributions you are using.
That said, something similar has been noted before regarding contributed order total modules, and a fix was provided.
The fix relates to the includes/classes/order_total.php file.
You will need to replace this block of code
Code:
function pre_confirmation_check() {
global $order, $credit_covers;
if (MODULE_ORDER_TOTAL_INSTALLED) {
$total_deductions = 0;
reset($this->modules);
while (list(, $value) = each($this->modules)) {
$class = substr($value, 0, strrpos($value, '.'));
if ( $GLOBALS[$class]->credit_class ) {
$order_total = $GLOBALS[$class]->get_order_total();
if (is_array($order_total)) $order_total = $order_total['total'];
$total_deductions = $total_deductions + $GLOBALS[$class]->pre_confirmation_check($order_total);
}
}
$difference = $order->info['total'] - $total_deductions;
if ( $difference <= 0.009 ) {
$credit_covers = true;
}
}
}
with
Code:
function pre_confirmation_check() {
global $order, $credit_covers;
if (MODULE_ORDER_TOTAL_INSTALLED) {
$total_deductions = 0;
reset($this->modules);
$orderInfoSaved = $order->info;
while (list(, $value) = each($this->modules)) {
$class = substr($value, 0, strrpos($value, '.'));
if ( $GLOBALS[$class]->credit_class ) {
$order_total = $GLOBALS[$class]->get_order_total();
if (is_array($order_total)) $order_total = $order_total['total'];
$total_deductions = $total_deductions + $GLOBALS[$class]->pre_confirmation_check($order_total);
}
else
{
$GLOBALS[$class]->process();
$GLOBALS[$class]->output = array();
}
}
$difference = $order->info['total'] - $total_deductions;
if ( $difference <= 0.009 ) {
$credit_covers = true;
}
$order->info = $orderInfoSaved;
}
}
As with any code change, always make sure you backup any files being changed first.