MaxicycleCom_Connector - Version 1.2.0

Version Notes

v.1.2.0
Allow to set custom attribute for gross profit calculation

v1.1.6
Bugfix

v1.1.5
cleanup

v1.1.4
Little refactoring of order update

v1.1.3
Big refactoring.
Split testing functionality

v1.0.7
Minor Refactoring
v1.0.6
New hooks for custom checkouts that do not use Magento's default hooks.

If the sku needs to be added at the beginn of the checkout, some payment providers like Klarna require that the following hook need need to be triggered

* maxicycle_add_product_to_quote

If the sales_order_place_after hook is not triggered the following hook needs to be triggered

* maxicycle_add_product_to_order

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.2.0
Comparing to
See all releases


Code changes from version 1.1.3 to 1.2.0

app/code/community/Maxicycle/Connector/Block/Adminhtml/Campaigns/Grid.php CHANGED
@@ -71,21 +71,6 @@ class Maxicycle_Connector_Block_Adminhtml_Campaigns_Grid extends Mage_Adminhtml_
71
  'options' => $stores,
72
  ));
73
 
74
- $this->addColumn('action', array(
75
- 'header' => Mage::helper('maxicycle')->__('Action'),
76
- 'width' => '200',
77
- 'type' => 'action',
78
- 'getter' => 'getCampaignId',
79
- 'actions' => array(
80
- array(
81
- 'caption' => Mage::helper('maxicycle')->__('Regenerate results'),
82
- 'url' => array('base' => '*/*/regenerate'),
83
- 'field' => 'campaign_id',
84
- 'onclick' => "if(!confirm('Do you realy want to re-generate results?')) return false;"
85
- )
86
- )
87
- ));
88
-
89
  return parent::_prepareColumns();
90
  }
91
 
71
  'options' => $stores,
72
  ));
73
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
74
  return parent::_prepareColumns();
75
  }
76
 
app/code/community/Maxicycle/Connector/Model/Insert.php CHANGED
@@ -66,7 +66,8 @@ class Maxicycle_Connector_Model_Insert extends Mage_Core_Model_Abstract {
66
  $this->_setCustomerIdToOrder();
67
  // Process condition - ADD PRODUCT - only if campaign is still in CP and not already in RT
68
  if (!$this->_inResponsePeriod($campaign)) {
69
- $this->_addProduct();
 
70
  } else {
71
  Mage::log('Not adding product, campaign in response period', null, 'maxicycle.log');
72
  }
@@ -185,7 +186,7 @@ class Maxicycle_Connector_Model_Insert extends Mage_Core_Model_Abstract {
185
  ->setBaseRowTotal($rowTotal)
186
  ->setOrder($order);
187
  $order_item->save();
188
- Mage::log('Product successfully added to quote', null, 'maxicycle.log');
189
  } catch (Exception $e) {
190
  Mage::log('Adding product to order failed: ' .$e->getMessage(), null, 'maxicycle.log');
191
  throw $e;
@@ -359,9 +360,9 @@ class Maxicycle_Connector_Model_Insert extends Mage_Core_Model_Abstract {
359
  return (rand(0, 100) <= $treatment_group_size ? true : false);
360
  }
361
 
362
- // Check if we insert for Order or Quote
363
  private function _isOrder() {
364
- return get_class($this->_quote_or_order) == 'Mage_Sales_Model_Order';
365
  }
366
-
367
  }
66
  $this->_setCustomerIdToOrder();
67
  // Process condition - ADD PRODUCT - only if campaign is still in CP and not already in RT
68
  if (!$this->_inResponsePeriod($campaign)) {
69
+ $this->_addProduct();
70
+ $this->_quote_or_order->save();
71
  } else {
72
  Mage::log('Not adding product, campaign in response period', null, 'maxicycle.log');
73
  }
186
  ->setBaseRowTotal($rowTotal)
187
  ->setOrder($order);
188
  $order_item->save();
189
+ Mage::log('Product successfully added to order', null, 'maxicycle.log');
190
  } catch (Exception $e) {
191
  Mage::log('Adding product to order failed: ' .$e->getMessage(), null, 'maxicycle.log');
192
  throw $e;
360
  return (rand(0, 100) <= $treatment_group_size ? true : false);
361
  }
362
 
363
+ // Check if we insert for Order or Quote
364
  private function _isOrder() {
365
+ return ($this->_quote_or_order instanceof Mage_Sales_Model_Order);
366
  }
367
+
368
  }
app/code/community/Maxicycle/Connector/Model/Observer.php CHANGED
@@ -199,33 +199,34 @@ class Maxicycle_Connector_Model_Observer{
199
  $avg_order_costs = floatval($this->_config['order_costs']);
200
  $grand_total = $order->getGrandTotal();
201
  $item_costs = 0.00;
202
-
 
203
  // Loop over all order items
204
  foreach ($order_items as $item) {
205
  $item_price = floatval($item->getBasePrice());
206
  $item_quantity = floatval($item->getQtyOrdered());
207
  // Load product
208
- $product = Mage::getModel('catalog/product')->load($item->getProductId());
209
 
210
  // get product price from attribute
211
- if ($product_costs_type == '1') {
212
  // get product price from specified attribute
213
  $bp = floatval($product->getData($product_costs_attribute));
214
- // Mage::log('EXPORT: Gross profit: attribute', null, 'maxicycle.log');
215
  if ($bp != 0) {
216
- // Mage::log('EXPORT: Gross profit: attribute value: ' . $bp, null, 'maxicycle.log');
217
  $item_costs += ($item_quantity * $bp);
218
  } else {
219
- // Mage::log('EXPORT: Gross profit: attribute value empty ' . $bp, null, 'maxicycle.log');
220
  $item_costs += ($item_quantity * $item_price);
221
  }
 
222
  } else {
223
- // Mage::log('EXPORT: Gross profit: fixed product price - percentage', null, 'maxicycle.log');
224
  if (floatval($product_costs_fixed) != 0) {
225
  // deduct percentage
226
  $fixed_percentage = floatval($product_costs_fixed) / 100.00;
227
  $item_costs += ($item_quantity * $item_price * $fixed_percentage);
228
- // Mage::log('EXPORT: Gross profit: item costs ' . $item_costs, null, 'maxicycle.log');
229
  } else {
230
  $item_costs += ($item_quantity * $item_price);
231
  }
@@ -234,7 +235,7 @@ class Maxicycle_Connector_Model_Observer{
234
 
235
  // deduct specified average order costs
236
  $gross_profit = ($grand_total - floatval($avg_order_costs));
237
- //Mage::log('EXPORT: Gross profit: Grand total - avg order costs' . $gross_profit, null, 'maxicycle.log');
238
  // deduct tax
239
  if ($use_tax) {
240
  Mage::log('EXPORT: Gross profit, deducting tax', null, 'maxicycle.log');
199
  $avg_order_costs = floatval($this->_config['order_costs']);
200
  $grand_total = $order->getGrandTotal();
201
  $item_costs = 0.00;
202
+ Mage::log('EXPORT: PRODUCT cost attribute: ' . $product_costs_attribute, null, 'maxicycle.log');
203
+
204
  // Loop over all order items
205
  foreach ($order_items as $item) {
206
  $item_price = floatval($item->getBasePrice());
207
  $item_quantity = floatval($item->getQtyOrdered());
208
  // Load product
209
+ $product = Mage::getModel('catalog/product')->loadByAttribute('sku', $item->getSku());
210
 
211
  // get product price from attribute
212
+ if ($product_costs_type == '1' || $product_costs_type == '3') {
213
  // get product price from specified attribute
214
  $bp = floatval($product->getData($product_costs_attribute));
 
215
  if ($bp != 0) {
216
+ Mage::log('EXPORT: Gross profit: attribute value: ' . $bp, null, 'maxicycle.log');
217
  $item_costs += ($item_quantity * $bp);
218
  } else {
219
+ Mage::log('EXPORT: Gross profit: attribute value empty ' . $bp, null, 'maxicycle.log');
220
  $item_costs += ($item_quantity * $item_price);
221
  }
222
+ Mage::log('EXPORT: Gross profit: item costs ' . $item_costs, null, 'maxicycle.log');
223
  } else {
224
+ Mage::log('EXPORT: Gross profit: fixed product price - percentage', null, 'maxicycle.log');
225
  if (floatval($product_costs_fixed) != 0) {
226
  // deduct percentage
227
  $fixed_percentage = floatval($product_costs_fixed) / 100.00;
228
  $item_costs += ($item_quantity * $item_price * $fixed_percentage);
229
+ Mage::log('EXPORT: Gross profit: item costs ' . $item_costs, null, 'maxicycle.log');
230
  } else {
231
  $item_costs += ($item_quantity * $item_price);
232
  }
235
 
236
  // deduct specified average order costs
237
  $gross_profit = ($grand_total - floatval($avg_order_costs));
238
+ Mage::log('EXPORT: Gross profit: Grand total - avg order costs: ' . $gross_profit, null, 'maxicycle.log');
239
  // deduct tax
240
  if ($use_tax) {
241
  Mage::log('EXPORT: Gross profit, deducting tax', null, 'maxicycle.log');
app/code/community/Maxicycle/Connector/etc/config.xml CHANGED
@@ -12,7 +12,7 @@
12
  <config>
13
  <modules>
14
  <Maxicycle_Connector>
15
- <version>1.1.3</version>
16
  </Maxicycle_Connector>
17
  </modules>
18
 
12
  <config>
13
  <modules>
14
  <Maxicycle_Connector>
15
+ <version>1.2.0</version>
16
  </Maxicycle_Connector>
17
  </modules>
18
 
app/design/adminhtml/default/default/template/maxicycle/connector/installation/step1.phtml CHANGED
@@ -210,11 +210,12 @@
210
  </td>
211
  <td class="value">
212
  <select name="product_costs_type" class="select" onchange="return showProductCostsAttribute(this);" id="product_cost_type">
213
- <option value="1"<?php echo ((intval($config['product_costs_type']) == 1) ? ' selected="selected"' : ''); ?>><?php echo $this->__('Attribute'); ?></option>
 
214
  <option value="2"<?php echo ((intval($config['product_costs_type']) == 2) ? ' selected="selected"' : ''); ?>><?php echo $this->__('Fixed value'); ?></option>
215
  </select>
216
  <p class="note">
217
- <span><?php echo $this->__('Select "Attribute" if you have stored the buying price of your products in a product attribute. If not, please select "Fixed value" and enter your average costs of goods sold (in percent).'); ?></span>
218
  </p>
219
  </td>
220
  </tr>
@@ -226,12 +227,9 @@
226
  <span><?php echo $this->__('Average costs of goods sold in percent of your product selling price without taxes. (Ask your controller!)'); ?></span>
227
  </p>
228
  </td>
229
- </tr>
230
- <tr>
231
- <td></td>
232
  <td class="value"<?php echo (($config['product_costs_type'] == '1') ? '' : ' style="display:none;"'); ?> id="product_costs_attribute">
233
  <?php $attributes = Mage::getResourceModel('catalog/product_attribute_collection')->getItems(); ?>
234
- <select name="product_costs_attribute" class="select">
235
  <?php foreach ($attributes as $attribute): ?>
236
  <?php if ($attribute->getFrontendLabel() == '' || $attribute->getBackendType() != 'decimal') continue; ?>
237
  <?php $attribute_selected = ($config['product_costs_attribute'] == '' ? 'cost' : $config['product_costs_attribute']) ?>
@@ -242,6 +240,16 @@
242
  <span><?php echo $this->__('This product attribute contains your product buying price.'); ?></span>
243
  </p>
244
  </td>
 
 
 
 
 
 
 
 
 
 
245
  </tr>
246
  <tr>
247
  <td class="label">
@@ -280,14 +288,29 @@
280
  <script type="text/javascript">
281
  //< ![CDATA[
282
  function showProductCostsAttribute(e) {
283
- if ($(e).value == '1') {
284
- $('product_costs_fixed').hide();
285
- $('product_costs_attribute').show();
286
- } else {
287
- $('product_costs_fixed').show();
288
- $('product_costs_attribute').hide();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
289
  }
290
  }
 
291
  function switchStore(obj) {
292
  var storeParam = obj.value ? 'store/' + obj.value + '/' : '';
293
  if (obj.switchParams) {
@@ -308,12 +331,10 @@
308
 
309
 
310
  document.edit_form.onsubmit = function(){
311
- alert('handled');
312
  validateForm();
313
- }
314
 
315
  function submitIfValid() {
316
- console.log('validateForm');
317
  var e = document.getElementById("valid-status");
318
  if (!e.options[e.selectedIndex]) {
319
  alert("Select at least one order status.");
210
  </td>
211
  <td class="value">
212
  <select name="product_costs_type" class="select" onchange="return showProductCostsAttribute(this);" id="product_cost_type">
213
+ <option value="1"<?php echo ((intval($config['product_costs_type']) == 1) ? ' selected="selected"' : ''); ?>><?php echo $this->__('Attribute - select from list'); ?></option>
214
+ <option value="3"<?php echo ((intval($config['product_costs_type']) == 3) ? ' selected="selected"' : ''); ?>><?php echo $this->__('Attribute - enter manually'); ?></option>
215
  <option value="2"<?php echo ((intval($config['product_costs_type']) == 2) ? ' selected="selected"' : ''); ?>><?php echo $this->__('Fixed value'); ?></option>
216
  </select>
217
  <p class="note">
218
+ <span><?php echo $this->__('Select "Attribute" if you have stored the buying price of your products in a product attribute. If not, please select "Fixed value" and enter your average costs of goods sold (in percent of your sales without VAT).'); ?></span>
219
  </p>
220
  </td>
221
  </tr>
227
  <span><?php echo $this->__('Average costs of goods sold in percent of your product selling price without taxes. (Ask your controller!)'); ?></span>
228
  </p>
229
  </td>
 
 
 
230
  <td class="value"<?php echo (($config['product_costs_type'] == '1') ? '' : ' style="display:none;"'); ?> id="product_costs_attribute">
231
  <?php $attributes = Mage::getResourceModel('catalog/product_attribute_collection')->getItems(); ?>
232
+ <select name="product_costs_attribute" class="select" id="product_costs_attribute_select">
233
  <?php foreach ($attributes as $attribute): ?>
234
  <?php if ($attribute->getFrontendLabel() == '' || $attribute->getBackendType() != 'decimal') continue; ?>
235
  <?php $attribute_selected = ($config['product_costs_attribute'] == '' ? 'cost' : $config['product_costs_attribute']) ?>
240
  <span><?php echo $this->__('This product attribute contains your product buying price.'); ?></span>
241
  </p>
242
  </td>
243
+ <!-- Custom attribute code -->
244
+ <td class="value"<?php echo (($config['product_costs_type'] == '3') ? '' : ' style="display:none;"'); ?> id="product_costs_attribute_custom">
245
+ <div id="product_attribute_text_field">
246
+ <input type="text" class="input-text" name="product_costs_attribute" value="<?php echo ($config['product_costs_type'] == '3') ? $config['product_costs_attribute'] : '' ?>" placeholder="Attribute code" id="product_costs_attribute_custom_input"/>
247
+ </div>
248
+
249
+ <p class="note">
250
+ <span><?php echo $this->__('This product attribute contains your product buying price. You can find the attribute code in Catalog > Attributes > Manage Attributes > ... > Properties > Attribute code. Attribute values must be formatted as "1234.56"'); ?></span>
251
+ </p>
252
+ </td>
253
  </tr>
254
  <tr>
255
  <td class="label">
288
  <script type="text/javascript">
289
  //< ![CDATA[
290
  function showProductCostsAttribute(e) {
291
+ switch($(e).value) {
292
+ case '1':
293
+ $('product_costs_fixed').hide();
294
+ $('product_costs_attribute_custom').hide();
295
+ $('product_costs_attribute_custom_input').disabled = true;
296
+ $('product_costs_attribute_select').disabled = false;
297
+ $('product_costs_attribute').show();
298
+ break;
299
+ case '2':
300
+ $('product_costs_fixed').show();
301
+ $('product_costs_attribute_custom').hide();
302
+ $('product_costs_attribute').hide();
303
+ break;
304
+ case '3':
305
+ $('product_costs_fixed').hide();
306
+ $('product_costs_attribute_custom').show();
307
+ $('product_costs_attribute_select').disabled = true;
308
+ $('product_costs_attribute_custom_input').disabled = false;
309
+ $('product_costs_attribute').hide();
310
+ break;
311
  }
312
  }
313
+
314
  function switchStore(obj) {
315
  var storeParam = obj.value ? 'store/' + obj.value + '/' : '';
316
  if (obj.switchParams) {
331
 
332
 
333
  document.edit_form.onsubmit = function(){
 
334
  validateForm();
335
+ };
336
 
337
  function submitIfValid() {
 
338
  var e = document.getElementById("valid-status");
339
  if (!e.options[e.selectedIndex]) {
340
  alert("Select at least one order status.");
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>MaxicycleCom_Connector</name>
4
- <version>1.1.3</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,19 @@
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,1.3&#xD;
 
 
 
 
 
 
 
 
 
 
 
 
15
  Big refactoring.&#xD;
16
  Split testing functionality&#xD;
17
  &#xD;
@@ -46,9 +58,9 @@ Logging into separate logfile&#xD;
46
  v.1.0.0&#xD;
47
  * Initial official release</notes>
48
  <authors><author><name>Maxicycle Software GmbH</name><user>maxicycle</user><email>support@maxicycle.com</email></author></authors>
49
- <date>2016-02-04</date>
50
- <time>05:50:45</time>
51
- <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="ba4b97a5137098ae21826f3ff4ed7a09"/><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="1a3c5413761e27c88e6c3cbe940d2be0"/></dir><file name="Campaigns.php" hash="4e60821d8a19ea5391921e5b358257dc"/><file name="Cronlog.php" hash="dc5eec5445c6c703429992b749c8ef2c"/><file name="Insert.php" hash="5b31e189cac060f0d1a0f4801d82480f"/><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="e130e8ddb458559a06d58523d6586fc6"/><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="a1adf400fe884d258339210f8df04c43"/></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="5ab6b381bfe60a5d2d2b0b8476fa687c"/><file name="upgrade-1.0.7-1.1.1.php" hash="71ac5eb71b7401d3cbd976b413f88860"/><file name="upgrade-1.1.1-1.1.2.php" hash="025f1aea7c6432175c27c6d898ea8d09"/><file name="upgrade-1.1.2-1.1.3.php" hash="dac70cbef34f2c9a892cdce3a2c568cf"/></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="498b5417c51c5b7d92bb46a17caeb9fa"/></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>
52
  <compatible/>
53
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
54
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>MaxicycleCom_Connector</name>
4
+ <version>1.2.0</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>v.1.2.0&#xD;
15
+ Allow to set custom attribute for gross profit calculation&#xD;
16
+ &#xD;
17
+ v1.1.6&#xD;
18
+ Bugfix &#xD;
19
+ &#xD;
20
+ v1.1.5&#xD;
21
+ cleanup &#xD;
22
+ &#xD;
23
+ v1.1.4&#xD;
24
+ Little refactoring of order update&#xD;
25
+ &#xD;
26
+ v1.1.3&#xD;
27
  Big refactoring.&#xD;
28
  Split testing functionality&#xD;
29
  &#xD;
58
  v.1.0.0&#xD;
59
  * Initial official release</notes>
60
  <authors><author><name>Maxicycle Software GmbH</name><user>maxicycle</user><email>support@maxicycle.com</email></author></authors>
61
+ <date>2016-04-03</date>
62
+ <time>20:12:18</time>
63
+ <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="2630f7165cd3c37c22108002517b1092"/></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="ba4b97a5137098ae21826f3ff4ed7a09"/><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="1a3c5413761e27c88e6c3cbe940d2be0"/></dir><file name="Campaigns.php" hash="4e60821d8a19ea5391921e5b358257dc"/><file name="Cronlog.php" hash="dc5eec5445c6c703429992b749c8ef2c"/><file name="Insert.php" hash="638cbc218081573410a951511028dab1"/><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="dc43939eb4ec67953a7bf0e760cc7177"/><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="495c4fc897c5d8e79b017d517d6837be"/></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="5ab6b381bfe60a5d2d2b0b8476fa687c"/><file name="upgrade-1.0.7-1.1.1.php" hash="71ac5eb71b7401d3cbd976b413f88860"/><file name="upgrade-1.1.1-1.1.2.php" hash="025f1aea7c6432175c27c6d898ea8d09"/><file name="upgrade-1.1.2-1.1.3.php" hash="dac70cbef34f2c9a892cdce3a2c568cf"/></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="bf6ee437f77eea396d81e80abc1faffd"/></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>
64
  <compatible/>
65
  <dependencies><required><php><min>5.3.0</min><max>6.0.0</max></php></required></dependencies>
66
  </package>