function commerce_coupon_usage_commerce_order_update in Commerce Coupon 7.2
Implements hook_commerce_order_update().
File
- modules/
usage/ commerce_coupon_usage.module, line 400
Code
function commerce_coupon_usage_commerce_order_update($order) {
if (!commerce_coupon_order_allows_coupons($order)) {
return;
}
// This hook implementation mostly supports keeping track of coupon usage
// as completed/pending orders are changed from the order admin UI.
$unchanged = entity_metadata_wrapper('commerce_order', $order->original);
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$statuses = commerce_coupon_usage_tracked_order_statuses();
// Only handle usage for completed orders
if (in_array($order->status, $statuses)) {
// Add usage records for coupons present if coupon is present in current but
// not original or if the original order was in a non-tracked status.
foreach ($order_wrapper->commerce_coupons as $coupon_wrapper) {
$coupon_id = $coupon_wrapper->coupon_id
->value();
if (!$unchanged->commerce_coupons
->value() || !in_array($coupon_id, $unchanged->commerce_coupons
->raw()) || !in_array($unchanged->status
->value(), $statuses)) {
// Never write a record for the same order and coupon twice.
if (commerce_coupon_usage_record_exists($order->order_id, $coupon_id)) {
continue;
}
$transaction_id = commerce_coupon_usage_transaction_write($coupon_id, $order->order_id);
if (!$transaction_id) {
drupal_set_message(t('You have exceeded the maximum usage settings for
coupon %code. Its usage on this order has not been recorded - you must
increase its maximum usage value, remove it from this order and add it again.', array(
'%code' => $coupon_wrapper->code
->value(),
)), 'warning');
}
}
}
// Remove usage records for coupons absent after update but present before.
foreach ($unchanged->commerce_coupons as $coupon_wrapper) {
$coupon_id = $coupon_wrapper->coupon_id
->value();
if (!$order_wrapper->commerce_coupons
->value() || !in_array($coupon_id, $order_wrapper->commerce_coupons
->raw())) {
$remove_coupon_ids[] = $coupon_id;
}
}
if (isset($remove_coupon_ids)) {
commerce_coupon_reset_usage(array(
$order->order_id,
), $remove_coupon_ids);
}
}
else {
if (in_array($unchanged->status
->value(), $statuses)) {
// If the order is moving out of a tracked status, reset its usage.
commerce_coupon_reset_usage(array(
$unchanged->order_id
->value(),
));
}
}
}