diff --git a/payment/uc_free_order/uc_free_order.info b/payment/uc_free_order/uc_free_order.info new file mode 100644 index 0000000..a59f7de --- /dev/null +++ b/payment/uc_free_order/uc_free_order.info @@ -0,0 +1,7 @@ +name = Free Order Payment Method +description = Enables a payment method to handle the possibility of free orders. +dependencies[] = uc_order +dependencies[] = uc_payment +package = Ubercart - payment +core = 7.x + diff --git a/payment/uc_free_order/uc_free_order.module b/payment/uc_free_order/uc_free_order.module new file mode 100644 index 0000000..dec4a8c --- /dev/null +++ b/payment/uc_free_order/uc_free_order.module @@ -0,0 +1,95 @@ +order_total; + + // remove the free order payment method when the total is higher than 0 + if ($subtotal >= 0.01) { + unset($form['panes']['payment']['payment_method']['#options']['free_order']); + return; + } + // copy the existing payment method for free order + $free_order = $form['panes']['payment']['payment_method']['#options']['free_order']; + + // rewrite the list of options to only include the free order + $form['panes']['payment']['payment_method']['#options'] = array('free_order' => $free_order); + // make the form automatically select the free order without need for user input + $form['panes']['payment']['payment_method']['#default_value'] = 'free_order'; + $form['panes']['payment']['payment_method']['#disabled'] = 'TRUE'; +} + +/** + * Implementation of hook_form_FORM_ID_alter(). + * for the uc_cart_checkout_review_form + * In Check out at the review Step more validation for the free order payment method + */ +function uc_free_order_form_uc_cart_checkout_review_form_alter(&$form, &$form_state, $form_id) { + $order = uc_order_load($_SESSION['cart_order']); + + // only deal with cases where the payment method was set to free + if ($order->payment_method != 'free_order') { + return; + } + + // validation for the amount + if ($order->order_total >= 0.01) { + drupal_set_message(t('We cannot process your order without payment.'), 'error'); + drupal_goto('cart/checkout'); + } +} + +/** + * Implementation of hook_uc_payment_method(). + */ +function uc_free_order_uc_payment_method() { + $zero = array('!zero' => uc_currency_format(0)); + $methods['free_order'] = array( + 'name' => t('Free order'), + 'title' => t('Free order - Payment not required.'), + 'desc' => t('Allow customers with !zero order totals to checkout without paying.', $zero), + 'callback' => 'uc_payment_method_free_order', + 'checkout' => TRUE, + 'no_gateway' => TRUE, + 'weight' => 0, + ); + + return $methods; +} + +/** + * Will show the user a message when the payment method is select. + */ +function uc_payment_method_free_order($op, &$order) { + if ($op == 'cart-details') { + $details = array( + 'uc_free_order_cart_details' => array( + '#markup' => t('Continue with checkout to complete your free order.'), + ), + ); + return $details; + } +} + +/** + * Implementation of hook_uc_order(). + * Will allow for a payment to be entered on this order that will allow + * other modules to trigger events for conditional actions + */ +function uc_free_order_uc_order($op, &$order) { + // During checkout, if the free order payment method is used, log a $0.00 + // payment for the order to trigger any necessary predicates. + if ($op == 'submit' && $order->payment_method == 'free_order') { + uc_payment_enter($order->order_id, 'free_order', 0, 0, NULL, t('Checkout completed for a free order.')); + } +} \ No newline at end of file