From 884580b294586c1d0fe0b5de4993a3384c8a1270 Mon Sep 17 00:00:00 2001
From: jucallme <jucallme@gmail.com>
Date: Mon, 2 Apr 2012 12:45:00 -0300
Subject: [PATCH 1/2] current status

---
 commerce_coupon.module                     |    1 -
 commerce_coupon.rules.inc                  |   60 ++++++++++++++++++++++++++
 commerce_coupon.rules_defaults.inc         |   63 ++++++++++++++++++++++++++++
 includes/commerce_coupon.checkout_pane.inc |   50 ++++++++++++++++++----
 4 files changed, 164 insertions(+), 10 deletions(-)

diff --git a/commerce_coupon.module b/commerce_coupon.module
index 52a29fc..2647f8a 100644
--- a/commerce_coupon.module
+++ b/commerce_coupon.module
@@ -799,7 +799,6 @@ function commerce_coupon_log_load_by_order_and_coupon($order_id, $commerce_coupo
  */
 function commerce_coupon_log_save(CommerceCouponLog $log) {
   $log->changed = REQUEST_TIME;
-  ;
   return $log->save();
 }
 
diff --git a/commerce_coupon.rules.inc b/commerce_coupon.rules.inc
index d825df5..83ea8ff 100644
--- a/commerce_coupon.rules.inc
+++ b/commerce_coupon.rules.inc
@@ -103,6 +103,33 @@ function commerce_coupon_rules_action_info() {
     ),
   );
 
+  $actions['commerce_coupon_action_set_granted_percent_amount'] = array(
+    'label' => t('Set granted coupon amount'),
+    'parameter' => array(
+      'commerce_coupon_log' => array(
+        'type' => 'commerce_coupon_log',
+        'label' => t('Commerce Coupon Log'),
+      ),
+      'percent' => array(
+        'type' => 'decimal',
+        'label' => t('Percent Amount'),
+      ),
+      'amount' => array(
+        'type' => 'decimal',
+        'label' => t('Balance Amount'),
+      ),
+      'currency_code' => array(
+        'type' => 'text',
+        'label' => t('Currency Code'),
+      ),
+    ),
+    'group' => t('Commerce Coupon'),
+    'base' => 'commerce_coupon_action_is_invalid_coupon',
+    'callbacks' => array(
+      'execute' => 'commerce_coupon_action_set_granted_percent_amount',
+    ),
+  );
+
   $actions['commerce_coupon_action_get_coupons_for_order'] = array(
     'label' => t('Get coupons for order'),
     'parameter' => array(
@@ -245,6 +272,39 @@ function commerce_coupon_action_set_granted_amount($commerce_coupon_log, $amount
 
 }
 
+function commerce_coupon_action_set_granted_percent_amount($commerce_coupon_log, $percent, $amount, $currency_code) {
+  if (!($commerce_coupon_log instanceof EntityMetadataWrapper)) {
+    $commerce_coupon_log = entity_metadata_wrapper('commerce_coupon_log', $commerce_coupon_log);
+  }
+
+  $coupon = $commerce_coupon_log->coupon;
+
+  // Get the price component to use in this price.
+  $price_component_name = 'commerce_coupon_' . $coupon->type;
+  drupal_alter('commerce_coupon_price_component_name', $price_component_name, $coupon);
+
+  // Set the unit price on the line item object.
+  $commerce_coupon_log->commerce_granted_amount->amount = ($amount * $percent / 100);
+  $commerce_coupon_log->commerce_granted_amount->currency_code = $currency_code;
+
+
+  // Add the base price to the components array.
+  if (!commerce_price_component_load($commerce_coupon_log->commerce_granted_amount->value(), $price_component_name)) {
+    $commerce_coupon_log->commerce_granted_amount->data = commerce_price_component_add(
+      $commerce_coupon_log->commerce_granted_amount->value(),
+      $price_component_name,
+      $commerce_coupon_log->commerce_granted_amount->value(),
+      TRUE,
+      FALSE
+    );
+  }
+
+  commerce_coupon_log_save($commerce_coupon_log->value());
+
+
+}
+
+
 function commerce_coupon_action_get_coupons_for_order($commerce_coupon) {
   if (!$commerce_coupon) {
     return array();
diff --git a/commerce_coupon.rules_defaults.inc b/commerce_coupon.rules_defaults.inc
index 8f039e1..ddfab41 100644
--- a/commerce_coupon.rules_defaults.inc
+++ b/commerce_coupon.rules_defaults.inc
@@ -49,5 +49,68 @@ function commerce_coupon_default_rules_configuration() {
   ));
   $rules['commerce_coupon_basic_validate_uses_of_coupon'] = $rule;
 
+
+  // Create fixed amount rule
+  $rule = rules_reaction_rule(array(), array(
+    'commerce_coupon_line_item' => array(
+      'type' => 'commerce_coupon_line_item',
+      'label' => 'commerce coupon line item')
+    )
+  );
+
+  $rule->label = t('Calculate coupon with fixed amount');
+  $rule->active = TRUE;
+
+  $rule
+  ->event('commerce_coupon_redeem')
+  ->condition('entity_has_field', array('entity:select' => 'coupon', 'field' => 'commerce_coupon_fixed_amount'))
+  ->condition(rules_and()->condition('data_is_empty', array('data:select' => 'coupon:commerce-coupon-fixed-amount'))->negate() )
+  ->condition('data_is', array('data:select' => 'coupon:commerce-coupon-fixed-amount:amount', 'op' => '>', 'value' => 0))
+  ->action('commerce_coupon_action_create_coupon_line_item', array(
+    'commerce_coupon:select' => 'coupon',
+    'commerce_order:select' => 'commerce-order',
+    'amount:select' => 'coupon:commerce-coupon-fixed-amount:amount',
+    'currency_code:select' => 'coupon:commerce-coupon-fixed-amount:currency-code'
+  ))
+  ->action('commerce_coupon_action_set_granted_amount', array(
+    'commerce_coupon_log:select' => 'coupon-log',
+    'amount:select' => 'coupon:commerce-coupon-fixed-amount:amount',
+    'currency_code:select' => 'coupon:commerce-coupon-fixed-amount:currency-code'
+  ));
+
+  $rules['commerce_coupon_basic_fixed_amount'] = $rule;
+
+
+  // Create percent amount rule
+  $rule = rules_reaction_rule(array(), array(
+    'commerce_coupon_line_item' => array(
+      'type' => 'commerce_coupon_line_item',
+      'label' => 'commerce coupon line item')
+    )
+  );
+
+  $rule->label = t('Calculate coupon with percent amount');
+  $rule->active = TRUE;
+
+  $rule
+  ->event('commerce_coupon_redeem')
+  ->condition('entity_has_field', array('entity:select' => 'coupon', 'field' => 'commerce_coupon_percent_amount'))
+  ->condition(rules_and()->condition('data_is_empty', array('data:select' => 'coupon:commerce-coupon-percent-amount'))->negate() )
+  ->condition('data_is', array('data:select' => 'coupon:commerce-coupon-percent-amount', 'op' => '>', 'value' => 0))
+  ->action('commerce_coupon_action_create_coupon_line_item', array(
+    'commerce_coupon:select' => 'coupon',
+    'commerce_order:select' => 'commerce-order',
+    'amount:select' => 'coupon:commerce-coupon-percent-amount',
+    'currency_code:select' => 'commerce-order:commerce-order-total:currency-code'
+  ))
+  ->action('commerce_coupon_action_set_granted_percent_amount', array(
+    'commerce_coupon_log:select' => 'coupon-log',
+    'percent:select' => 'coupon:commerce-coupon-percent-amount',
+    'amount:select' => 'commerce-order:commerce-order-total:amount',
+    'currency_code:select' => 'commerce-order:commerce-order-total:currency-code'
+  ));
+
+  $rules['commerce_coupon_basic_percent_amount'] = $rule;
+
   return $rules;
 }
diff --git a/includes/commerce_coupon.checkout_pane.inc b/includes/commerce_coupon.checkout_pane.inc
index 9fe3096..a2b30aa 100644
--- a/includes/commerce_coupon.checkout_pane.inc
+++ b/includes/commerce_coupon.checkout_pane.inc
@@ -12,7 +12,8 @@
  */
 function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane, $order) {
   $pane_form = array();
-
+  $pane_form['#prefix'] = '<div id="coupon-call-back">';
+  $pane_form['#suffix'] = '</div>';
   // Store the payment methods in the form for validation purposes.
   $pane_form['coupon_code'] = array(
     '#type' => 'textfield',
@@ -20,6 +21,21 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane,
     '#description' => t('Enter here your coupon code.'),
   );
 
+  $pane_form['coupon_add'] = array(
+    '#type' => 'button',
+    '#value' => t('Add coupon'),
+    '#ajax' => array(
+      'callback' => 'commerce_coupon_add_coupon_callback',
+      'wrapper' => 'coupon-call-back',
+    ),
+    "#limit_validation_errors" => array(),
+  );
+
+  $pane_form['order'] = array(
+    '#type' => 'value',
+    '#value' => $order
+  );
+
   // 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'));
   if (!empty($view_id) && !empty($display_id)) {
@@ -32,6 +48,29 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane,
   return $pane_form;
 }
 
+/**
+ * Callback for the ajax button coupon_add.
+ */
+function commerce_coupon_add_coupon_callback($form, &$form_state) {
+  list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default'));
+  if (!empty($view_id) && !empty($display_id)) {
+    //dsm($form_state['values']['commerce_coupon']);
+    $order = $form_state['values']['commerce_coupon']['order'];
+    $code =  $form_state['values']['commerce_coupon']['coupon_code'];
+    if (!empty($code) && commerce_coupon_code_is_valid($code, $order)) {
+      $coupon = commerce_coupon_load_by_code($code);
+      commerce_coupon_redeem_coupon($coupon, $order);
+      // clear the value, as we dont want errors when the user hits submit on fnal check out, as we would try add the value in the field again.
+      $form['commerce_coupon']['coupon_code']['#value'] = '';
+    }
+    else {
+      drupal_set_message(t('Your coupon code is not valid.'), 'error');
+    }
+    $form['commerce_coupon']['redeemed_coupons']['#markup'] = '<div id="coupon-call-back">' . commerce_embed_view($view_id, $display_id, array($order->order_id)) . '</div>';
+  }
+  return $form['commerce_coupon'];
+}
+
 function commerce_coupon_pane_checkout_form_validate($form, &$form_state, $checkout_pane, $order) {
   //@todo I think global function should start and end with an underscore
   global $commerce_coupon_validation_error_message;
@@ -56,10 +95,8 @@ function commerce_coupon_pane_checkout_form_validate($form, &$form_state, $check
     form_set_error('commerce_coupon][coupon_code', $message);
     return FALSE;
   }
-
 }
 
-
 function commerce_coupon_pane_checkout_form_submit($form, &$form_state, $checkout_pane, $order) {
   if ($code = $form_state['values']['commerce_coupon']['coupon_code']) {
     $commerce_coupon = commerce_coupon_load_by_code($code);
@@ -67,8 +104,6 @@ function commerce_coupon_pane_checkout_form_submit($form, &$form_state, $checkou
   }
 }
 
-
-
 /**
  * Implements the callback for the checkout pane review form
  */
@@ -80,8 +115,6 @@ function commerce_coupon_pane_review($form, $form_state, $checkout_pane, $order)
   return commerce_embed_view($view_id, $display_id, array($order->order_id));
 }
 
-
-
 /**
  * Checkout pane callback: returns the cart contents pane's settings form.
  */
@@ -118,5 +151,4 @@ function commerce_coupon_pane_settings_form($checkout_pane) {
   );
 
   return $form;
-}
-
+}
\ No newline at end of file
-- 
1.7.5.4


From d98ee8f08894ea7ac77052b2b471a4677ff370d1 Mon Sep 17 00:00:00 2001
From: jucallme <jucallme@gmail.com>
Date: Mon, 2 Apr 2012 12:46:24 -0300
Subject: [PATCH 2/2] current status

---
 includes/commerce_coupon.checkout_pane.inc |    1 -
 1 files changed, 0 insertions(+), 1 deletions(-)

diff --git a/includes/commerce_coupon.checkout_pane.inc b/includes/commerce_coupon.checkout_pane.inc
index a2b30aa..b14ba8f 100644
--- a/includes/commerce_coupon.checkout_pane.inc
+++ b/includes/commerce_coupon.checkout_pane.inc
@@ -54,7 +54,6 @@ function commerce_coupon_pane_checkout_form($form, &$form_state, $checkout_pane,
 function commerce_coupon_add_coupon_callback($form, &$form_state) {
   list($view_id, $display_id) = explode('|', variable_get('commerce_coupon_review_pane_view', 'commerce_coupon_review_pane|default'));
   if (!empty($view_id) && !empty($display_id)) {
-    //dsm($form_state['values']['commerce_coupon']);
     $order = $form_state['values']['commerce_coupon']['order'];
     $code =  $form_state['values']['commerce_coupon']['coupon_code'];
     if (!empty($code) && commerce_coupon_code_is_valid($code, $order)) {
-- 
1.7.5.4

