MaxicycleCom_Connector - Version 1.0.5

Version Notes

v1.0.5
Added compatibility with Klarna
v1.0.4
Fixed bug in PHP 5.4
v1.0.3
Refresh caching
Fix bug when having a multi store setup for SKU check

v1.0.2
Bug fix release

v1.0.1
Stability improvements
Logging into separate logfile

v.1.0.0
* Initial official release

Download this release

Release Info

Developer Maxicycle Software GmbH
Extension MaxicycleCom_Connector
Version 1.0.5
Comparing to
See all releases


Code changes from version 1.0.4 to 1.0.5

app/code/community/Maxicycle/Connector/Helper/Data.php CHANGED
@@ -20,6 +20,7 @@ class Maxicycle_Connector_Helper_Data extends Mage_Core_Helper_Abstract {
20
  $order_costs_key = 'maxicycle/maxicycle_option/order_costs';
21
  $product_costs_type_key = 'maxicycle/maxicycle_option/product_costs_type';
22
  $valid_statuses_key = 'maxicycle/maxicycle_option/valid_statuses';
 
23
 
24
  return array(
25
  'is_enable' => Mage::getStoreConfig($is_enable_key, $store_id),
@@ -30,7 +31,8 @@ class Maxicycle_Connector_Helper_Data extends Mage_Core_Helper_Abstract {
30
  'use_tax' => Mage::getStoreConfig($use_tax_key, $store_id),
31
  'use_shipping' => Mage::getStoreConfig($use_shipping_key, $store_id),
32
  'order_costs' => Mage::getStoreConfig($order_costs_key, $store_id),
33
- 'valid_statuses' => explode(',', Mage::getStoreConfig($valid_statuses_key, $store_id))
 
34
  );
35
  }
36
 
20
  $order_costs_key = 'maxicycle/maxicycle_option/order_costs';
21
  $product_costs_type_key = 'maxicycle/maxicycle_option/product_costs_type';
22
  $valid_statuses_key = 'maxicycle/maxicycle_option/valid_statuses';
23
+ $add_during_checkout_key = 'maxicycle/maxicycle_option/add_during_checkout';
24
 
25
  return array(
26
  'is_enable' => Mage::getStoreConfig($is_enable_key, $store_id),
31
  'use_tax' => Mage::getStoreConfig($use_tax_key, $store_id),
32
  'use_shipping' => Mage::getStoreConfig($use_shipping_key, $store_id),
33
  'order_costs' => Mage::getStoreConfig($order_costs_key, $store_id),
34
+ 'valid_statuses' => explode(',', Mage::getStoreConfig($valid_statuses_key, $store_id)),
35
+ 'add_during_checkout' => Mage::getStoreConfig($add_during_checkout_key, $store_id)
36
  );
37
  }
38
 
app/code/community/Maxicycle/Connector/Model/Observer.php CHANGED
@@ -7,13 +7,13 @@
7
  * @package Maxicycle_Connector
8
  * @copyright Copyright (c) 2015 (http://www.maxicycle.com)
9
  */
10
- class Maxicycle_Connector_Model_Observer {
11
 
12
  var $_db = null;
13
  var $_dbResource = null;
14
  var $_now = '';
15
  var $_config = array();
16
-
17
  public function __construct() {
18
  $this->_db = Mage::getSingleton('core/resource')->getConnection('core_write');
19
  $this->_dbResource = Mage::getSingleton('core/resource');
@@ -21,96 +21,135 @@ class Maxicycle_Connector_Model_Observer {
21
  }
22
 
23
  private function setConfig($store_id) {
24
- $this->_config = Mage::helper('maxicycle')->getConfiguration($store_id);
25
  }
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  // add PRODUCT after order placement
28
- public function sales_order_place_after($observer) {
 
 
 
29
  try {
30
  $order = $observer->getOrder();
31
  $this->setConfig($order->getStoreId());
32
- if (intval($this->_config['is_enable'])) {
33
- Mage::log('MAXICYCLE: adding product to order', null, 'maxicycle.log');
34
- $active_campaigns = $this->_db->fetchAll("SELECT * FROM " . $this->_dbResource->getTableName('maxicycle/campaigns') . " WHERE campaign_start <= '$this->_now' AND response_time_end >= '$this->_now' AND store_id = " . Mage::app()->getStore()->getId());
35
  // If there is some active campaign
36
  if (count($active_campaigns) > 0) {
37
- Mage::log('MAXICYCLE: active campaigns, checking for product to add', null, 'maxicycle.log');
38
  // Loop over active campaings
39
  foreach ($active_campaigns as $campaign) {
40
  // add product to Order
41
- $this->addProductToOrder($order, $campaign);
42
  // Set campaign_id to order
43
  $order->setMaxicycleCampaignId($campaign['campaign_id']);
44
  $maxicycle_customer_id = $this->setCustomerIdToOrder($order, $campaign);
45
  // check and mark if order is response order
46
- $response_to_order_id = $this->checkIfResponseOrder($order, $maxicycle_customer_id, $campaign);
47
  }
48
  } else {
49
- Mage::log('MAXICYCLE: No active campaigns, not adding a product', null, 'maxicycle.log');
50
  }
51
  } else {
52
- Mage::log('MAXICYCLE: module disabled', null, 'maxicycle.log');
53
  }
54
  }
55
  catch(Exception $e) {
56
  Mage::log('Order Place After Exception: ' .$e->getMessage(), null, 'maxicycle.log');
57
- }
58
  }
 
59
 
60
- public function sales_order_save_after($observer) {
 
61
  try {
62
  $order = $observer->getOrder();
63
  $this->setConfig($order->getStoreId());
64
- Mage::log('MAXICYCLE: after save hook for order:' . $order->getEntityId(), null, 'maxicycle.log');
65
  //Mage::log(json_encode($this->_config), null, 'maxicycle.log');
66
  //Mage::log($this->_config['valid_statuses'], null, 'maxicycle.log');
67
  // Check if Maxicycle is active and a valid status
68
  if ($this->shouldExport($order)) {
69
- Mage::log('MAXICYCLE: valid status: ' . $order->getStatus(), null, 'maxicycle.log');
70
  // Load order info
71
- Mage::log('MAXICYCLE: Order ID ' . $order->getEntityId(), null, 'maxicycle.log');
72
- Mage::log('MAXICYCLE: valid status: ' . $order->getStatus(), null, 'maxicycle.log');
73
  // Get all active campaigns
74
- // Mage::log('MAXICYCLE: Current Store ' . $order->getStoreId(), null, 'maxicycle.log');
75
  // TODO: refactor this, order has campaign id already
76
  $active_campaigns = $this->_db->fetchAll("SELECT * FROM " . $this->_dbResource->getTableName('maxicycle/campaigns') .
77
  " WHERE campaign_start <= '$this->_now' AND response_time_end >= '$this->_now' AND store_id = " . $order->getStoreId());
78
  // If there are some active campaigns
79
  if (count($active_campaigns) > 0) {
80
- Mage::log('MAXICYCLE: active campaigns', null, 'maxicycle.log');
81
  // Loop over active campaings
82
  foreach ($active_campaigns as $campaign) {
83
  $this->exportToResults($order, $campaign);
84
  }
85
  } else {
86
- Mage::log('MAXICYCLE: No active campaigns', null, 'maxicycle.log');
87
  }
88
  } else {
89
  # do nothing
90
- Mage::log('MAXICYCLE: module disabled or invalid status', null, 'maxicycle.log');
91
  }
92
  }
93
  catch(Exception $e) {
94
  Mage::log('Order Save After Exception: ' .$e->getMessage(), null, 'maxicycle.log');
95
  }
96
  }
97
-
98
- public function testCondition($condition_code, $value, $order) {
99
- if ($condition_code == 'treatment_group_size') {
100
- // Generate random number
101
- $random_number = rand(0, 100);
102
- // Log random number for overview
103
- Mage::log('MAXICYCLE: Random number for order #' . $order->getIncrementId() . ' was: ' . $random_number, null, 'maxicycle.log');
104
- if ($random_number <= $value) {
105
- return true;
106
- } else {
107
- return false;
108
- }
109
- }
110
  }
111
 
112
  private function exportToResults($order, $campaign) {
113
- Mage::log('MAXICYCLE: Starting Export', null, 'maxicycle.log');
114
  $order_id = $order->getIncrementId();
115
  // check if already exported
116
  $previous_order_exists = $this->_db->fetchAll("SELECT order_id FROM " .
@@ -119,10 +158,10 @@ class Maxicycle_Connector_Model_Observer {
119
  " AND order_id = ". $order_id ." LIMIT 1");
120
 
121
  if (count($previous_order_exists) == 1) {
122
- Mage::log('MAXICYCLE: Order already exported: ' . $order->getIncrementId(), null, 'maxicycle.log');
123
  } else {
124
 
125
- Mage::log('MAXICYCLE: exporting status: ' . $order->getStatus(), null, 'maxicycle.log');
126
 
127
  // no idea why we do this, but we check and set the customer id to the order
128
  $maxicycle_customer_id = $order->getMaxicycleCustomerId();
@@ -148,9 +187,9 @@ class Maxicycle_Connector_Model_Observer {
148
  // Save order data into Maxicycle orders table
149
  try {
150
  $result = Mage::getModel('maxicycle/results')->setData($data)->save();
151
- Mage::log('MAXICYCLE: Result: ' . $result->getId(), null, 'maxicycle.log');
152
  } catch (Exception $e) {
153
- Mage::log('MAXICYCLE: ERROR: ' . $e->getMessage(), null, 'maxicycle.log');
154
  }
155
  }
156
  }
@@ -166,13 +205,13 @@ class Maxicycle_Connector_Model_Observer {
166
 
167
  $maxicycle_customer_id = 0;
168
 
169
- // If not then assign maxicycle customer is as order entity ID is, if yes then use maxicycle_customer_id from the past
170
  if (count($maxicycle_customer_id_exist) > 0) {
171
  $maxicycle_customer_id = intval($maxicycle_customer_id_exist[0]['maxicycle_customer_id']);
172
- Mage::log('MAXICYCLE: existing customer id found: ' . $maxicycle_customer_id, null, 'maxicycle.log');
173
  } else {
174
  $maxicycle_customer_id = $order->getEntityId();
175
- Mage::log('MAXICYCLE: new customer id: ' . $maxicycle_customer_id, null, 'maxicycle.log');
176
  }
177
  $order->setMaxicycleCustomerId($maxicycle_customer_id);
178
  return $maxicycle_customer_id;
@@ -201,21 +240,21 @@ class Maxicycle_Connector_Model_Observer {
201
  if ($product_costs_type == '1') {
202
  // get product price from specified attribute
203
  $bp = floatval($product->getData($product_costs_attribute));
204
- // Mage::log('MAXICYCLE: Gross profit: attribute', null, 'maxicycle.log');
205
  if ($bp != 0) {
206
- // Mage::log('MAXICYCLE: Gross profit: attribute value: ' . $bp, null, 'maxicycle.log');
207
  $item_costs += ($item_quantity * $bp);
208
  } else {
209
- // Mage::log('MAXICYCLE: Gross profit: attribute value empty ' . $bp, null, 'maxicycle.log');
210
  $item_costs += ($item_quantity * $item_price);
211
  }
212
  } else {
213
- // Mage::log('MAXICYCLE: Gross profit: fixed product price - percentage', null, 'maxicycle.log');
214
  if (floatval($product_costs_fixed) != 0) {
215
  // deduct percentage
216
  $fixed_percentage = floatval($product_costs_fixed) / 100.00;
217
  $item_costs += ($item_quantity * $item_price * $fixed_percentage);
218
- // Mage::log('MAXICYCLE: Gross profit: item costs ' . $item_costs, null, 'maxicycle.log');
219
  } else {
220
  $item_costs += ($item_quantity * $item_price);
221
  }
@@ -224,10 +263,10 @@ class Maxicycle_Connector_Model_Observer {
224
 
225
  // deduct specified average order costs
226
  $gross_profit = ($grand_total - floatval($avg_order_costs));
227
- Mage::log('MAXICYCLE: Gross profit: Grand total - avg order costs' . $gross_profit, null, 'maxicycle.log');
228
  // deduct tax
229
  if ($use_tax) {
230
- Mage::log('MAXICYCLE: Gross profit, deducting tax', null, 'maxicycle.log');
231
  $gross_profit -= floatval($order->getTaxAmount());
232
  }
233
  // deduct order item costs
@@ -235,65 +274,102 @@ class Maxicycle_Connector_Model_Observer {
235
  return $gross_profit;
236
  }
237
 
238
- private function addProductToOrder($order, $campaign) {
239
- Mage::log('MAXICYCLE: adding product', null, 'maxicycle.log');
240
- $campaign_time_end = strtotime($campaign['campaign_end']);
241
- // Process condition - ADD PRODUCT - only if campaign is still in CP and not already in RT
242
- if ($campaign_time_end >= time()) {
243
- $conditions = explode('|', $campaign['condition']);
244
- if (count($conditions) > 0) {
245
- // Loop over conditions
246
- for ($i = 0; $i < count($conditions); $i++) {
247
- $condition = explode(":", $conditions[$i]);
248
- if (count($condition) == 2) {
249
- // Get code and value of condition
250
- $condition_code = $condition[0];
251
- $condition_value = $condition[1];
252
-
253
- // Test condition
254
- switch ($condition_code) {
255
- case 'treatment_group_size' : {
256
- // if treatment condition true -> insert rule SKU
257
- if ($this->testCondition($condition_code, $condition_value, $order)) {
258
- Mage::log('MAXICYCLE: OrderType: treatment', null, 'maxicycle.log');
259
- // Load product
260
- $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $campaign['product_sku']);
261
- if ($product) {
262
- // Save product into order
263
- $rowTotal = 0.00;
264
- $order_item = Mage::getModel('sales/order_item')->setStoreId(null)->setQuoteItemId(null)->setQuoteParentItemId(null)->setProductId($product->getId())->setProductType($product->getTypeId())->setQtyBackordered(null)->setTotalQtyOrdered(1)->setQtyOrdered(1)->setName($product->getName())->setSku($product->getSku())->setPrice(0)->setBasePrice(0)->setOriginalPrice(0)->setRowTotal($rowTotal)->setBaseRowTotal($rowTotal)->setOrder($order);
265
- $order_item->save();
266
- // Set it into order
267
- $order->setMaxicycleOrderType('treatment');
268
- } else {
269
- Mage::log('MAXICYCLE: WARNING: Product ' . $campaign['product_sku'] . ' not found for control order', null, 'maxicycle.log');
270
- }
271
- } else {
272
- // Set it into order to be used when exporting the results
273
- $order->setMaxicycleOrderType('control');
274
- Mage::log('MAXICYCLE: OrderType: control', null, 'maxicycle.log');
275
- }
276
- break;
277
- }
278
- }
279
- }
280
  }
 
 
 
 
 
 
 
 
 
 
 
 
281
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
  } else {
283
- Mage::log('MAXICYCLE: Not adding product, campaign in response period', null, 'maxicycle.log');
284
  }
285
  }
286
 
287
  private function checkIfResponseOrder($order, $maxicycle_customer_id, $campaign) {
288
- Mage::log('MAXICYCLE: campaign: ' . $campaign['campaign_id'], null, 'maxicycle.log');
289
- Mage::log('MAXICYCLE: customer id: ' . $maxicycle_customer_id, null, 'maxicycle.log');
290
  $response_to_order_id = NULL;
291
  // Identify if it is response order
292
  $previous_order_exists = $this->_db->fetchAll("SELECT order_id FROM " . $this->_dbResource->getTableName('maxicycle/results') .
293
  " WHERE campaign_id = " . $campaign['campaign_id'] .
294
  " AND maxicycle_customer_id = $maxicycle_customer_id AND campaign_order_type IS NOT NULL ORDER BY created_at DESC LIMIT 1");
295
  if (count($previous_order_exists) == 1) {
296
- Mage::log('MAXICYCLE: response order', null, 'maxicycle.log');
297
  $response_to_order_id = $previous_order_exists[0]['order_id'];
298
  // Set it into order
299
  $order->setMaxicycleResponseToOrderId($response_to_order_id);
@@ -309,24 +385,116 @@ class Maxicycle_Connector_Model_Observer {
309
  // requires config to be set
310
  private function validStatus($order) {
311
  $status = $order->getStatus();
312
- Mage::log('MAXICYCLE: order status: ' . $status, null, 'maxicycle.log');
313
  $valid_status = in_array($order->getStatus(), $this->_config['valid_statuses']);
314
- Mage::log('MAXICYCLE: has valid status: ' . $valid_status, null, 'maxicycle.log');
315
  return $valid_status;
316
  }
317
 
318
  // requires _config to be set
319
  private function moduleEnabled() {
320
  $enabled = intval($this->_config['is_enable']);
321
- Mage::log('MAXICYCLE: Module enabled true/false: ' . $enabled, null, 'maxicycle.log');
 
 
 
 
 
 
 
 
322
  return $enabled;
323
  }
324
 
325
  // should have type set - fixes bug when exported before order_place_after_ran
326
- private function hasCampaignOrderTypeSet($order) {
327
- $order_type = $order->getMaxicycleOrderType();
328
  $has_type_set = isset($order_type);
329
- Mage::log('MAXICYCLE: Campaign order type is set true/false: ' . $has_type_set, null, 'maxicycle.log');
330
  return $has_type_set;
331
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
332
  }
7
  * @package Maxicycle_Connector
8
  * @copyright Copyright (c) 2015 (http://www.maxicycle.com)
9
  */
10
+ class Maxicycle_Connector_Model_Observer{
11
 
12
  var $_db = null;
13
  var $_dbResource = null;
14
  var $_now = '';
15
  var $_config = array();
16
+
17
  public function __construct() {
18
  $this->_db = Mage::getSingleton('core/resource')->getConnection('core_write');
19
  $this->_dbResource = Mage::getSingleton('core/resource');
21
  }
22
 
23
  private function setConfig($store_id) {
24
+ $this->_config = Mage::helper('maxicycle')->getConfiguration($store_id);
25
  }
26
 
27
+ // get all active campaigns running or in response time
28
+ private function getActiveCampaigns() {
29
+ return $this->_db->fetchAll("SELECT * FROM " . $this->_dbResource->getTableName('maxicycle/campaigns') . " WHERE campaign_start <= '$this->_now' AND response_time_end >= '$this->_now' AND store_id = " . Mage::app()->getStore()->getId());
30
+ }
31
+
32
+ // will add product to quote table to have product ready for payment methods
33
+ // like Klarna which sends the cart items before the actual order creation
34
+ public function add_product_to_quote($observer) {
35
+ Mage::log('controller_action_predispatch_checkout_onepage_index', null, 'maxicycle.log');
36
+ try {
37
+ $quote = $this->getQuote();
38
+ $this->setConfig($quote->getStoreId());
39
+ if ($this->moduleEnabled() && $this->checkoutEnabled() && !$this->hasCampaignOrderTypeSet($quote)) {
40
+ Mage::log('QUOTE: adding product to order', null, 'maxicycle.log');
41
+ $active_campaigns = $this->getActiveCampaigns();
42
+ // If there is some active campaign
43
+ if (count($active_campaigns) > 0) {
44
+ Mage::log('QUOTE: active campaigns, checking for product to add', null, 'maxicycle.log');
45
+ // Loop over active campaings
46
+ foreach ($active_campaigns as $campaign) {
47
+ // add product to Quote
48
+ $this->_addProductToCart($quote, $campaign);
49
+ $quote->setMaxicycleCampaignId($campaign['campaign_id']);
50
+ }
51
+ } else {
52
+ Mage::log('QUOTE: No active campaigns, not adding a product', null, 'maxicycle.log');
53
+ }
54
+ } else {
55
+ Mage::log('QUOTE: Checkout adding disabled or product already added', null, 'maxicycle.log');
56
+ }
57
+ }
58
+ catch(Exception $e) {
59
+ Mage::log('QUOTE: Adding product to quote failed: ' .$e->getMessage(), null, 'maxicycle.log');
60
+ }
61
+ }
62
+
63
+
64
  // add PRODUCT after order placement
65
+ // This needs to run for all payment methods that skip the checkout like
66
+ // Paypal express
67
+ public function add_product_to_order($observer) {
68
+ Mage::log('adding product to order', null, 'maxicycle.log');
69
  try {
70
  $order = $observer->getOrder();
71
  $this->setConfig($order->getStoreId());
72
+ if ($this->moduleEnabled()) {
73
+ Mage::log('adding product to order', null, 'maxicycle.log');
74
+ $active_campaigns = $this->getActiveCampaigns();
75
  // If there is some active campaign
76
  if (count($active_campaigns) > 0) {
77
+ Mage::log('ORDER: active campaigns, checking for product to add', null, 'maxicycle.log');
78
  // Loop over active campaings
79
  foreach ($active_campaigns as $campaign) {
80
  // add product to Order
81
+ $this->_addProductToOrder($order, $campaign);
82
  // Set campaign_id to order
83
  $order->setMaxicycleCampaignId($campaign['campaign_id']);
84
  $maxicycle_customer_id = $this->setCustomerIdToOrder($order, $campaign);
85
  // check and mark if order is response order
86
+ $this->checkIfResponseOrder($order, $maxicycle_customer_id, $campaign);
87
  }
88
  } else {
89
+ Mage::log('No active campaigns, not adding a product', null, 'maxicycle.log');
90
  }
91
  } else {
92
+ Mage::log('module disabled', null, 'maxicycle.log');
93
  }
94
  }
95
  catch(Exception $e) {
96
  Mage::log('Order Place After Exception: ' .$e->getMessage(), null, 'maxicycle.log');
97
+ }
98
  }
99
+
100
 
101
+ // Export to results table if right status was reached
102
+ public function sales_order_save_after($observer) {
103
  try {
104
  $order = $observer->getOrder();
105
  $this->setConfig($order->getStoreId());
106
+ Mage::log('after save hook for order:' . $order->getEntityId(), null, 'maxicycle.log');
107
  //Mage::log(json_encode($this->_config), null, 'maxicycle.log');
108
  //Mage::log($this->_config['valid_statuses'], null, 'maxicycle.log');
109
  // Check if Maxicycle is active and a valid status
110
  if ($this->shouldExport($order)) {
111
+ Mage::log('valid status: ' . $order->getStatus(), null, 'maxicycle.log');
112
  // Load order info
113
+ Mage::log('Order ID ' . $order->getEntityId(), null, 'maxicycle.log');
114
+ Mage::log('valid status: ' . $order->getStatus(), null, 'maxicycle.log');
115
  // Get all active campaigns
116
+ // Mage::log('Current Store ' . $order->getStoreId(), null, 'maxicycle.log');
117
  // TODO: refactor this, order has campaign id already
118
  $active_campaigns = $this->_db->fetchAll("SELECT * FROM " . $this->_dbResource->getTableName('maxicycle/campaigns') .
119
  " WHERE campaign_start <= '$this->_now' AND response_time_end >= '$this->_now' AND store_id = " . $order->getStoreId());
120
  // If there are some active campaigns
121
  if (count($active_campaigns) > 0) {
122
+ Mage::log('active campaigns', null, 'maxicycle.log');
123
  // Loop over active campaings
124
  foreach ($active_campaigns as $campaign) {
125
  $this->exportToResults($order, $campaign);
126
  }
127
  } else {
128
+ Mage::log('No active campaigns', null, 'maxicycle.log');
129
  }
130
  } else {
131
  # do nothing
132
+ Mage::log('module disabled or invalid status', null, 'maxicycle.log');
133
  }
134
  }
135
  catch(Exception $e) {
136
  Mage::log('Order Save After Exception: ' .$e->getMessage(), null, 'maxicycle.log');
137
  }
138
  }
139
+
140
+ private function _isTreatment($treatment_size) {
141
+ // Generate random number
142
+ $random_number = rand(0, 100);
143
+ // Log random number for overview
144
+ if ($random_number <= $treatment_size) {
145
+ return true;
146
+ } else {
147
+ return false;
148
+ }
 
 
 
149
  }
150
 
151
  private function exportToResults($order, $campaign) {
152
+ Mage::log('Starting Export', null, 'maxicycle.log');
153
  $order_id = $order->getIncrementId();
154
  // check if already exported
155
  $previous_order_exists = $this->_db->fetchAll("SELECT order_id FROM " .
158
  " AND order_id = ". $order_id ." LIMIT 1");
159
 
160
  if (count($previous_order_exists) == 1) {
161
+ Mage::log('Order already exported: ' . $order->getIncrementId(), null, 'maxicycle.log');
162
  } else {
163
 
164
+ Mage::log('exporting status: ' . $order->getStatus(), null, 'maxicycle.log');
165
 
166
  // no idea why we do this, but we check and set the customer id to the order
167
  $maxicycle_customer_id = $order->getMaxicycleCustomerId();
187
  // Save order data into Maxicycle orders table
188
  try {
189
  $result = Mage::getModel('maxicycle/results')->setData($data)->save();
190
+ Mage::log('Result: ' . $result->getId(), null, 'maxicycle.log');
191
  } catch (Exception $e) {
192
+ Mage::log('ERROR: ' . $e->getMessage(), null, 'maxicycle.log');
193
  }
194
  }
195
  }
205
 
206
  $maxicycle_customer_id = 0;
207
 
208
+ // If not then assign maxicycle customer as order entity ID is, if yes then use maxicycle_customer_id from the past
209
  if (count($maxicycle_customer_id_exist) > 0) {
210
  $maxicycle_customer_id = intval($maxicycle_customer_id_exist[0]['maxicycle_customer_id']);
211
+ Mage::log('existing customer id found: ' . $maxicycle_customer_id, null, 'maxicycle.log');
212
  } else {
213
  $maxicycle_customer_id = $order->getEntityId();
214
+ Mage::log('new customer id: ' . $maxicycle_customer_id, null, 'maxicycle.log');
215
  }
216
  $order->setMaxicycleCustomerId($maxicycle_customer_id);
217
  return $maxicycle_customer_id;
240
  if ($product_costs_type == '1') {
241
  // get product price from specified attribute
242
  $bp = floatval($product->getData($product_costs_attribute));
243
+ // Mage::log('Gross profit: attribute', null, 'maxicycle.log');
244
  if ($bp != 0) {
245
+ // Mage::log('Gross profit: attribute value: ' . $bp, null, 'maxicycle.log');
246
  $item_costs += ($item_quantity * $bp);
247
  } else {
248
+ // Mage::log('Gross profit: attribute value empty ' . $bp, null, 'maxicycle.log');
249
  $item_costs += ($item_quantity * $item_price);
250
  }
251
  } else {
252
+ // Mage::log('Gross profit: fixed product price - percentage', null, 'maxicycle.log');
253
  if (floatval($product_costs_fixed) != 0) {
254
  // deduct percentage
255
  $fixed_percentage = floatval($product_costs_fixed) / 100.00;
256
  $item_costs += ($item_quantity * $item_price * $fixed_percentage);
257
+ // Mage::log('Gross profit: item costs ' . $item_costs, null, 'maxicycle.log');
258
  } else {
259
  $item_costs += ($item_quantity * $item_price);
260
  }
263
 
264
  // deduct specified average order costs
265
  $gross_profit = ($grand_total - floatval($avg_order_costs));
266
+ Mage::log('Gross profit: Grand total - avg order costs' . $gross_profit, null, 'maxicycle.log');
267
  // deduct tax
268
  if ($use_tax) {
269
+ Mage::log('Gross profit, deducting tax', null, 'maxicycle.log');
270
  $gross_profit -= floatval($order->getTaxAmount());
271
  }
272
  // deduct order item costs
274
  return $gross_profit;
275
  }
276
 
277
+ private function _alreadyMaxicycleOrder($order) {
278
+ Mage::log('Check if quote is already maxicycle order', null, 'maxicycle.log');
279
+ $quote_id = $order->getQuoteId();
280
+ $quote = Mage::getModel('sales/quote')->load($quote_id);
281
+ $campaign_type_set = $this->hasCampaignOrderTypeSet($quote);
282
+ // copy values
283
+ if ($campaign_type_set) {
284
+ $order->setMaxicycleOrderType($quote->getMaxicycleOrderType());
285
+ $order->setMaxicycleCampaignId($quote->getMaxicycleCampaignId());
286
+ }
287
+ return $campaign_type_set;
288
+ }
289
+
290
+ private function _addProductToOrder($order, $campaign) {
291
+ Mage::log('Place order -> check adding order', null, 'maxicycle.log');
292
+ // exit if product was already added in quote
293
+ $already_added = $this->_alreadyMaxicycleOrder($order);
294
+ if ($already_added) {
295
+ Mage::log('Product was already added to order', null, 'maxicycle.log');
296
+ } else {
297
+ // Process condition - ADD PRODUCT - only if campaign is still in CP and not already in RT
298
+ if ($this->_campaignActive($campaign)) {
299
+ // conditiond = treatment_group_size:90
300
+ $condition = explode(":", $campaign['condition']);
301
+ // Get code and value of condition
302
+ $treatment_group_size = $condition[1];
303
+ // Test condition
304
+ // if treatment condition true -> insert SKU
305
+ if ($this->_isTreatment($treatment_group_size)) {
306
+ Mage::log('Product was NOT already added to order', null, 'maxicycle.log');
307
+ $this->addOrderItem($order, $campaign);
308
+ // Set it into order
309
+ $order->setMaxicycleOrderType('treatment');
310
+ Mage::log('OrderType: treatment', null, 'maxicycle.log');
311
+ } else {
312
+ // Set it into order to be used when exporting the results
313
+ $order->setMaxicycleOrderType('control');
314
+ Mage::log('OrderType: control', null, 'maxicycle.log');
 
 
 
 
315
  }
316
+
317
+ } else {
318
+ Mage::log('Not adding product, campaign in response period', null, 'maxicycle.log');
319
+ }
320
+ }
321
+ }
322
+
323
+ private function checkIfSKUAlreadyAdded($items, $sku) {
324
+ $added = FALSE;
325
+ Foreach($items as $item){
326
+ if ($sku == $item->getSku()) {
327
+ $added = TRUE;
328
  }
329
+ }
330
+ return $added;
331
+ }
332
+
333
+ // create and order item to product
334
+ private function addOrderItem($order, $campaign) {
335
+ Mage::log('Adding product to order', null, 'maxicycle.log');
336
+ $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $campaign['product_sku']);
337
+ if ($product) {
338
+ // Save product into order
339
+ $rowTotal = 0.00;
340
+ $order_item = Mage::getModel('sales/order_item')
341
+ ->setStoreId($order->getStore()->getStoreId())
342
+ ->setQuoteItemId(null)
343
+ ->setQuoteParentItemId(null)
344
+ ->setProductId($product->getId())
345
+ ->setProductType($product->getTypeId())
346
+ ->setQtyBackordered(null)
347
+ ->setTotalQtyOrdered(1)
348
+ ->setQtyOrdered(1)
349
+ ->setName($product->getName())
350
+ ->setSku($product->getSku())
351
+ ->setPrice(0)
352
+ ->setBasePrice(0)
353
+ ->setOriginalPrice(0)
354
+ ->setRowTotal($rowTotal)
355
+ ->setBaseRowTotal($rowTotal)
356
+ ->setOrder($order);
357
+ $order_item->save();
358
  } else {
359
+ Mage::log('WARNING: Product ' . $campaign['product_sku'] . ' not found for control order', null, 'maxicycle.log');
360
  }
361
  }
362
 
363
  private function checkIfResponseOrder($order, $maxicycle_customer_id, $campaign) {
364
+ Mage::log('campaign: ' . $campaign['campaign_id'], null, 'maxicycle.log');
365
+ Mage::log('customer id: ' . $maxicycle_customer_id, null, 'maxicycle.log');
366
  $response_to_order_id = NULL;
367
  // Identify if it is response order
368
  $previous_order_exists = $this->_db->fetchAll("SELECT order_id FROM " . $this->_dbResource->getTableName('maxicycle/results') .
369
  " WHERE campaign_id = " . $campaign['campaign_id'] .
370
  " AND maxicycle_customer_id = $maxicycle_customer_id AND campaign_order_type IS NOT NULL ORDER BY created_at DESC LIMIT 1");
371
  if (count($previous_order_exists) == 1) {
372
+ Mage::log('response order', null, 'maxicycle.log');
373
  $response_to_order_id = $previous_order_exists[0]['order_id'];
374
  // Set it into order
375
  $order->setMaxicycleResponseToOrderId($response_to_order_id);
385
  // requires config to be set
386
  private function validStatus($order) {
387
  $status = $order->getStatus();
388
+ Mage::log('order status: ' . $status, null, 'maxicycle.log');
389
  $valid_status = in_array($order->getStatus(), $this->_config['valid_statuses']);
390
+ Mage::log('has valid status: ' . $valid_status, null, 'maxicycle.log');
391
  return $valid_status;
392
  }
393
 
394
  // requires _config to be set
395
  private function moduleEnabled() {
396
  $enabled = intval($this->_config['is_enable']);
397
+ Mage::log('Module enabled true/false: ' . $enabled, null, 'maxicycle.log');
398
+ return $enabled;
399
+ }
400
+
401
+ // requires _config to be set
402
+ // checks if product should be added during checkout
403
+ private function checkoutEnabled() {
404
+ $enabled = intval($this->_config['add_during_checkout']);
405
+ Mage::log('Checkout enabled true/false: ' . $enabled, null, 'maxicycle.log');
406
  return $enabled;
407
  }
408
 
409
  // should have type set - fixes bug when exported before order_place_after_ran
410
+ private function hasCampaignOrderTypeSet($quote) {
411
+ $order_type = $quote->getMaxicycleOrderType();
412
  $has_type_set = isset($order_type);
413
+ Mage::log('Campaign order type is set true/false: ' . $has_type_set, null, 'maxicycle.log');
414
  return $has_type_set;
415
  }
416
+
417
+ private function _campaignActive($campaign) {
418
+ $campaign_time_end = strtotime($campaign['campaign_end']);
419
+ // condition is treatment group size > 0
420
+ return ($campaign_time_end >= time());
421
+ }
422
+
423
+ protected function _addProductToCart($quote, $campaign) {
424
+ Mage::log('Checkout: adding order', null, 'maxicycle.log');
425
+ $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $campaign['product_sku']);
426
+ // Process condition - ADD PRODUCT - only if campaign is still in CP and not already in RT
427
+ if ($this->_campaignActive($campaign)) {
428
+ // conditiond = treatment_group_size:90
429
+ $condition = explode(":", $campaign['condition']);
430
+ // Get code and value of condition
431
+ $treatment_group_size = $condition[1];
432
+ // Test condition
433
+ // if treatment condition true -> insert SKU
434
+ if ($this->_isTreatment($treatment_group_size)) {
435
+ // exit if product was already added in quote
436
+ $already_added = $this->checkIfSKUAlreadyAdded($quote->getAllItems(), $campaign['product_sku']);
437
+ if ($already_added) {
438
+ Mage::log('Product was already added to order', null, 'maxicycle.log');
439
+ } else {
440
+ Mage::log('Product was NOT already added to order', null, 'maxicycle.log');
441
+ $this->_addQuoteItem($product, $quote);
442
+ }
443
+ // Set it into order
444
+ $quote->setMaxicycleOrderType('treatment');
445
+ Mage::log('OrderType: treatment', null, 'maxicycle.log');
446
+ } else {
447
+ // Set it into order to be used when exporting the results
448
+ $quote->setMaxicycleOrderType('control');
449
+ Mage::log('OrderType: control', null, 'maxicycle.log');
450
+ }
451
+
452
+ } else {
453
+ Mage::log('Not adding product, campaign in response period', null, 'maxicycle.log');
454
+ }
455
+
456
+ }
457
+
458
+ protected function _addQuoteItem($product, $quote) {
459
+ if ($product->getId()) {
460
+ try {
461
+ // Save product into quote
462
+ $rowTotal = 0.00;
463
+ $order_item = Mage::getModel('sales/quote_item')
464
+ ->setStoreId($quote->getStore()->getStoreId())
465
+ ->setQuoteId($quote->getId())
466
+ ->setProduct($product)
467
+ ->setQty(1)
468
+ ->setPrice(0)
469
+ ->setBasePrice(0)
470
+ ->setCustomPrice(0)
471
+ ->setOriginalCustomPrice(0)
472
+ ->setRowTotal($rowTotal)
473
+ ->setBaseRowTotal($rowTotal)
474
+ ->setRowTotalWithDiscount($rowTotal)
475
+ ->setRowTotalInclTax($rowTotal)
476
+ ->setBaseRowTotalInclTax($rowTotal)
477
+ ->setQuote($quote);
478
+ $order_item->save();
479
+ Mage::log('Saving product to quote', null, 'maxicycle.log');
480
+
481
+ } catch (Exception $e) {
482
+ Mage::log('Adding product to quote failed: ' .$e->getMessage(), null, 'maxicycle.log');
483
+ throw $e;
484
+ }
485
+ return true;
486
+ }
487
+ }
488
+
489
+ // get checkout from controller
490
+ public function getCheckout()
491
+ {
492
+ return Mage::getSingleton('checkout/session');
493
+ }
494
+
495
+ // get quote from checkout
496
+ public function getQuote()
497
+ {
498
+ return $this->getCheckout()->getQuote();
499
+ }
500
  }
app/code/community/Maxicycle/Connector/controllers/Adminhtml/InstallationController.php CHANGED
@@ -32,7 +32,9 @@ class Maxicycle_Connector_Adminhtml_InstallationController extends Mage_Adminhtm
32
  $use_shipping = intval($this->getRequest()->getPost('use_shipping'));
33
  $order_costs = floatval($this->getRequest()->getPost('order_costs'));
34
  $valid_statuses = $this->getRequest()->getPost('valid_statuses');
 
35
 
 
36
  // KEYS
37
  $is_enable_key = 'maxicycle/maxicycle_option/enable';
38
  $api_key_key = 'maxicycle/maxicycle_option/api_key';
@@ -43,6 +45,7 @@ class Maxicycle_Connector_Adminhtml_InstallationController extends Mage_Adminhtm
43
  $order_costs_key = 'maxicycle/maxicycle_option/order_costs';
44
  $product_costs_type_key = 'maxicycle/maxicycle_option/product_costs_type';
45
  $valid_statuses_key = 'maxicycle/maxicycle_option/valid_statuses';
 
46
 
47
  // UPDATES
48
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$is_enable_key', '$is_enable') ON DUPLICATE KEY UPDATE value = '$is_enable'");
@@ -54,6 +57,7 @@ class Maxicycle_Connector_Adminhtml_InstallationController extends Mage_Adminhtm
54
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$use_shipping_key', '$use_shipping') ON DUPLICATE KEY UPDATE value = '$use_shipping'");
55
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$order_costs_key', '$order_costs') ON DUPLICATE KEY UPDATE value = '$order_costs'");
56
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$valid_statuses_key', '" . implode(',', $valid_statuses) . "') ON DUPLICATE KEY UPDATE value = '" . implode(',', $valid_statuses) . "'");
 
57
 
58
  // RESET CACHE
59
  $cacheType = 'config';
32
  $use_shipping = intval($this->getRequest()->getPost('use_shipping'));
33
  $order_costs = floatval($this->getRequest()->getPost('order_costs'));
34
  $valid_statuses = $this->getRequest()->getPost('valid_statuses');
35
+ $add_during_checkout_set = $this->getRequest()->getPost('add_during_checkout');
36
 
37
+ $add_during_checkout = isset($add_during_checkout_set) ? TRUE : FALSE;
38
  // KEYS
39
  $is_enable_key = 'maxicycle/maxicycle_option/enable';
40
  $api_key_key = 'maxicycle/maxicycle_option/api_key';
45
  $order_costs_key = 'maxicycle/maxicycle_option/order_costs';
46
  $product_costs_type_key = 'maxicycle/maxicycle_option/product_costs_type';
47
  $valid_statuses_key = 'maxicycle/maxicycle_option/valid_statuses';
48
+ $add_during_checkout_key = 'maxicycle/maxicycle_option/add_during_checkout';
49
 
50
  // UPDATES
51
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$is_enable_key', '$is_enable') ON DUPLICATE KEY UPDATE value = '$is_enable'");
57
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$use_shipping_key', '$use_shipping') ON DUPLICATE KEY UPDATE value = '$use_shipping'");
58
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$order_costs_key', '$order_costs') ON DUPLICATE KEY UPDATE value = '$order_costs'");
59
  $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$valid_statuses_key', '" . implode(',', $valid_statuses) . "') ON DUPLICATE KEY UPDATE value = '" . implode(',', $valid_statuses) . "'");
60
+ $db->query("INSERT INTO " . Mage::getSingleton('core/resource')->getTableName('core_config_data') . " (scope,scope_id,path,value) VALUES('$scope', $store_id, '$add_during_checkout_key', '$add_during_checkout') ON DUPLICATE KEY UPDATE value = '$add_during_checkout'");
61
 
62
  // RESET CACHE
63
  $cacheType = 'config';
app/code/community/Maxicycle/Connector/etc/config.xml CHANGED
@@ -12,7 +12,7 @@
12
  <config>
13
  <modules>
14
  <Maxicycle_Connector>
15
- <version>1.0.4</version>
16
  </Maxicycle_Connector>
17
  </modules>
18
 
@@ -80,15 +80,24 @@
80
  </maxicycle_read>
81
  </resources>
82
  <events>
83
- <sales_order_place_after>
84
  <observers>
85
  <maxicycle>
86
  <type>singleton</type>
87
  <class>maxicycle/observer</class>
88
- <method>sales_order_place_after</method>
89
  </maxicycle>
90
  </observers>
91
  </sales_order_place_after>
 
 
 
 
 
 
 
 
 
92
  <sales_order_save_after>
93
  <observers>
94
  <maxicycle>
12
  <config>
13
  <modules>
14
  <Maxicycle_Connector>
15
+ <version>1.0.5</version>
16
  </Maxicycle_Connector>
17
  </modules>
18
 
80
  </maxicycle_read>
81
  </resources>
82
  <events>
83
+ <sales_order_place_after>
84
  <observers>
85
  <maxicycle>
86
  <type>singleton</type>
87
  <class>maxicycle/observer</class>
88
+ <method>add_product_to_order</method>
89
  </maxicycle>
90
  </observers>
91
  </sales_order_place_after>
92
+ <controller_action_predispatch_checkout_onepage_index>
93
+ <observers>
94
+ <maxicycle>
95
+ <type>singleton</type>
96
+ <class>maxicycle/observer</class>
97
+ <method>add_product_to_quote</method>
98
+ </maxicycle>
99
+ </observers>
100
+ </controller_action_predispatch_checkout_onepage_index>
101
  <sales_order_save_after>
102
  <observers>
103
  <maxicycle>
app/code/community/Maxicycle/Connector/sql/maxicycle_setup/upgrade-1.0.3-1.0.4.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Maxicycle
5
+ *
6
+ * @category Maxicycle
7
+ * @package Maxicycle_Connector
8
+ * @copyright Copyright (c) 2015 (http://www.maxicycle.com)
9
+ */
10
+ $installer = $this;
11
+ $installer->startSetup();
12
+
13
+ // Add order attribute
14
+ $installer->getConnection()->addColumn($installer->getTable('sales_flat_order'), 'maxicycle_response_to_order_id',
15
+ Varien_Db_Ddl_Table::TYPE_TEXT, null, array(
16
+ 'nullable' => true,
17
+ 'default' => null,
18
+ 'comment' => 'Maxicycle response id',
19
+ 'length' => 100
20
+ ));
21
+ $installer->getConnection()->addColumn($installer->getTable('sales_flat_order'), 'maxicycle_order_type',
22
+ Varien_Db_Ddl_Table::TYPE_TEXT, null, array(
23
+ 'nullable' => true,
24
+ 'default' => null,
25
+ 'comment' => 'Maxicycle order type' ,
26
+ 'length' => 100
27
+ ));
28
+ $installer->getConnection()->addColumn($installer->getTable('sales_flat_order'), 'maxicycle_campaign_id',
29
+ array(
30
+ 'type' => Varien_Db_Ddl_Table::TYPE_INTEGER,
31
+ 'length' => 10,
32
+ 'nullable' => true,
33
+ 'default' => null,
34
+ 'comment' => 'Maxicycle campaign ID for order'
35
+ ));
36
+ $installer->endSetup();
app/code/community/Maxicycle/Connector/sql/maxicycle_setup/upgrade-1.0.4-1.0.5.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Maxicycle
5
+ *
6
+ * @category Maxicycle
7
+ * @package Maxicycle_Connector
8
+ * @copyright Copyright (c) 2015 (http://www.maxicycle.com)
9
+ */
10
+ $installer = $this;
11
+ $installer->startSetup();
12
+
13
+ // Add order attribute
14
+ $installer->getConnection()->addColumn($installer->getTable('sales_flat_quote'), 'maxicycle_response_to_order_id',
15
+ Varien_Db_Ddl_Table::TYPE_TEXT, null, array(
16
+ 'nullable' => true,
17
+ 'default' => null,
18
+ 'comment' => 'Maxicycle response id',
19
+ 'length' => 100
20
+ ));
21
+ $installer->getConnection()->addColumn($installer->getTable('sales_flat_quote'), 'maxicycle_order_type',
22
+ Varien_Db_Ddl_Table::TYPE_TEXT, null, array(
23
+ 'nullable' => true,
24
+ 'default' => null,
25
+ 'comment' => 'Maxicycle order type' ,
26
+ 'length' => 100
27
+ ));
28
+ $installer->getConnection()->addColumn($installer->getTable('sales_flat_quote'), 'maxicycle_campaign_id',
29
+ array(
30
+ 'type' => Varien_Db_Ddl_Table::TYPE_INTEGER,
31
+ 'length' => 10,
32
+ 'nullable' => true,
33
+ 'default' => null,
34
+ 'comment' => 'Maxicycle campaign ID for order'
35
+ ));
36
+ $installer->endSetup();
app/design/adminhtml/default/default/template/maxicycle/connector/installation/step1.phtml CHANGED
@@ -174,6 +174,17 @@
174
  </p>
175
  </td>
176
  </tr>
 
 
 
 
 
 
 
 
 
 
 
177
  </table>
178
  </div>
179
  </div>
174
  </p>
175
  </td>
176
  </tr>
177
+ <tr>
178
+ <td class="label">
179
+ <?php echo $this->__('Add package insert during checkout'); ?>:
180
+ </td>
181
+ <td class="value">
182
+ <input type="checkbox" value="1" name="add_during_checkout" <?php echo (intval($config['add_during_checkout']) == 1 ? ' checked' : ''); ?>>
183
+ <p class="note">
184
+ <span><?php echo $this->__('Check this box e.g. if you use Klarna invoice.'); ?></span>
185
+ </p>
186
+ </td>
187
+ </tr>
188
  </table>
189
  </div>
190
  </div>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>MaxicycleCom_Connector</name>
4
- <version>1.0.4</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.maxicycle/license">Copyright Maxicycle Software GmbH 2015</license>
7
  <channel>community</channel>
@@ -11,7 +11,9 @@
11
  &#xD;
12
  Did you know that enclosing package inserts (coupons, catalogs, freebies, product samples, etc.) are extremely effective in driving follow-up orders from your existing customer base? Maxicycle is the solution that turns your packages into a real performance-based retention marketing channel with an amazing ROI: Create, manage, measure and optimise package inserts in a similar way than you are used from your AdWords or Facebook ads.&#xD;
13
  </description>
14
- <notes>v1.0.4&#xD;
 
 
15
  Fixed bug in PHP 5.4&#xD;
16
  v1.0.3&#xD;
17
  Refresh caching&#xD;
@@ -27,9 +29,9 @@ Logging into separate logfile&#xD;
27
  v.1.0.0&#xD;
28
  * Initial official release</notes>
29
  <authors><author><name>Maxicycle Software GmbH</name><user>maxicycle</user><email>support@maxicycle.com</email></author></authors>
30
- <date>2015-09-23</date>
31
- <time>21:25:35</time>
32
- <contents><target name="mageetc"><dir name="modules"><file name="Maxicycle_Connector.xml" hash="0d64b2d2ad66099e225460c349125557"/></dir></target><target name="magecommunity"><dir name="Maxicycle"><dir name="Connector"><dir name="Block"><dir name="Adminhtml"><dir name="Campaigns"><file name="Grid.php" hash="c350b3b4e428bf5f11027a97e38167ae"/></dir><file name="Campaigns.php" hash="b09c985fc4215ecd937024e0364f319b"/><dir name="Cronlog"><file name="Grid.php" hash="256284d0455dbb136baf8e00d2a71a89"/></dir><file name="Cronlog.php" hash="577f5e50a80fbac7b83cf8d5727bbb5f"/><dir name="Results"><file name="Grid.php" hash="4236c80b8faa31e6cba5f184e0d45adc"/><dir name="Renderer"><file name="Campaign.php" hash="ef4d3f0cd6c3558367f82e07853414e6"/><file name="Flag2.php" hash="d8779254a77e19da81c91e81452a7e43"/><file name="Order.php" hash="aecdc4cb460c558773660778060cde0f"/></dir></dir><file name="Results.php" hash="4d32a5f15b1f3a18434e3b2754030659"/></dir></dir><dir name="Helper"><file name="Data.php" hash="77ad31ff601c6f98f54788aaa616f0d6"/></dir><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="71be3bc47c32463bc8f6f84e901719ef"/><file name="Rest.php" hash="260c1849fc5dba7b5698d5160f427d5d"/></dir><file name="Campaigns.php" hash="4e60821d8a19ea5391921e5b358257dc"/><file name="Cronlog.php" hash="dc5eec5445c6c703429992b749c8ef2c"/><dir name="Mysql4"><dir name="Campaigns"><file name="Collection.php" hash="880cbcd1ab65efb9096965c267ad35cc"/></dir><file name="Campaigns.php" hash="98143aae26423260cccb496aac9d28f2"/><dir name="Cronlog"><file name="Collection.php" hash="44d321c218f66619fbbf14271fca361f"/></dir><file name="Cronlog.php" hash="299749238a435407cce37b5dc524c466"/><dir name="Results"><file name="Collection.php" hash="8b046e56516f2f1893b6f3d1e6e2b228"/><dir name="Renderer"><file name="Actions.php" hash="da76e0352436e0570c8e6506a121d031"/><file name="Status.php" hash="37878ac8231edee56041b714077f7aec"/></dir></dir><file name="Results.php" hash="8898f253c8dce9ebe3a6b289e26945a6"/></dir><file name="Observer.php" hash="3487909a46ec0615079f39e09287b497"/><dir name="Resource"><dir name="Mysql4"><file name="Setup.php" hash="ccae8f6fc1d48cb5ef6b761211e75bd9"/></dir></dir><file name="Results.php" hash="246fff1018a0b03f521ba96ec61b8a8e"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="CampaignsController.php" hash="420557976cfeda32353ce0b5f435a252"/><file name="CronlogController.php" hash="eb58983412dec2890d22138adecb95a7"/><file name="InstallationController.php" hash="3f61bbc6a06009ed2966df2192c0474d"/><file name="ResultsController.php" hash="78633bbdd767350c56deef829c7b4a62"/></dir><file name="TestConnectionController.php" hash="ddb67e441e3478d45632905b78e5c362"/><file name="V1Controller.php" hash="8cf992ec3ab988d3b11f8428ea98d501"/></dir><dir name="data"><file name="data_sample.sql" hash="c02ad04dc9c1b43814ac7877970ab1ae"/></dir><dir name="etc"><file name="adminhtml.xml" hash="363126b0e935810dd07d42426ce9f766"/><file name="config.xml" hash="a91915f07ae64031564abc5687d068df"/></dir><dir name="sql"><dir name="maxicycle_setup"><file name="mysql4-install-1.0.0.php" hash="ac322e77f8b08beb2d326426f2c23121"/><file name="upgrade-1.0.0-1.0.1.php" hash="dba0e0a874a87c101b379de988646b1f"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="maxicycle"><dir name="connector"><dir name="installation"><file name="step1.phtml" hash="e3efe0f106cc3cf941a77ece30b51041"/></dir></dir></dir></dir><dir name="layout"><dir name="maxicycle"><dir name="connector"><file name="layout.xml" hash="b4c388d059df42d365c945f972e8cfca"/></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="maxicycle"><dir name="connector"><dir name="css"><file name="css.css" hash="6cb4c9ca0ce1288f028ea80284d368ae"/></dir></dir></dir></dir></dir></dir></target></contents>
33
  <compatible/>
34
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
35
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>MaxicycleCom_Connector</name>
4
+ <version>1.0.5</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.maxicycle/license">Copyright Maxicycle Software GmbH 2015</license>
7
  <channel>community</channel>
11
  &#xD;
12
  Did you know that enclosing package inserts (coupons, catalogs, freebies, product samples, etc.) are extremely effective in driving follow-up orders from your existing customer base? Maxicycle is the solution that turns your packages into a real performance-based retention marketing channel with an amazing ROI: Create, manage, measure and optimise package inserts in a similar way than you are used from your AdWords or Facebook ads.&#xD;
13
  </description>
14
+ <notes>v1.0.5&#xD;
15
+ Added compatibility with Klarna&#xD;
16
+ v1.0.4&#xD;
17
  Fixed bug in PHP 5.4&#xD;
18
  v1.0.3&#xD;
19
  Refresh caching&#xD;
29
  v.1.0.0&#xD;
30
  * Initial official release</notes>
31
  <authors><author><name>Maxicycle Software GmbH</name><user>maxicycle</user><email>support@maxicycle.com</email></author></authors>
32
+ <date>2015-10-09</date>
33
+ <time>07:12:57</time>
34
+ <contents><target name="mageetc"><dir name="modules"><file name="Maxicycle_Connector.xml" hash="0d64b2d2ad66099e225460c349125557"/></dir></target><target name="magecommunity"><dir name="Maxicycle"><dir name="Connector"><dir name="Block"><dir name="Adminhtml"><dir name="Campaigns"><file name="Grid.php" hash="c350b3b4e428bf5f11027a97e38167ae"/></dir><file name="Campaigns.php" hash="b09c985fc4215ecd937024e0364f319b"/><dir name="Cronlog"><file name="Grid.php" hash="256284d0455dbb136baf8e00d2a71a89"/></dir><file name="Cronlog.php" hash="577f5e50a80fbac7b83cf8d5727bbb5f"/><dir name="Results"><file name="Grid.php" hash="4236c80b8faa31e6cba5f184e0d45adc"/><dir name="Renderer"><file name="Campaign.php" hash="ef4d3f0cd6c3558367f82e07853414e6"/><file name="Flag2.php" hash="d8779254a77e19da81c91e81452a7e43"/><file name="Order.php" hash="aecdc4cb460c558773660778060cde0f"/></dir></dir><file name="Results.php" hash="4d32a5f15b1f3a18434e3b2754030659"/></dir></dir><dir name="Helper"><file name="Data.php" hash="a7df4cd21dc681b1887b21276e099c53"/></dir><dir name="Model"><dir name="Api"><file name="Abstract.php" hash="71be3bc47c32463bc8f6f84e901719ef"/><file name="Rest.php" hash="260c1849fc5dba7b5698d5160f427d5d"/></dir><file name="Campaigns.php" hash="4e60821d8a19ea5391921e5b358257dc"/><file name="Cronlog.php" hash="dc5eec5445c6c703429992b749c8ef2c"/><dir name="Mysql4"><dir name="Campaigns"><file name="Collection.php" hash="880cbcd1ab65efb9096965c267ad35cc"/></dir><file name="Campaigns.php" hash="98143aae26423260cccb496aac9d28f2"/><dir name="Cronlog"><file name="Collection.php" hash="44d321c218f66619fbbf14271fca361f"/></dir><file name="Cronlog.php" hash="299749238a435407cce37b5dc524c466"/><dir name="Results"><file name="Collection.php" hash="8b046e56516f2f1893b6f3d1e6e2b228"/><dir name="Renderer"><file name="Actions.php" hash="da76e0352436e0570c8e6506a121d031"/><file name="Status.php" hash="37878ac8231edee56041b714077f7aec"/></dir></dir><file name="Results.php" hash="8898f253c8dce9ebe3a6b289e26945a6"/></dir><file name="Observer.php" hash="fcf1cef79925c7bc67479fe7f2be04a4"/><dir name="Resource"><dir name="Mysql4"><file name="Setup.php" hash="ccae8f6fc1d48cb5ef6b761211e75bd9"/></dir></dir><file name="Results.php" hash="246fff1018a0b03f521ba96ec61b8a8e"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="CampaignsController.php" hash="420557976cfeda32353ce0b5f435a252"/><file name="CronlogController.php" hash="eb58983412dec2890d22138adecb95a7"/><file name="InstallationController.php" hash="8f338320862fc72b7f2eaaf5a918e293"/><file name="ResultsController.php" hash="78633bbdd767350c56deef829c7b4a62"/></dir><file name="TestConnectionController.php" hash="ddb67e441e3478d45632905b78e5c362"/><file name="V1Controller.php" hash="8cf992ec3ab988d3b11f8428ea98d501"/></dir><dir name="data"><file name="data_sample.sql" hash="c02ad04dc9c1b43814ac7877970ab1ae"/></dir><dir name="etc"><file name="adminhtml.xml" hash="363126b0e935810dd07d42426ce9f766"/><file name="config.xml" hash="403a42ac42d65dc92b9dc4b69f97eb69"/></dir><dir name="sql"><dir name="maxicycle_setup"><file name="mysql4-install-1.0.0.php" hash="ac322e77f8b08beb2d326426f2c23121"/><file name="upgrade-1.0.0-1.0.1.php" hash="dba0e0a874a87c101b379de988646b1f"/><file name="upgrade-1.0.3-1.0.4.php" hash="dba0e0a874a87c101b379de988646b1f"/><file name="upgrade-1.0.4-1.0.5.php" hash="28f1d904f1dc1bebb1436bd93dca0122"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="maxicycle"><dir name="connector"><dir name="installation"><file name="step1.phtml" hash="1e6b091fb1c9f94533b2015835030d91"/></dir></dir></dir></dir><dir name="layout"><dir name="maxicycle"><dir name="connector"><file name="layout.xml" hash="b4c388d059df42d365c945f972e8cfca"/></dir></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="maxicycle"><dir name="connector"><dir name="css"><file name="css.css" hash="6cb4c9ca0ce1288f028ea80284d368ae"/></dir></dir></dir></dir></dir></dir></target></contents>
35
  <compatible/>
36
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
37
  </package>