function uc_recurring_product_process_order in UC Recurring Payments and Subscriptions 6.2
Same name and namespace in other branches
- 7.2 modules/uc_recurring_product/uc_recurring_product.module \uc_recurring_product_process_order()
Passes the information onto the specified fee handler for processing.
Parameters
$order: The order object the fees are attached to.
$data: Optional; Data that should be added to the fee object.
Return value
FALSE on failure or array with new recurring fee IDs.
3 calls to uc_recurring_product_process_order()
- uc_recurring_hosted_paypal_ipn in modules/
uc_recurring_hosted/ uc_recurring_hosted.paypal_ipn.inc - Handle IPN callbacks for PayPal recurring payments
- uc_recurring_product_order in modules/
uc_recurring_product/ uc_recurring_product.module - Implementation of hook_order().
- uc_recurring_product_order_view_update_form_submit in modules/
uc_recurring_product/ uc_recurring_product.module - Submit handler for the processing recurring fee.
File
- modules/
uc_recurring_product/ uc_recurring_product.module, line 338 - Add recurring payments/fees to a product. This is imlpemented through Ubercarts product features.
Code
function uc_recurring_product_process_order($order, $data = array()) {
global $user;
// Get all the products that should have a recurring fee created for them.
if ($products = uc_recurring_product_get_recurring_products_in_order($order)) {
// Check we have an handler to deal with the recurring payment.
$payment_method = !empty($order->payment_method) ? $order->payment_method : 'default';
if (!($fee_handler = uc_recurring_get_recurring_info($payment_method))) {
drupal_set_message(t('A handler for processing and renewing recurring fees cannot be found for the @payment-method payment method.', array(
'@payment-method' => $order->payment_method,
)), 'error');
return FALSE;
}
$return = array();
// Create a new fee object.
$fee_template = new stdClass();
$fee_template->uid = $order->uid;
$fee_template->fee_handler = $fee_handler['fee handler'];
$fee_template->created = time();
$fee_template->order_id = $order->order_id;
$fee_template->module = 'uc_recurring_product';
// Iterate over the products that require a fee.
foreach ($products as $product) {
$fee = drupal_clone($fee_template);
$product_fee = $product['recurring product'];
$order_product_id = $product['product']->order_product_id;
// If the product fee amount is 0, it means we need to use the product
// price. This allows recurring fees to be adjusted by attributes.
$fee->fee_amount = $product_fee->fee_amount == 0 ? $product['product']->price : $product_fee->fee_amount;
$fee->fee_amount *= $product['product']->qty;
// Add the product's title as the order title.
$fee->fee_title = t('Renewal of product @title', array(
'@title' => $product['product']->title,
));
$fee->next_charge = strtotime('+' . $product_fee->initial_charge);
$fee->initial_charge = $product_fee->initial_charge;
$fee->regular_interval = $product_fee->regular_interval;
$fee->remaining_intervals = $product_fee->number_intervals;
$fee->charged_intervals = 0;
$fee->data = array(
'model' => $product_fee->model,
'nid' => $product_fee->nid,
'qty' => $product['product']->qty,
'extension' => 0,
) + $data;
$fee->attempts = 0;
$fee->pfid = $product_fee->pfid;
$fee->order_product_id = $order_product_id;
$fee->own_handler = !empty($fee_handler['own handler']);
drupal_alter('recurring_fee_user_create', $fee);
// Let the implementing module process.
if (uc_recurring_invoke($fee->fee_handler, 'process callback', array(
$order,
&$fee,
))) {
// Recurring processing was successful, get the fee.
// We will save all fees together after we are sure all of them were
// processed properly.
$fee_objects[] = $fee;
}
else {
// We have an error, so break. No fee object was saved.
return FALSE;
}
}
if (!empty($fee_objects)) {
// There was no error, so save all fee objects.
foreach ($fee_objects as $object) {
$rfid = uc_recurring_fee_user_save($object);
uc_order_comment_save($order->order_id, $user->uid, t('Recurring fee <a href="@recurring-view-fee">@rfid</a> added to order.', array(
'@recurring-view-fee' => url('admin/store/orders/recurring/view/fee/' . $rfid),
'@rfid' => $rfid,
)));
$return[] = $rfid;
}
}
}
return $return;
}