From 10a5eb6130df82f3129837a738e9d20830d2cac7 Mon Sep 17 00:00:00 2001
From: Tom Kirkpatrick <tom@systemseed.com>
Date: Sat, 14 Apr 2012 17:32:13 +0200
Subject: [PATCH] Add support for commerce+coupon (thanks raystuart)

---
 commerce_coupon_type.features.inc |   99 +++++++++++++++++++++++++++++++++++++
 commerce_features.module          |   15 ++++++
 2 files changed, 114 insertions(+), 0 deletions(-)
 create mode 100644 commerce_coupon_type.features.inc

diff --git a/commerce_coupon_type.features.inc b/commerce_coupon_type.features.inc
new file mode 100644
index 0000000..34a8469
--- /dev/null
+++ b/commerce_coupon_type.features.inc
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * Implements hook_features_export().
+ */
+function commerce_coupon_type_features_export($data, &$export, $module_name = '') {
+  $pipe = array();
+
+  $map = features_get_default_map('commerce_coupon_type');
+  $export['dependencies']['features'] = 'features';
+  $export['dependencies']['commerce_features'] = 'commerce_features';
+  $export['dependencies']['commerce_tax_ui'] = 'commerce_coupon';
+  
+  $info = commerce_coupon_get_types();
+  foreach ($data as $type) {
+    $export['dependencies'][$info[$type]->module] = $info[$type]->module;
+    $export['features']['commerce_coupon_type'][$type] = $type;
+
+    $fields = field_info_instances('commerce_coupon', $type);
+    foreach ($fields as $name => $field) {
+      $pipe['field'][] = "commerce_coupon-{$field['bundle']}-{$field['field_name']}";
+    }
+  }
+
+  return $pipe;
+}
+
+/**
+ * Implements hook_features_export_options().
+ */
+function commerce_coupon_type_features_export_options() {
+  $feature_types = array();
+  $coupon_types = commerce_coupon_get_types();
+  if (!empty($coupon_types)) {
+    foreach($coupon_types as $type) {
+      $feature_types[$type->type] = $type->label;
+    }
+  }
+  return $feature_types;
+}
+
+/**
+ * Implements hook_features_export_render().
+ */
+function commerce_coupon_type_features_export_render($module, $data, $export = NULL) {
+  $info = commerce_coupon_get_types();
+  $output = array();
+  $output[] = '  $items = array(';
+  foreach ($data as $type) {
+    if (isset($info[$type]) && $coupon_type = $info[$type]) {
+      $output[] = "    '{$type}' => array(";
+      foreach($coupon_type as $key => $value) {
+        $output[] = "    '{$key}' => " . features_var_export($value, '    ') . ",";
+      }
+      $output[] = "    ),";
+    }
+  }
+  $output[] = '  );';
+  $output[] = '  return $items;';
+  $output = implode("\n", $output);
+  return array('commerce_coupon_default_types' => $output);
+}
+
+/**
+ * Implements hook_features_revert().
+ */
+function commerce_coupon_type_features_revert($module = NULL) {
+  // Get default coupon types
+  if (module_hook($module, 'commerce_coupon_default_types')) {
+    $default_types = module_invoke($module, 'commerce_coupon_default_types');
+    $existing_types = commerce_coupon_get_types();
+    foreach ($default_types as $type) {
+      // Add / or update
+      if (!isset($existing_types[$type['type']])) {
+        $type['is_new'] = TRUE;
+      }
+      // Use UI function because it provides already the logic we need
+      $type = new CommerceCouponType($type);
+      module_invoke('commerce_coupon', 'type_save', $type);
+    }
+  }
+  else {
+    drupal_set_message(t('Could not load default coupon types.'), 'error');
+    return FALSE;
+  }
+
+  // Re-Cache
+  //commerce_coupon_types_reset();
+
+  menu_rebuild();
+  return TRUE;
+}
+
+/**
+ * Implements hook_features_rebuild().
+ */
+function commerce_coupon_type_features_rebuild($module) {
+  return commerce_coupon_type_features_revert($module);
+}
diff --git a/commerce_features.module b/commerce_features.module
index bb74d7d..6af9d2a 100644
--- a/commerce_features.module
+++ b/commerce_features.module
@@ -42,6 +42,14 @@ function commerce_features_features_api() {
       'file' => drupal_get_path('module', 'commerce_features') . '/commerce_line_item_type.features.inc',
     );
   }
+  if (module_exists('commerce_coupon')) {
+    $features['commerce_coupon_type'] = array(
+      'name' => t('Commerce coupon types'),
+      'features_source' => TRUE,
+      'default_hook' => 'commerce_coupon_default_types',
+      'file' => drupal_get_path('module', 'commerce_features') . '/commerce_coupon_type.features.inc',
+    );
+  }
 
   return $features;
 }
@@ -86,6 +94,13 @@ function commerce_features_menu_alter(&$items) {
       unset($items['admin/commerce/config/line-items/' . $type_arg . '/delete']);
     }
   }
+
+  foreach (module_implements('commerce_coupon_default_types') as $module) {
+    foreach (module_invoke($module, 'commerce_coupon_default_types') as $type => $coupon_type) {
+      $type_arg = strtr($type, '_', '-');
+      unset($items['admin/commerce/coupons/types/' . $type_arg . '/delete']);
+    }
+  }
 }
 
 /**
-- 
1.7.4.4

