Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?php
function commerce_coupon_rules_event_info() {
$events = array();
$events['commerce_coupon_validate'] = array(
'label' => t('Validate a coupon'),
'group' => t('Commerce Coupon'),
'variables' => array(
'coupon' => array('type' => 'commerce_coupon', 'label' => t('commerce coupon to validate')),
) + commerce_order_rules_event_variables(t('Order', array(), array('context' => 'a drupal commerce order'))),
'access callback' => 'commerce_order_rules_access',
);
$events['commerce_coupon_validated'] = array(
'label' => t('A coupon is validated'),
'group' => t('Commerce Coupon'),
'variables' => array(
'coupon' => array('type' => 'commerce_coupon', 'label' => t('commerce coupon to validate')),
) + commerce_order_rules_event_variables(t('Order', array(), array('context' => 'a drupal commerce order'))),
'access callback' => 'commerce_order_rules_access',
);
return $events;
}
/**
* Implements hook_rules_action_info().
*/
function commerce_coupon_rules_action_info() {
$actions = array();
$actions['commerce_coupon_is_valid'] = array(
'label' => t('Set coupon as valid'),
'parameter' => array(
'override' => array(
'type' => 'boolean',
'label' => t('Override'),
'description' => t('Normaly the validation result is concatenated by an AND operator. Here you can bypass this and set the value to true.'),
),
),
'group' => t('Commerce Coupon'),
'base' => 'commerce_coupon_valid_action',
'callbacks' => array(
'execute' => 'commerce_coupon_action_is_valid_coupon',
),
);
$actions['commerce_coupon_is_invalid'] = array(
'label' => t('Set coupon as invalid'),
'group' => t('Commerce Coupon'),
'base' => 'commerce_coupon_invalid_action',
'callbacks' => array(
'execute' => 'commerce_coupon_action_is_invalid_coupon',
),
);
$actions['commerce_coupon_apply_to_item_line'] = array(
'label' => t('Apply a coupon to a line item'),
'parameter' => array(
'line_item' => array(
'type' => 'commerce_line_item',
'label' => t('Line item'),
),
'coupon' => array(
'type' => 'commerce_coupon',
'label' => t('Coupon'),
),
),
'group' => t('Commerce Coupon'),
);
$actions['commerce_coupon_calculate_percentage_amount'] = array(
'label' => t('Calculates a percentage coupon amount'),
'parameter' => array(
'line_item' => array(
'type' => 'commerce_line_item',
'label' => t('Line item'),
),
),
'group' => t('Commerce Coupon'),
);
return $actions;
}
function commerce_coupon_action_is_valid_coupon($override = false) {
$validation_results = &drupal_static('commerce_coupon_action_validation_results');
if(isset($validation_results) && $override == false) {
$validation_results = $validation_results && true;
}
else {
$validation_results[$commerce_coupon->coupon_id] = true;
}
}
function commerce_coupon_action_is_invalid_coupon($commerce_coupon) {
$validation_results = &drupal_static('commerce_coupon_action_validation_results');
$validation_results = false;
}
function commerce_coupon_calculate_percentage_amount($line_item) {
$order_id = $line_item->order_id;
$coupons = commerce_coupon_get_coupons_by_order($order_id);
$components = rules_get_components(FALSE, 'action');
foreach($coupons as $coupon) {
$coupon = entity_metadata_wrapper('commerce_coupon', $coupon);
$component_name = 'commerce_coupon_apply_' . $coupon->type->value() . '_to_item_line';
if($coupon->is_percentage->value() && isset($components[$component_name])) {
// Invoke it with the line item.
rules_invoke_component($component_name, $line_item, $coupon);
}
}
}
function commerce_coupon_apply_to_item_line($line_item, $coupon) {
if(!($coupon instanceof EntityMetadataWrapper)) {
$coupon = entity_metadata_wrapper('commerce_coupon', $coupon);
}
if($coupon->is_percentage->value()) {
$line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
$rate = $coupon->amount->value();
if($rate > 1) {
// Ensure that the rate is never bigger then 100%
$rate = $rate / 100;
}
// TODO: Ensure that the coupon is only applied once!
// Update the data array with the tax component.
$line_item_wrapper->commerce_unit_price->data = commerce_price_component_add(
$line_item_wrapper->commerce_unit_price->value(),
'commerce_coupon_' . $coupon->type->value(),
// TODO: Replace the calcuation by a callback method of the type
array(
'amount' => $line_item_wrapper->commerce_unit_price->amount->value() * $rate * -1,
'currency_code' => $line_item_wrapper->commerce_unit_price->currency_code->value(),
'data' => array(
'coupon' => array(
'coupon_id' => $coupon->coupon_id->value(),
'type' => $coupon->type->value(),
'rate' => $rate,
'code' => $coupon->code->value(),
),
),
),
false
);
}
}