From 001bb50a5f137eae6d3fb04b0387ecc90f0a98ce Mon Sep 17 00:00:00 2001
From: Maciej Zgadzaj <maciej.zgadzaj@gmail.com>
Date: Fri, 1 Feb 2013 06:37:48 -0500
Subject: [PATCH] Issue #1305242: Added possibility to remove coupon from order on checkout.

---
 commerce_coupon.info                               |    3 +-
 commerce_coupon.install                            |   21 +++++++++++
 commerce_coupon_ui.module                          |   17 +++++++++
 includes/commerce_coupon.checkout_pane.inc         |   10 +++---
 includes/views/commerce_coupon.views.inc           |    7 ++++
 .../views/commerce_coupon_ui.views_default.inc     |   37 ++++++++++++++++---
 ...ce_coupon_handler_field_coupon_order_remove.inc |   26 ++++++++++++++
 7 files changed, 109 insertions(+), 12 deletions(-)
 create mode 100644 includes/views/handlers/commerce_coupon_handler_field_coupon_order_remove.inc

diff --git a/commerce_coupon.info b/commerce_coupon.info
index a2f94b5..5d30231 100644
--- a/commerce_coupon.info
+++ b/commerce_coupon.info
@@ -17,4 +17,5 @@ files[] = classes/commerce_coupon_type.inc
 ; Views Handler
 files[] = includes/views/handlers/commerce_coupon_handler_field_coupon_granted_amount.inc
 files[] = includes/views/handlers/commerce_coupon_handler_field_coupon_operations.inc
-files[] = includes/views/handlers/commerce_coupon_handler_field_times_used.inc
\ No newline at end of file
+files[] = includes/views/handlers/commerce_coupon_handler_field_coupon_order_remove.inc
+files[] = includes/views/handlers/commerce_coupon_handler_field_times_used.inc
diff --git a/commerce_coupon.install b/commerce_coupon.install
index a244701..1f313b6 100644
--- a/commerce_coupon.install
+++ b/commerce_coupon.install
@@ -113,6 +113,14 @@ function commerce_coupon_exportable_schema_fields($module_col = 'module', $statu
 }
 
 /**
+ * Implements hook_install().
+ */
+function commerce_coupon_install() {
+  variable_set('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|checkout');
+  variable_set('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|review');
+}
+
+/**
  * Implements hook_uninstall().
  */
 function commerce_coupon_uninstall() {
@@ -252,3 +260,16 @@ function commerce_coupon_update_7005(&$sandbox) {
     $view->delete(TRUE);
   }
 }
+
+/**
+ * Implements hook_update_N().
+ * Use new "commerce_coupon_review_pane" view displays.
+ */
+function commerce_coupon_update_7006(&$sandbox) {
+  if (variable_get('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|default') == 'commerce_coupon_review_pane|default') {
+    variable_set('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|checkout');
+  }
+  if (variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default') == 'commerce_coupon_review_pane|default') {
+    variable_set('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|review');
+  }
+}
diff --git a/commerce_coupon_ui.module b/commerce_coupon_ui.module
index 9a3dee7..be23480 100644
--- a/commerce_coupon_ui.module
+++ b/commerce_coupon_ui.module
@@ -135,6 +135,14 @@ function commerce_coupon_ui_menu() {
     'weight' => 50,
   );
 
+  $items['commerce/coupons/order/remove/%commerce_coupon/%'] = array(
+    'title' => 'Delete from order',
+    'page callback' => 'commerce_coupon_ui_coupon_delete_order_form_wrapper',
+    'page arguments' => array(4, 5),
+    'access callback' => TRUE,
+    'weight' => 20,
+  );
+
   return $items;
 }
 
@@ -272,6 +280,15 @@ function commerce_coupon_ui_coupon_delete_form_wrapper($coupon) {
   return drupal_get_form('commerce_coupon_ui_delete_form', $coupon, 'delete');
 }
 
+function commerce_coupon_ui_coupon_delete_order_form_wrapper($coupon, $order_id) {
+  if ($coupon && $order_id) {
+    $order = commerce_order_load($order_id);
+    commerce_coupon_remove_coupon_from_order($order, $coupon);
+  }
+
+  drupal_goto();
+}
+
 /**
  * Sets the breadcrumb for administrative coupon pages.
  *
diff --git a/includes/commerce_coupon.checkout_pane.inc b/includes/commerce_coupon.checkout_pane.inc
index 35c6d33..2d40523 100644
--- a/includes/commerce_coupon.checkout_pane.inc
+++ b/includes/commerce_coupon.checkout_pane.inc
@@ -39,7 +39,7 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane,
   }
 
   // Extract the View and display keys from the cart contents pane setting.
-  $pane_view = variable_get('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|default');
+  $pane_view = variable_get('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|checkout');
   if ($pane_view <> 'none') {
     list($view_id, $display_id) = explode('|', $pane_view);
     if (!empty($view_id) && !empty($display_id) && views_get_view($view_id)) {
@@ -52,7 +52,7 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane,
 
   if (isset($form_state['triggering_element']) && $form_state['triggering_element']['#name'] == 'coupon_add') {
     if (!empty($form_state['values']['commerce_coupon']['coupon_add'])) {
-      list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default'));
+      list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|checkout'));
       if (!empty($view_id) && !empty($display_id)) {
         global $_commerce_coupon_validation_error_message;
         $code = $form_state['input']['commerce_coupon']['coupon_code'];
@@ -179,7 +179,7 @@ function commerce_coupon_ajax_render_alter(&$commands) {
 function commerce_coupon_pane_review($form, $form_state, $checkout_pane, $order) {
   if (!empty($order->commerce_coupon_order_reference)) {
     // Extract the View and display keys from the cart contents pane setting.
-    list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default'));
+    list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|checkout'));
 
     return commerce_embed_view($view_id, $display_id, array($order->order_id));
   }
@@ -209,7 +209,7 @@ function commerce_coupon_pane_settings_form($checkout_pane) {
     '#title' => t('Coupons Checkout Pane View'),
     '#description' => t('Specify the View to use in the checkout pane under the coupon form. Select \'none\' to not display anything.'),
     '#options' => array('none' => t('None')) + $options,
-    '#default_value' => variable_get('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|default'),
+    '#default_value' => variable_get('commerce_coupon_checkout_pane_view', 'commerce_coupon_review_pane|checkout'),
   );
 
   $form['commerce_coupon_review_pane_view'] = array(
@@ -217,7 +217,7 @@ function commerce_coupon_pane_settings_form($checkout_pane) {
     '#title' => t('Coupons Review Pane View'),
     '#description' => t('Specify the View to use in the review pane to display the coupons.'),
     '#options' => $options,
-    '#default_value' => variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default'),
+    '#default_value' => variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|checkout'),
   );
 
   $form['commerce_coupon_checkout_enable_add_button'] = array(
diff --git a/includes/views/commerce_coupon.views.inc b/includes/views/commerce_coupon.views.inc
index 01c9878..d8ba316 100644
--- a/includes/views/commerce_coupon.views.inc
+++ b/includes/views/commerce_coupon.views.inc
@@ -33,5 +33,12 @@ function commerce_coupon_views_data_alter(&$data) {
         'click sortable' => TRUE,
       ),
     );
+    $data['commerce_coupon']['remove_from_order'] = array(
+      'field' => array(
+        'title' => t('Remove from Order'),
+        'help' => t('Remove coupon from the order.'),
+        'handler' => 'commerce_coupon_handler_field_coupon_order_remove',
+      ),
+    );
   }
 }
diff --git a/includes/views/commerce_coupon_ui.views_default.inc b/includes/views/commerce_coupon_ui.views_default.inc
index 5f670c2..46a84f8 100644
--- a/includes/views/commerce_coupon_ui.views_default.inc
+++ b/includes/views/commerce_coupon_ui.views_default.inc
@@ -171,8 +171,9 @@ function commerce_coupon_ui_views_default_views() {
   $view->api_version = '3.0';
   $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
 
-  /* Display: Master */
+  /* Display: Defaults */
   $handler = $view->new_display('default', 'Defaults', 'default');
+  $handler->display->display_options['use_more_always'] = FALSE;
   $handler->display->display_options['access']['type'] = 'perm';
   $handler->display->display_options['access']['perm'] = 'administer coupons';
   $handler->display->display_options['cache']['type'] = 'none';
@@ -224,6 +225,11 @@ function commerce_coupon_ui_views_default_views() {
   $handler->display->display_options['fields']['granted_amount']['id'] = 'granted_amount';
   $handler->display->display_options['fields']['granted_amount']['table'] = 'commerce_coupon';
   $handler->display->display_options['fields']['granted_amount']['field'] = 'granted_amount';
+  /* Field: Commerce Coupon: Remove from Order */
+  $handler->display->display_options['fields']['remove_from_order']['id'] = 'remove_from_order';
+  $handler->display->display_options['fields']['remove_from_order']['table'] = 'commerce_coupon';
+  $handler->display->display_options['fields']['remove_from_order']['field'] = 'remove_from_order';
+  $handler->display->display_options['fields']['remove_from_order']['label'] = 'Actions';
   /* Contextual filter: Commerce Order: Order ID */
   $handler->display->display_options['arguments']['order_id']['id'] = 'order_id';
   $handler->display->display_options['arguments']['order_id']['table'] = 'commerce_order';
@@ -234,11 +240,30 @@ function commerce_coupon_ui_views_default_views() {
   $handler->display->display_options['arguments']['order_id']['summary']['format'] = 'default_summary';
   $handler->display->display_options['arguments']['order_id']['summary_options']['items_per_page'] = '25';
 
-  /* Sort criterion: Commerce Coupon: Date updated */
-  $handler->display->display_options['sorts']['changed']['id'] = 'changed';
-  $handler->display->display_options['sorts']['changed']['table'] = 'commerce_coupon';
-  $handler->display->display_options['sorts']['changed']['field'] = 'changed';
-  $handler->display->display_options['sorts']['changed']['order'] = 'DESC';
+  /* Display: Checkout */
+  $handler = $view->new_display('block', 'Checkout', 'checkout');
+  $handler->display->display_options['defaults']['hide_admin_links'] = FALSE;
+
+  /* Display: Review */
+  $handler = $view->new_display('block', 'Review', 'review');
+  $handler->display->display_options['defaults']['hide_admin_links'] = FALSE;
+  $handler->display->display_options['defaults']['fields'] = FALSE;
+  /* Field: Commerce Order: Order ID */
+  $handler->display->display_options['fields']['order_id']['id'] = 'order_id';
+  $handler->display->display_options['fields']['order_id']['table'] = 'commerce_order';
+  $handler->display->display_options['fields']['order_id']['field'] = 'order_id';
+  $handler->display->display_options['fields']['order_id']['relationship'] = 'reverse_commerce_coupon_order_reference_commerce_order';
+  $handler->display->display_options['fields']['order_id']['label'] = '';
+  $handler->display->display_options['fields']['order_id']['exclude'] = TRUE;
+  $handler->display->display_options['fields']['order_id']['element_label_colon'] = FALSE;
+  /* Field: Commerce Coupon: Coupon Code */
+  $handler->display->display_options['fields']['commerce_coupon_code']['id'] = 'commerce_coupon_code';
+  $handler->display->display_options['fields']['commerce_coupon_code']['table'] = 'field_data_commerce_coupon_code';
+  $handler->display->display_options['fields']['commerce_coupon_code']['field'] = 'commerce_coupon_code';
+  /* Field: Commerce Coupon: Granted amount */
+  $handler->display->display_options['fields']['granted_amount']['id'] = 'granted_amount';
+  $handler->display->display_options['fields']['granted_amount']['table'] = 'commerce_coupon';
+  $handler->display->display_options['fields']['granted_amount']['field'] = 'granted_amount';
 
   $views[$view->name] = $view;
 
diff --git a/includes/views/handlers/commerce_coupon_handler_field_coupon_order_remove.inc b/includes/views/handlers/commerce_coupon_handler_field_coupon_order_remove.inc
new file mode 100644
index 0000000..2c65904
--- /dev/null
+++ b/includes/views/handlers/commerce_coupon_handler_field_coupon_order_remove.inc
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * Field for removing a commerce coupon line item.
+ */
+class commerce_coupon_handler_field_coupon_order_remove extends views_handler_field {
+  function construct() {
+    parent::construct();
+
+    $this->additional_fields['coupon_id'] = 'coupon_id';
+  }
+
+  function query() {
+    $this->ensure_my_table();
+    $this->add_additional_fields();
+  }
+
+  function render($values) {
+    $coupon_id = $this->get_value($values, 'coupon_id');
+    return l(
+      t('Remove'),
+      'commerce/coupons/order/remove/'.$coupon_id.'/'.$values->commerce_coupon_order_reference_commerce_coupon_order_id,
+      array('query' => array('destination' => current_path()))
+    );
+  }
+}
-- 
1.7.2.5

