From efbd3552209780a580743e7eb630d53cfe3c4438 Mon Sep 17 00:00:00 2001 From: Mark Jones Date: Thu, 23 May 2013 16:01:14 +0100 Subject: [PATCH] Issue #1831338 by justanothermark: Revalidate coupons on order refresh and remove invalid coupons. --- commerce_coupon.module | 55 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/commerce_coupon.module b/commerce_coupon.module index c719f71..cd1cb81 100644 --- a/commerce_coupon.module +++ b/commerce_coupon.module @@ -256,6 +256,52 @@ function commerce_coupon_code_is_valid($code, $order) { } /** + * Checks if a given coupon is still valid for a given order. The validation is done + * by the rules engine. + * + * This is currently the same as commerce_coupon_is_valid without checking if the coupon + * is already on the order. + * + * @TODO: Reduce the duplicated code between the two functions. Possibly by using is_valid + * and moving the check for whether a coupon is already on an order elsewhere or by adding + * a parameter to say whether to check for existing. + * + * @param $code + * The coupon code to validate. + * @param $order + * The order at against the $code should be validated. + * @return boolean + * Returns TRUE if the code is valid else FALSE. + */ +function commerce_coupon_code_is_still_valid($code, $order) { + global $_commerce_coupon_validation_error_message; + + // Trim trailing spaces + $code = trim($code); + + $coupon = commerce_coupon_load_by_code($code); + + // if no such coupon found, the $code is invalid + if (!is_object($coupon)) { + // $commerce_coupon_validation_error_message = t('Coupon code is invalid.'); + return FALSE; + } + + // We use the drupal_static function to generate a global variable. + // We set per default the result to TRUE. The rules can modify this values, + // by invoking the valid or invalid action. + $validation_results = &drupal_static('commerce_coupon_action_validation_results'); + $validation_results = TRUE; + + // We invoke the rules. The defined action callback methods sets then the + // validation result appropriate. + rules_invoke_event('commerce_coupon_validate', $coupon, $order); + + // We get our global variable and return the result. + return drupal_static('commerce_coupon_action_validation_results'); +} + +/** * Redeem a coupon. For calculating the coupon value the rules engine is used. * * @param $coupon @@ -1073,9 +1119,12 @@ function commerce_coupon_commerce_cart_order_refresh($order_wrapper) { foreach ($order_wrapper->commerce_line_items as $line_item_wrapper) { $line_item = $line_item_wrapper->value(); if ($line_item->type == 'commerce_coupon') { - $coupon = $line_item_wrapper->commerce_coupon_reference->value(); - if (!in_array($coupon, $coupons)) { - commerce_coupon_remove_coupon_from_order($order, $coupon); + $coupon = $line_item_wrapper->commerce_coupon_reference; + // Check whether the current coupon is still valid. + $valid = commerce_coupon_code_is_still_valid($coupon->commerce_coupon_code->value(), $order); + // If removed from order but line item exists or if coupon is no longer valid then remove line item. + if (!in_array($coupon->value(), $coupons) || !$valid) { + commerce_coupon_remove_coupon_from_order($order, $coupon->value()); } } } -- 1.7.9.5