Dolist_Net - Version 2.0.0.7

Version Notes

v2

Download this release

Release Info

Developer Dolist
Extension Dolist_Net
Version 2.0.0.7
Comparing to
See all releases


Code changes from version 2.0.0.6 to 2.0.0.7

Files changed (36) hide show
  1. app/code/community/Dolist/Net/Helper/Data.php +139 -0
  2. app/code/community/Dolist/Net/Model/Adminhtml/Observer.php +43 -30
  3. app/code/community/Dolist/Net/Model/Dolistv8/Calculatedfields.php +168 -271
  4. app/code/community/Dolist/Net/Model/Exporter/Csv.php +151 -147
  5. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Calculatedfields.php +51 -2
  6. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Date/Firstorder.php +6 -60
  7. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Date/Lastorder.php +5 -60
  8. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Date/Lastquotenotordered.php +11 -164
  9. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgnbdifferentproductsperorder.php +8 -4
  10. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgnbdifferentproductsperorderline.php +8 -4
  11. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgnbproductsperorder.php +7 -1
  12. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgorderamountexcltax.php +7 -1
  13. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgorderamountincltax.php +6 -83
  14. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Firstorderamountexcltax.php +4 -4
  15. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Firstorderamountincltax.php +5 -1
  16. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastnotorderedcartamountexcltax.php +9 -6
  17. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastnotorderedcartamountincltax.php +11 -149
  18. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastorderamountexcltax.php +6 -1
  19. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastorderamountincltax.php +4 -2
  20. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Nbpromotionrulesused.php +7 -2
  21. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorderamountexcltax.php +7 -1
  22. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorderamountincltax.php +9 -4
  23. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorderedproducts.php +10 -1
  24. app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorders.php +10 -1
  25. app/code/community/Dolist/Net/Model/Observer.php +110 -1
  26. app/code/community/Dolist/Net/Model/Reports.php +5 -1
  27. app/code/community/Dolist/Net/Model/Service.php +99 -251
  28. app/code/community/Dolist/Net/Model/System/Config/Source/Dolistv8/Customerattributelist.php +14 -11
  29. app/code/community/Dolist/Net/controllers/Adminhtml/CustomerdolistController.php +75 -9
  30. app/code/community/Dolist/Net/controllers/Adminhtml/System/Config/TestconnectionController.php +5 -0
  31. app/code/community/Dolist/Net/etc/config.xml +12 -22
  32. app/code/community/Dolist/Net/sql/dolist_setup/mysql4-upgrade-2.0.0.6-2.0.0.7.php +14 -0
  33. app/design/adminhtml/default/default/template/dolist/customerexport.phtml +1 -1
  34. app/locale/fr_FR/Dolist_Net.csv +2 -0
  35. package.xml +1 -1
  36. shell/dolist_export_segments.php +95 -0
app/code/community/Dolist/Net/Helper/Data.php CHANGED
@@ -81,6 +81,42 @@ class Dolist_Net_Helper_Data extends Mage_Core_Helper_Abstract
81
  'CustomInt10'
82
  );
83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
84
  /**
85
  * Check if Dolist-V8 is enabled
86
  *
@@ -360,6 +396,109 @@ class Dolist_Net_Helper_Data extends Mage_Core_Helper_Abstract
360
  ->save();
361
  }
362
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
363
  /**
364
  * Return Dolist-V8 export contact file header fields
365
  *
81
  'CustomInt10'
82
  );
83
 
84
+ public function loadSubscriberByEmail($email, $storeId)
85
+ {
86
+ /** @var Mage_Newsletter_Model_Resource_Subscriber_Collection $subscriberCollection */
87
+ $subscriberCollection = Mage::getModel('newsletter/subscriber')->getCollection()
88
+ ->addFilter('store_id', $storeId)
89
+ ->addFilter('subscriber_email', $email);
90
+
91
+ if ($subscriberCollection->count() >= 1) {
92
+ return $subscriberCollection->getFirstItem();
93
+ }
94
+
95
+ return null;
96
+ }
97
+
98
+ public function loadSubscriberByCustomer(Mage_Customer_Model_Customer $customer, $storeId)
99
+ {
100
+ /** @var Mage_Newsletter_Model_Resource_Subscriber_Collection $subscriberCollection */
101
+ $subscriberCollection = Mage::getModel('newsletter/subscriber')->getCollection()
102
+ ->addFilter('store_id', $storeId)
103
+ ->addFilter('customer_id', $customer->getId());
104
+
105
+ if ($subscriberCollection->count() >= 1) {
106
+ return $subscriberCollection->getFirstItem();
107
+ }
108
+
109
+ $subscriberCollection = Mage::getModel('newsletter/subscriber')->getCollection()
110
+ ->addFilter('store_id', $storeId)
111
+ ->addFilter('subscriber_email', $customer->getEmail());
112
+
113
+ if ($subscriberCollection->count() >= 1) {
114
+ return $subscriberCollection->getFirstItem();
115
+ }
116
+
117
+ return null;
118
+ }
119
+
120
  /**
121
  * Check if Dolist-V8 is enabled
122
  *
396
  ->save();
397
  }
398
 
399
+ /**
400
+ * Retrieve from core_flag table Dolist Segment Export Cronned Status flag
401
+ * If null, instantiate new object
402
+ *
403
+ * @param int $segmentId Segment ID
404
+ *
405
+ * @return Mage_Core_Model_Flag
406
+ */
407
+ public function getCronExportSegmentFlag($segmentId)
408
+ {
409
+ $flagCode = 'dolist_cron_export_segment_' . $segmentId;
410
+
411
+ // First, try to retrieve object
412
+ $flag = Mage::getModel('core/flag', array('flag_code' => $flagCode))->load($flagCode, 'flag_code');
413
+ if ($flag->getId() == null) {
414
+ // Instanciate new object
415
+ $flag = Mage::getModel('core/flag', array('flag_code' => $flagCode));
416
+ $flag->setFlagData(FALSE);
417
+ $flag->save();
418
+ }
419
+ return $flag;
420
+ }
421
+
422
+ /**
423
+ * Add Segment Export to Cronned segment export list
424
+ *
425
+ * @param $segmentId
426
+ *
427
+ * @return void
428
+ */
429
+ public function addSegmentExportToCron($segmentId)
430
+ {
431
+
432
+ $flag = $this->getCronExportSegmentFlag($segmentId);
433
+ $flag->setFlagData(TRUE)
434
+ ->save();
435
+ }
436
+
437
+ /**
438
+ * Remove Segment Export to Cronned segment export list
439
+ *
440
+ * @param $segmentId
441
+ *
442
+ * @return void
443
+ */
444
+ public function removeSegmentExportFromCron($segmentId)
445
+ {
446
+ $flag = $this->getCronExportSegmentFlag($segmentId);
447
+ $flag->setFlagData(FALSE)
448
+ ->save();
449
+ }
450
+
451
+ /**
452
+ * Return TRUE is the segment export is added to the cron, FALSE otherwise
453
+ *
454
+ * @param $segmentId
455
+ *
456
+ * @return bool
457
+ */
458
+ public function isSegmentExportCronEnabled($segmentId)
459
+ {
460
+ $flag = $this->getCronExportSegmentFlag($segmentId);
461
+ return (bool) $flag->getFlagData();
462
+ }
463
+
464
+ public function exportSegment($segmentId) {
465
+ $return = FALSE;
466
+
467
+ $segment = Mage::getModel('enterprise_customersegment/segment')->load($segmentId);
468
+
469
+ if($segment && $segment->getId()) {
470
+
471
+ /**
472
+ * Preparation des paramètres
473
+ */
474
+ $segmentWebsiteIds = $segment->getWebsiteIds();
475
+ // Replace segment website ids with segment website default store view ids
476
+ $segmentStoreIds = array();
477
+ foreach ($segmentWebsiteIds as $segmentWebsiteId) {
478
+ $website = Mage::app()->getWebsite($segmentWebsiteId);
479
+ $segmentStoreIds[$segmentWebsiteId] = $website->getDefaultStore()->getId();
480
+ }
481
+
482
+ $enabledStoreIds = array();
483
+ foreach ($segmentStoreIds as $segmentWebsiteId => $segmentStoreId) {
484
+ if ($this->isDolistV8Enabled($segmentStoreId)) {
485
+ $enabledStoreIds[$segmentWebsiteId] = $segmentStoreId;
486
+ }
487
+ }
488
+
489
+ $websiteIds = array_keys($enabledStoreIds); // Dolist-V8 enabled websites
490
+ $storeIds = $enabledStoreIds;
491
+ $filteredWebsiteIds = $this->filterDistinctEnabledWebsites($websiteIds);
492
+
493
+ /** Export */
494
+ /** @var Dolist_Net_Model_Service $service */
495
+ $service = Mage::getSingleton('dolist/service');
496
+ $return = $service->exportSegment($segment->getId(), $filteredWebsiteIds, $storeIds);
497
+ }
498
+ return $return;
499
+
500
+ }
501
+
502
  /**
503
  * Return Dolist-V8 export contact file header fields
504
  *
app/code/community/Dolist/Net/Model/Adminhtml/Observer.php CHANGED
@@ -41,28 +41,52 @@ class Dolist_Net_Model_Adminhtml_Observer
41
  if (!empty($enabledStoreIds)) {
42
  $block = $observer->getEvent()->getBlock();
43
 
44
- $url = '*/customerdolist/exportSegment';
45
- $removeUrl = '*/customerdolist/removeSegment';
 
 
 
 
46
  $urlParams = array(
47
  'segment_id' => $segment->getId(),
48
  'website_ids' => serialize(array_keys($enabledStoreIds)), // Dolist-V8 enabled websites
49
  'store_ids' => serialize($enabledStoreIds),
50
  );
51
-
52
- // If this segment is not already exported
53
- if (!$this->_getHelper()->isExportedSegment($segment->getId(), $enabledStoreIds)) {
54
 
55
- // Newline
56
- $block->addButton(
57
- 'dolistv8_newline',
58
- array(
59
- 'class' => '',
60
- 'label' => '',
61
- 'onclick' => '',
62
- 'style' => 'display:block; visibility: hidden;',
63
- ),
64
- 3
 
 
65
  );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
 
67
  $block->addButton(
68
  'dolistv8_export',
@@ -71,22 +95,10 @@ class Dolist_Net_Model_Adminhtml_Observer
71
  'label' => Mage::helper('dolist')->__('Export this segment to Dolist-V8'),
72
  'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($url, $urlParams) . '\')',
73
  ),
74
- 4
75
  );
76
  } else {
77
 
78
- // Newline
79
- $block->addButton(
80
- 'dolistv8_newline',
81
- array(
82
- 'class' => '',
83
- 'label' => '',
84
- 'onclick' => '',
85
- 'style' => 'display:block; visibility: hidden;',
86
- ),
87
- 3
88
- );
89
-
90
  // Else, propose to export it again (just one segment export)
91
  $block->addButton(
92
  'dolistv8_export',
@@ -95,7 +107,7 @@ class Dolist_Net_Model_Adminhtml_Observer
95
  'label' => Mage::helper('dolist')->__('Export again this segment to Dolist-V8'),
96
  'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($url, $urlParams) . '\')',
97
  ),
98
- 4
99
  );
100
 
101
  // Add new button to remove this segment from export list dolist_exported_segment_list
@@ -106,8 +118,9 @@ class Dolist_Net_Model_Adminhtml_Observer
106
  'label' => Mage::helper('dolist')->__('Remove this segment from exported list'),
107
  'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($removeUrl, $urlParams) . '\')',
108
  ),
109
- 5
110
  );
 
111
  }
112
  }
113
  }
41
  if (!empty($enabledStoreIds)) {
42
  $block = $observer->getEvent()->getBlock();
43
 
44
+ $url = '*/customerdolist/exportSegment';
45
+ $removeUrl = '*/customerdolist/removeSegment';
46
+ $urlAddToCron = '*/customerdolist/addSegmentExportToCron';
47
+ $urlRemoveFromCron = '*/customerdolist/removeSegmentExportFromCron';
48
+
49
+
50
  $urlParams = array(
51
  'segment_id' => $segment->getId(),
52
  'website_ids' => serialize(array_keys($enabledStoreIds)), // Dolist-V8 enabled websites
53
  'store_ids' => serialize($enabledStoreIds),
54
  );
 
 
 
55
 
56
+ //Get Segment Export Cron Status to build the correct action button
57
+ if(!$this->_getHelper()->isSegmentExportCronEnabled($segment->getId())) {
58
+ $button_export_cron = array(
59
+ 'class' => 'add',
60
+ 'label' => Mage::helper('dolist')->__('Enable export from Cron'),
61
+ 'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($urlAddToCron, $urlParams) . '\')'
62
+ );
63
+ } else {
64
+ $button_export_cron = array(
65
+ 'class' => 'delete',
66
+ 'label' => Mage::helper('dolist')->__('Disable export from Cron'),
67
+ 'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($urlRemoveFromCron, $urlParams) . '\')'
68
  );
69
+ }
70
+
71
+ // Newline
72
+ $block->addButton(
73
+ 'dolistv8_newline',
74
+ array(
75
+ 'class' => '',
76
+ 'label' => '',
77
+ 'onclick' => '',
78
+ 'style' => 'display:block; visibility: hidden;',
79
+ ),
80
+ 3
81
+ );
82
+
83
+ $block->addButton('toggle_export_cron',
84
+ $button_export_cron,
85
+ 4);
86
+
87
+
88
+ // If this segment is not already exported
89
+ if (!$this->_getHelper()->isExportedSegment($segment->getId(), $enabledStoreIds)) {
90
 
91
  $block->addButton(
92
  'dolistv8_export',
95
  'label' => Mage::helper('dolist')->__('Export this segment to Dolist-V8'),
96
  'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($url, $urlParams) . '\')',
97
  ),
98
+ 5
99
  );
100
  } else {
101
 
 
 
 
 
 
 
 
 
 
 
 
 
102
  // Else, propose to export it again (just one segment export)
103
  $block->addButton(
104
  'dolistv8_export',
107
  'label' => Mage::helper('dolist')->__('Export again this segment to Dolist-V8'),
108
  'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($url, $urlParams) . '\')',
109
  ),
110
+ 5
111
  );
112
 
113
  // Add new button to remove this segment from export list dolist_exported_segment_list
118
  'label' => Mage::helper('dolist')->__('Remove this segment from exported list'),
119
  'onclick' => 'setLocation(\'' . Mage::helper('adminhtml')->getUrl($removeUrl, $urlParams) . '\')',
120
  ),
121
+ 6
122
  );
123
+
124
  }
125
  }
126
  }
app/code/community/Dolist/Net/Model/Dolistv8/Calculatedfields.php CHANGED
@@ -1,6 +1,10 @@
1
  <?php
2
 
3
-
 
 
 
 
4
  class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstract
5
  {
6
 
@@ -21,20 +25,6 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
21
  $this->debug = true;
22
  }
23
 
24
- /**
25
- * @param array $attribute
26
- * @return mixed
27
- */
28
- public function getColumnValue($attribute)
29
- {
30
- $config = $this->getConfig();
31
-
32
- $adapter = Mage::getModel($attribute['adapter']);
33
-
34
- return $adapter->getExportedValue($this->getData($config[$attribute['field']]));
35
- }
36
-
37
-
38
  public function getConfig()
39
  {
40
  return array(
@@ -72,19 +62,48 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
72
  return false;
73
  }
74
 
 
 
 
 
 
 
 
 
75
  /**
76
  * @param $customerId
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  * @return array
78
  */
79
- protected function computeDataTtl($customerId)
80
  {
81
  /**
82
  * FULL : ttl date is null
83
  * BEGIN : ttl is from beginDate to currentDate
84
  * RANGE_X : ttl is from currentDate - delay to currentDate
85
  */
86
- $option = Mage::getStoreConfig('dolist/dolist_v8/calculatedfieds_mode');
87
-
88
 
89
  if (!$option) {
90
  $option = 1;
@@ -97,7 +116,7 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
97
  case self::FULL:
98
  break;
99
  case self::BEGIN_DATE:
100
- $date = Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_date");
101
  $timestamp = strtotime($date);
102
  $start = new \DateTime();
103
  $start->setTimestamp($timestamp);
@@ -105,9 +124,7 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
105
  case self::RANGE_1:
106
  $delay = 1;
107
  $startDate = new \DateTime('-' . $delay . ' months');
108
- /** @var Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields $model */
109
- $model = Mage::getModel('dolist/dolistv8_calculatedfields');
110
- $strDate = $model->getFirstOrderDate($customerId, $startDate);
111
  if ($strDate) {
112
  $startDate->setTimestamp(strtotime($strDate));
113
  $start = $startDate;
@@ -119,9 +136,7 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
119
  case self::RANGE_3:
120
  $delay = 3;
121
  $startDate = new \DateTime('-' . $delay . ' months');
122
- /** @var Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields $model */
123
- $model = Mage::getModel('dolist/dolistv8_calculatedfields');
124
- $strDate = $model->getFirstOrderDate($customerId, $startDate);
125
  if ($strDate) {
126
  $startDate->setTimestamp(strtotime($strDate));
127
  $start = $startDate;
@@ -133,9 +148,7 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
133
  case self::RANGE_6:
134
  $delay = 6;
135
  $startDate = new \DateTime('-' . $delay . ' months');
136
- /** @var Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields $model */
137
- $model = Mage::getModel('dolist/dolistv8_calculatedfields');
138
- $strDate = $model->getFirstOrderDate($customerId, $startDate);
139
  if ($strDate) {
140
  $startDate->setTimestamp(strtotime($strDate));
141
  $start = $startDate;
@@ -147,9 +160,7 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
147
  case self::RANGE_12:
148
  $delay = 12;
149
  $startDate = new \DateTime('-' . $delay . ' months');
150
- /** @var Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields $model */
151
- $model = Mage::getModel('dolist/dolistv8_calculatedfields');
152
- $strDate = $model->getFirstOrderDate($customerId, $startDate);
153
  if ($strDate) {
154
  $startDate->setTimestamp(strtotime($strDate));
155
  $start = $startDate;
@@ -161,9 +172,7 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
161
  case self::RANGE_24:
162
  $delay = 24;
163
  $startDate = new \DateTime('-' . $delay . ' months');
164
- /** @var Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields $model */
165
- $model = Mage::getModel('dolist/dolistv8_calculatedfields');
166
- $strDate = $model->getFirstOrderDate($customerId, $startDate);
167
  if ($strDate) {
168
  $startDate->setTimestamp(strtotime($strDate));
169
  $start = $startDate;
@@ -180,89 +189,106 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
180
  );
181
  }
182
 
183
- public function recompute($customerId)
 
 
 
184
  {
 
 
 
 
 
 
185
 
186
- $dates = $this->computeDataTtl($customerId);
187
- $config = Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_mode");
188
-
189
- $data = array(
190
- 'customer_id' => $this->getData('customer_id'),
191
- 'first_order_amount' => $this->computeFirstOrderAmount($customerId),
192
- 'first_order_amount_with_vat' => $this->computeFirstOrderAmount($customerId, true),
193
- 'last_order_amount' => $this->computeLastOrderAmount($customerId),
194
- 'last_order_amount_with_vat' => $this->computeLastOrderAmount($customerId, true),
195
- 'total_orders_amount' => $this->computeTotalOrdersAmount($customerId, $dates),
196
- 'total_orders_amount_with_vat' => $this->computeTotalOrdersAmount($customerId, $dates, true),
197
- 'average_unique_product_count' => $this->computeAverageUniqueProductCount($customerId, $dates),
198
- 'average_product_count_by_command_line' => $this->computeAverageProductCountByCommandLine($customerId, $dates),
199
- 'total_product_count' => $this->computeTotalProductCount($customerId, $dates),
200
- 'total_orders_count' => $this->computeTotalOrdersCount($customerId, $dates),
201
- 'last_unordered_cart_amount' => $this->computeLastUnorderedCartAmount($customerId, $dates),
202
- 'last_unordered_cart_amount_with_vat' => $this->computeLastUnorderedCartAmount($customerId, $dates, true),
203
- 'discount_rule_count' => $this->computeDiscountRuleCount($customerId, $dates),
204
- 'first_order_date' => $this->getFirstOrderDate($customerId),
205
- 'last_order_date' => $this->getLastOrderDate($customerId),
206
- 'last_unordered_cart_date' => $this->getLastUnorderedCartDate($customerId),
207
- 'last_orders_range' => $this->getLastTwoOrdersRange($customerId),
208
- 'config' => $config,
209
- 'start_date' => ($config == $this::BEGIN_DATE) ? Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_date") : null,
 
 
 
 
 
 
 
 
 
 
 
 
210
  );
 
211
 
212
- $this->addData($data);
 
 
 
213
 
214
- if (is_array($dates) && !empty($dates) && array_key_exists('stop', $dates) && $dates['stop']) {
215
- $this->setData('orders_expire', $dates['stop']->format('Y-m-d H:i:s'));
216
  }
217
 
218
- $now = new \DateTime();
219
- $this->setData('updated_at', $now->format('Y-m-d H:i:s'));
220
 
221
- try {
222
- $this->save();
223
- } catch (Exception $e) {
224
- Mage::logException($e);
225
  }
226
- }
227
 
228
- public function compute($customerId)
229
- {
230
- $dates = $this->computeDataTtl($customerId);
231
- $config = Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_mode");
232
- $lastOrderDate = $this->getLastOrderDate($customerId, true);
233
- // load model
234
- $this->load($customerId);
235
 
236
  $now = new \DateTime();
237
  $this->addData(array(
238
- 'customer_id' => $customerId,
239
- 'first_order_amount' => $this->computeFirstOrderAmount($customerId),
240
- 'first_order_amount_with_vat' => $this->computeFirstOrderAmount($customerId, true),
241
- 'last_order_amount' => $this->computeLastOrderAmount($customerId),
242
- 'last_order_amount_with_vat' => $this->computeLastOrderAmount($customerId, true),
243
- 'total_orders_amount' => $this->computeTotalOrdersAmount($customerId, $dates),
244
- 'total_orders_amount_with_vat' => $this->computeTotalOrdersAmount($customerId, $dates, true),
245
- 'average_unique_product_count' => $this->computeAverageUniqueProductCount($customerId, $dates),
246
- 'average_product_count_by_command_line' => $this->computeAverageProductCountByCommandLine($customerId, $dates),
247
- 'total_product_count' => $this->computeTotalProductCount($customerId, $dates),
248
- 'total_orders_count' => $this->computeTotalOrdersCount($customerId, $dates),
249
- 'last_unordered_cart_amount' => $this->computeLastUnorderedCartAmount($customerId, $dates),
250
- 'last_unordered_cart_amount_with_vat' => $this->computeLastUnorderedCartAmount($customerId, $dates, true),
251
- 'discount_rule_count' => $this->computeDiscountRuleCount($customerId, $dates),
252
- 'last_orders_range' => $this->getLastTwoOrdersRange($customerId),
253
- 'first_order_date' => $this->getFirstOrderDate($customerId),
254
- 'last_order_date' => $this->getLastOrderDate($customerId),
255
- 'last_unordered_cart_date' => $this->getLastUnorderedCartDate($customerId),
256
  'config' => $config,
257
- 'start_date' => ($config == $this::BEGIN_DATE) ? Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_date") : null,
 
258
  ));
259
 
260
- if (is_array($dates) && !empty($dates) && array_key_exists('stop', $dates) && $dates['stop']) {
261
- $this->setData('orders_expire', $dates['stop']->format('Y-m-d H:i:s'));
262
- $this->setData('cart_expire', $dates['stop']->format('Y-m-d H:i:s'));
263
  }
264
 
265
- $this->setData('updated_at', $now->format('Y-m-d H:i:s'));
 
 
266
 
267
  try {
268
  $this->save();
@@ -271,139 +297,12 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
271
  }
272
  }
273
 
274
- public function onNewOrder(Varien_Event_Observer $event)
275
- {
276
- $currentOrder = null;
277
- /** @var Mage_Sales_Model_Order $currentOrder */
278
- if ($event) {
279
- $currentOrder = $event->getData('order');
280
- }
281
-
282
- if ($currentOrder) {
283
- $customerId = $currentOrder->getData('customer_id');
284
-
285
- if (!$customerId) {
286
- return;
287
- }
288
-
289
- $dates = $this->computeDataTtl($customerId);
290
-
291
- // load model
292
- $this->load($customerId);
293
-
294
- $now = new \DateTime();
295
- // full update
296
- if ($this->getData('customer_id') == null && $customerId != null) {
297
- $this->compute($customerId);
298
- } else {
299
- if ((in_array(Mage::getStoreConfig('dolist/dolist_v8/calculatedfieds_mode'), array(self::RANGE_1, self::RANGE_3, self::RANGE_6, self::RANGE_12, self::RANGE_24)) && $this->getData('orders_expire') == null) || ($this->getData('orders_expire') != null && strtotime($this->getData('orders_expire')) < $now->getTimestamp())) {
300
- $this->recompute($customerId);
301
- } else {
302
- $this->addData(array(
303
- "total_orders_amount" => $this->getData('total_orders_amount') + ($currentOrder->getData('grand_total') - $currentOrder->getData('tax_amount')),
304
- "total_orders_amount_with_vat" => $this->getData('total_orders_amount') + $currentOrder->getData('grand_total'),
305
- "average_unique_product_count" => $this->computeAverageUniqueProductCount($customerId, $dates),
306
- "average_product_count_by_command_line" => $this->computeAverageProductCountByCommandLine($customerId, $dates),
307
- "total_product_count" => $this->getData('total_product_count') + $currentOrder->getData('total_item_count'),
308
- "total_orders_count" => $this->getData('total_orders_count') + 1,
309
- "discount_rule_count" => $this->computeDiscountRuleCount($customerId, $dates),
310
- ));
311
- }
312
-
313
- if (!$this->getData('first_order_amount') || $this->getData('first_order_amount') == 0) {
314
- $this->setData('first_order_amount', $this->computeFirstOrderAmount($customerId));
315
- }
316
- if (!$this->getData('first_order_date')) {
317
- $this->setData('first_order_date', $this->getFirstOrderDate($customerId));
318
- }
319
-
320
- if (!$this->getData('first_order_amount_with_vat')) {
321
- $this->setData('first_order_amount_with_vat', $this->computeFirstOrderAmount($customerId, true));
322
- }
323
-
324
- if ($currentOrder) {
325
- $this->setData('last_order_amount', $this->computeLastOrderAmount($customerId));
326
- $this->setData('last_order_amount_with_vat', $this->computeLastOrderAmount($customerId, true));
327
- $this->setData('last_order_date', $this->getLastOrderDate($customerId, true));
328
- $this->setData('last_orders_range', (strtotime($currentOrder->getData('created_at')) - strtotime($this->getData('last_order_date'))) / 60 / 60 / 24);
329
- }
330
- $this->setData('updated_at', $now->format('Y-m-d H:i:s'));
331
- $this->setData('customer_id', $customerId);
332
- if (is_array($dates) && !empty($dates) && array_key_exists('stop', $dates) && $dates['stop']) {
333
- $this->setData('orders_expire', $dates['stop']->format('Y-m-d H:i:s'));
334
- }
335
- try {
336
- $this->save();
337
- } catch (Exception $e) {
338
- Mage::logException($e);
339
- }
340
- }
341
- }
342
- }
343
-
344
- public function onNewCart(Varien_Event_Observer $observer)
345
- {
346
- $customerId = null;
347
- if ($observer->hasData('quote_item')) {
348
- /** @var Mage_Sales_Model_Quote_Item $quoteItem */
349
- $quoteItem = $observer->getQuoteItem();
350
-
351
- if ($quoteItem->getQuote()->getCustomer()) {
352
- $customerId = $quoteItem->getQuote()->getCustomer()->getId();
353
- }
354
- } elseif ($observer->hasData('cart')) {
355
- /** @var Mage_Checkout_Model_Cart $cart */
356
- $cart = $observer->getData('cart');
357
-
358
- if ($cart->getQuote()->getCustomer()) {
359
- $customerId = $cart->getQuote()->getCustomer()->getId();
360
- }
361
- }
362
-
363
- if (!$customerId) {
364
- return;
365
- }
366
-
367
-
368
- /** @var Mage_Core_Model_Abstract $model */
369
- $model = Mage::getModel('dolist/dolistv8_calculatedfields');
370
-
371
- // load model
372
- $model->load($customerId);
373
-
374
- $now = new \DateTime();
375
-
376
- $dates = $this->computeDataTtl($customerId);
377
-
378
- if ($this->getData('customer_id') == null && $customerId != null) {
379
- $this->compute($customerId);
380
- } else {
381
- $model->addData(array(
382
- 'last_unordered_cart_amount' => $this->computeLastUnorderedCartAmount($customerId),
383
- 'last_unordered_cart_amount_with_vat' => $this->computeLastUnorderedCartAmount($customerId, true),
384
- 'last_unordered_cart_date' => $this->getLastUnorderedCartDate($customerId),
385
- 'updated_at' => $now->format('Y-m-d H:i:s')
386
- ));
387
-
388
- if (is_array($dates) && !empty($dates) && array_key_exists('stop', $dates) && $dates['stop']) {
389
- $model->setData("cart_expire", $dates['stop']->format('Y-m-d H:i:s'));
390
- }
391
-
392
- try {
393
- $model->save();
394
- } catch (Exception $e) {
395
- Mage::logException($e);
396
- }
397
- }
398
- }
399
-
400
  /**
401
- * @param $customerId
402
  * @param bool $withVat
403
  *
404
  * @return float
405
  */
406
- protected function computeFirstOrderAmount($customerId, $withVat = false)
407
  {
408
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountInclTax $model */
409
  $model = null;
@@ -413,16 +312,15 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
413
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_firstorderamountexcltax');
414
  }
415
 
416
- return $model->calculatedAttributeRequest($customerId);
417
  }
418
 
419
  /**
420
- * @param $customerId
421
  * @param bool $withVat
422
  *
423
  * @return float
424
  */
425
- protected function computeLastOrderAmount($customerId, $withVat = false)
426
  {
427
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountInclTax $model */
428
  $model = null;
@@ -431,17 +329,16 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
431
  else {
432
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_lastorderamountexcltax');
433
  }
434
- return $model->calculatedAttributeRequest($customerId);
435
  }
436
 
437
  /**
438
- * @param $customerId
439
  * @param array $dates
440
  * @param bool $withVat
441
  *
442
  * @return float
443
  */
444
- protected function computeTotalOrdersAmount($customerId, $dates = array(), $withVat = false)
445
  {
446
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountInclTax $model */
447
  $model = null;
@@ -451,18 +348,17 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
451
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_totalorderamountexcltax');
452
  }
453
 
454
- return $model->calculatedAttributeRequest($customerId, $dates);
455
  }
456
 
457
 
458
  /**
459
- * @param $customerId
460
  * @param array $dates
461
  * @param bool $withVat
462
  *
463
  * @return float
464
  */
465
- protected function computeAverageOrdersAmount($customerId, $dates = array(), $withVat = false)
466
  {
467
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountInclTax $model */
468
  $model = null;
@@ -472,7 +368,7 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
472
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgorderamountexcltax');
473
  }
474
 
475
- return $model->calculatedAttributeRequest($customerId, $dates);
476
  }
477
 
478
  public function getAvgOrdersAmount($withVat = false)
@@ -488,16 +384,16 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
488
  }
489
 
490
  /**
491
- * @param $customerId
492
  * @param array $dates
493
  *
494
  * @return float
495
  */
496
- protected function computeAverageProductCount($customerId, $dates = array())
497
  {
498
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbProductsPerOrder $model */
499
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgnbproductsperorder');
500
- return $model->calculatedAttributeRequest($customerId, $dates);
 
501
  }
502
 
503
  public function getAvgProductCount()
@@ -514,16 +410,16 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
514
  }
515
 
516
  /**
517
- * @param $customerId
518
  *
519
  * @param array $dates
520
  * @return float
521
  */
522
- protected function computeAverageUniqueProductCount($customerId, $dates = array())
523
  {
524
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProductsPerOrder $model */
525
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgnbdifferentproductsperorder');
526
- return $model->calculatedAttributeRequest($customerId, $dates);
 
527
  }
528
 
529
  /**
@@ -532,50 +428,48 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
532
  * @param array $dates
533
  * @return float
534
  */
535
- protected function computeAverageProductCountByCommandLine($customerId, $dates = array())
536
  {
537
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProductsPerOrderLine $model */
538
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgnbdifferentproductsperorderline');
539
 
540
- return $model->calculatedAttributeRequest($customerId, $dates);
541
  }
542
 
543
  /**
544
- * @param $customerId
545
  *
546
  * @param array $dates
547
  * @return float
548
  */
549
- protected function computeTotalProductCount($customerId, $dates = array())
550
  {
551
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderedProducts $model */
552
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_totalorderedproducts');
553
 
554
- return $model->calculatedAttributeRequest($customerId, $dates);
555
  }
556
 
557
  /**
558
- * @param $customerId
559
  *
560
  * @param array $dates
561
  * @return float
562
  */
563
- protected function computeTotalOrdersCount($customerId, $dates = array())
564
  {
565
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrders $model */
566
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_totalorders');
567
 
568
- return $model->calculatedAttributeRequest($customerId, $dates);
569
  }
570
 
571
  /**
572
- * @param $customerId
573
  * @param array $dates
574
  * @param bool $withVat
575
  *
576
  * @return float
577
  */
578
- protected function computeLastUnorderedCartAmount($customerId, $dates = array(), $withVat = false)
579
  {
580
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmountInclTax $model */
581
  $model = null;
@@ -585,55 +479,52 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
585
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_lastnotorderedcartamountexcltax');
586
  }
587
 
588
- return $model->calculatedAttributeRequest($customerId, $dates);
589
  }
590
 
591
  /**
592
- * @param $customerId
593
  *
594
  * @param array $dates
595
  * @return float
596
  */
597
- protected function computeDiscountRuleCount($customerId, $dates = array())
598
  {
599
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_NbPromotionRulesUsed $model */
600
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_nbpromotionrulesused');
601
 
602
- return $model->calculatedAttributeRequest($customerId, $dates);
603
  }
604
 
605
  /**
606
- * @param $customerId
607
  *
608
  * @return DateTime
609
  */
610
- protected function getFirstOrderDate($customerId)
611
  {
612
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_FirstOrder $model */
613
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_date_firstorder');
614
 
615
- return $model->calculatedAttributeRequest($customerId);
616
  }
617
 
618
  /**
619
- * @param $customerId
620
  *
621
  * @return DateTime
622
  */
623
- protected function getLastOrderDate($customerId)
624
  {
625
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastOrder $model */
626
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_date_lastorder');
627
 
628
- return $model->calculatedAttributeRequest($customerId);
629
  }
630
 
631
- public function getLastTwoOrdersRange($customerId)
632
  {
633
  $readAdapter = $this->_getReadAdapter();
634
 
635
  $tableName = null;
636
- if(Mage::helper('dolist')->isFlatTableEnabled()){
637
  $tableName = 'sales_flat_order';
638
  }else{
639
  $tableName = 'sales_order';
@@ -642,12 +533,12 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
642
  /** @var Varien_Db_Select $select */
643
  $select = $readAdapter->select();
644
  $select->from(array('o' => $this->getTable($tableName)), array('o.created_at'))
 
 
645
  ->order('o.created_at DESC')
646
- ->where('o.customer_id = ?', $customerId)
647
  ->limit(2)
648
  ;
649
 
650
-
651
  $data = $readAdapter->fetchAll($select);
652
 
653
  if(count($data) < 2) {
@@ -656,21 +547,19 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
656
 
657
  $diff = date_create_from_format('Y-m-d H:i:s', $data[1]['created_at'])->diff(date_create_from_format('Y-m-d H:i:s', $data[0]['created_at']));
658
 
659
-
660
  return $diff->days;
661
  }
662
 
663
  /**
664
- * @param $customerId
665
  *
666
  * @return DateTime
667
  */
668
- protected function getLastUnorderedCartDate($customerId)
669
  {
670
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastQuoteNotOrdered $model */
671
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_date_lastquotenotordered');
672
 
673
- return $model->calculatedAttributeRequest($customerId);
674
  }
675
 
676
  /**
@@ -695,4 +584,12 @@ class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstrac
695
  $tablePrefix = (string)Mage::getConfig()->getTablePrefix();
696
  return $tablePrefix . $tableName;
697
  }
 
 
 
 
 
 
 
 
698
  }
1
  <?php
2
 
3
+ /**
4
+ * Class Dolist_Net_Model_Dolistv8_Calculatedfields
5
+ *
6
+ * @method $this setStoreId(int $storeId)
7
+ */
8
  class Dolist_Net_Model_Dolistv8_Calculatedfields extends Mage_Core_Model_Abstract
9
  {
10
 
25
  $this->debug = true;
26
  }
27
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  public function getConfig()
29
  {
30
  return array(
62
  return false;
63
  }
64
 
65
+ /**
66
+ * @return Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields
67
+ */
68
+ public function getResource()
69
+ {
70
+ return parent::getResource();
71
+ }
72
+
73
  /**
74
  * @param $customerId
75
+ * @return $this
76
+ */
77
+ public function loadByCustomerId($customerId)
78
+ {
79
+ $this->getResource()->loadByCustomerId($this, $customerId);
80
+
81
+ return $this;
82
+ }
83
+
84
+ /**
85
+ * @param array $attribute
86
+ * @return mixed
87
+ */
88
+ public function getColumnValue($attribute)
89
+ {
90
+ $config = $this->getConfig();
91
+ $adapter = Mage::getModel($attribute['adapter']);
92
+
93
+ return $adapter->getExportedValue($this->getData($config[$attribute['field']]));
94
+ }
95
+
96
+ /**
97
  * @return array
98
  */
99
+ public function computeOrderDataTtl()
100
  {
101
  /**
102
  * FULL : ttl date is null
103
  * BEGIN : ttl is from beginDate to currentDate
104
  * RANGE_X : ttl is from currentDate - delay to currentDate
105
  */
106
+ $option = Mage::getStoreConfig('dolist/dolist_v8/calculatedfieds_mode', $this->getData('store_id'));
 
107
 
108
  if (!$option) {
109
  $option = 1;
116
  case self::FULL:
117
  break;
118
  case self::BEGIN_DATE:
119
+ $date = Mage::getStoreConfig('dolist/dolist_v8/calculatedfieds_date', $this->getData('store_id'));
120
  $timestamp = strtotime($date);
121
  $start = new \DateTime();
122
  $start->setTimestamp($timestamp);
124
  case self::RANGE_1:
125
  $delay = 1;
126
  $startDate = new \DateTime('-' . $delay . ' months');
127
+ $strDate = $this->getResource()->getFirstOrderDate($this->getData('customer_id'), $startDate);
 
 
128
  if ($strDate) {
129
  $startDate->setTimestamp(strtotime($strDate));
130
  $start = $startDate;
136
  case self::RANGE_3:
137
  $delay = 3;
138
  $startDate = new \DateTime('-' . $delay . ' months');
139
+ $strDate = $this->getResource()->getFirstOrderDate($this->getData('customer_id'), $startDate);
 
 
140
  if ($strDate) {
141
  $startDate->setTimestamp(strtotime($strDate));
142
  $start = $startDate;
148
  case self::RANGE_6:
149
  $delay = 6;
150
  $startDate = new \DateTime('-' . $delay . ' months');
151
+ $strDate = $this->getResource()->getFirstOrderDate($this->getData('customer_id'), $startDate);
 
 
152
  if ($strDate) {
153
  $startDate->setTimestamp(strtotime($strDate));
154
  $start = $startDate;
160
  case self::RANGE_12:
161
  $delay = 12;
162
  $startDate = new \DateTime('-' . $delay . ' months');
163
+ $strDate = $this->getResource()->getFirstOrderDate($this->getData('customer_id'), $startDate);
 
 
164
  if ($strDate) {
165
  $startDate->setTimestamp(strtotime($strDate));
166
  $start = $startDate;
172
  case self::RANGE_24:
173
  $delay = 24;
174
  $startDate = new \DateTime('-' . $delay . ' months');
175
+ $strDate = $this->getResource()->getFirstOrderDate($this->getData('customer_id'), $startDate);
 
 
176
  if ($strDate) {
177
  $startDate->setTimestamp(strtotime($strDate));
178
  $start = $startDate;
189
  );
190
  }
191
 
192
+ /**
193
+ * @return array
194
+ */
195
+ public function computeCartDataTtl()
196
  {
197
+ /**
198
+ * FULL : ttl date is null
199
+ * BEGIN : ttl is from beginDate to currentDate
200
+ * RANGE_X : ttl is from currentDate - delay to currentDate
201
+ */
202
+ $option = Mage::getStoreConfig('dolist/dolist_v8/calculatedfieds_mode', $this->getData('store_id'));
203
 
204
+ if (!$option) {
205
+ $option = 1;
206
+ }
207
+
208
+ $start = null;
209
+ $stop = null;
210
+
211
+ switch ($option) {
212
+ case self::FULL:
213
+ break;
214
+ case self::BEGIN_DATE:
215
+ $date = Mage::getStoreConfig('dolist/dolist_v8/calculatedfieds_date', $this->getData('store_id'));
216
+ $timestamp = strtotime($date);
217
+ $start = new \DateTime();
218
+ $start->setTimestamp($timestamp);
219
+ break;
220
+ case self::RANGE_1:
221
+ $start = new \DateTime('-1 months');
222
+ break;
223
+ case self::RANGE_3:
224
+ $start = new \DateTime('-3 months');
225
+ break;
226
+ case self::RANGE_6:
227
+ $start = new \DateTime('-6 months');
228
+ break;
229
+ case self::RANGE_12:
230
+ $start = new \DateTime('-12 months');
231
+ break;
232
+ case self::RANGE_24:
233
+ $start = new \DateTime('-24 months');
234
+ break;
235
+ }
236
+
237
+ return array(
238
+ 'start' => $start,
239
+ 'stop' => $stop
240
  );
241
+ }
242
 
243
+ public function compute()
244
+ {
245
+ if (!$this->hasData('customer_id')) {
246
+ Mage::logException(new Exception('Missing customer ID to compute'));
247
 
248
+ return;
 
249
  }
250
 
251
+ if (!$this->hasData('store_id')) {
252
+ Mage::logException(new Exception('Missing store ID to compute'));
253
 
254
+ return;
 
 
 
255
  }
 
256
 
257
+ $datesOrder = $this->computeOrderDataTtl();
258
+ $datesCart = $this->computeCartDataTtl();
259
+ $config = Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_mode", $this->getData('store_id'));
 
 
 
 
260
 
261
  $now = new \DateTime();
262
  $this->addData(array(
263
+ 'first_order_amount' => $this->computeFirstOrderAmount(),
264
+ 'first_order_amount_with_vat' => $this->computeFirstOrderAmount(true),
265
+ 'last_order_amount' => $this->computeLastOrderAmount(),
266
+ 'last_order_amount_with_vat' => $this->computeLastOrderAmount(true),
267
+ 'total_orders_amount' => $this->computeTotalOrdersAmount($datesOrder),
268
+ 'total_orders_amount_with_vat' => $this->computeTotalOrdersAmount($datesOrder, true),
269
+ 'average_unique_product_count' => $this->computeAverageUniqueProductCount($datesOrder),
270
+ 'average_product_count_by_command_line' => $this->computeAverageProductCountByCommandLine($datesOrder),
271
+ 'total_product_count' => $this->computeTotalProductCount($datesOrder),
272
+ 'total_orders_count' => $this->computeTotalOrdersCount($datesOrder),
273
+ 'last_unordered_cart_amount' => $this->computeLastUnorderedCartAmount($datesCart),
274
+ 'last_unordered_cart_amount_with_vat' => $this->computeLastUnorderedCartAmount($datesCart, true),
275
+ 'discount_rule_count' => $this->computeDiscountRuleCount(),
276
+ 'last_orders_range' => $this->getLastTwoOrdersRange(),
277
+ 'first_order_date' => $this->getFirstOrderDate(),
278
+ 'last_order_date' => $this->getLastOrderDate(),
279
+ 'last_unordered_cart_date' => $this->getLastUnorderedCartDate(),
 
280
  'config' => $config,
281
+ 'start_date' => ($config == $this::BEGIN_DATE) ? Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_date", $this->getData('store_id')) : null,
282
+ 'updated_at' => $now->format('Y-m-d H:i:s')
283
  ));
284
 
285
+ if (is_array($datesOrder) && !empty($datesOrder) && array_key_exists('stop', $datesOrder) && $datesOrder['stop']) {
286
+ $this->setData('orders_expire', $datesOrder['stop']->format('Y-m-d H:i:s'));
 
287
  }
288
 
289
+ if (is_array($datesCart) && !empty($datesCart) && array_key_exists('stop', $datesCart) && $datesCart['stop']) {
290
+ $this->setData('cart_expire', $datesCart['stop']->format('Y-m-d H:i:s'));
291
+ }
292
 
293
  try {
294
  $this->save();
297
  }
298
  }
299
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
300
  /**
 
301
  * @param bool $withVat
302
  *
303
  * @return float
304
  */
305
+ public function computeFirstOrderAmount($withVat = false)
306
  {
307
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountInclTax $model */
308
  $model = null;
312
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_firstorderamountexcltax');
313
  }
314
 
315
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'));
316
  }
317
 
318
  /**
 
319
  * @param bool $withVat
320
  *
321
  * @return float
322
  */
323
+ public function computeLastOrderAmount($withVat = false)
324
  {
325
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountInclTax $model */
326
  $model = null;
329
  else {
330
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_lastorderamountexcltax');
331
  }
332
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'));
333
  }
334
 
335
  /**
 
336
  * @param array $dates
337
  * @param bool $withVat
338
  *
339
  * @return float
340
  */
341
+ public function computeTotalOrdersAmount($dates = array(), $withVat = false)
342
  {
343
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountInclTax $model */
344
  $model = null;
348
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_totalorderamountexcltax');
349
  }
350
 
351
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
352
  }
353
 
354
 
355
  /**
 
356
  * @param array $dates
357
  * @param bool $withVat
358
  *
359
  * @return float
360
  */
361
+ public function computeAverageOrdersAmount($dates = array(), $withVat = false)
362
  {
363
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountInclTax $model */
364
  $model = null;
368
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgorderamountexcltax');
369
  }
370
 
371
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
372
  }
373
 
374
  public function getAvgOrdersAmount($withVat = false)
384
  }
385
 
386
  /**
 
387
  * @param array $dates
388
  *
389
  * @return float
390
  */
391
+ public function computeAverageProductCount($dates = array())
392
  {
393
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbProductsPerOrder $model */
394
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgnbproductsperorder');
395
+
396
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
397
  }
398
 
399
  public function getAvgProductCount()
410
  }
411
 
412
  /**
 
413
  *
414
  * @param array $dates
415
  * @return float
416
  */
417
+ public function computeAverageUniqueProductCount($dates = array())
418
  {
419
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProductsPerOrder $model */
420
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgnbdifferentproductsperorder');
421
+
422
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
423
  }
424
 
425
  /**
428
  * @param array $dates
429
  * @return float
430
  */
431
+ public function computeAverageProductCountByCommandLine($dates = array())
432
  {
433
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProductsPerOrderLine $model */
434
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_avgnbdifferentproductsperorderline');
435
 
436
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
437
  }
438
 
439
  /**
 
440
  *
441
  * @param array $dates
442
  * @return float
443
  */
444
+ public function computeTotalProductCount($dates = array())
445
  {
446
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderedProducts $model */
447
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_totalorderedproducts');
448
 
449
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
450
  }
451
 
452
  /**
 
453
  *
454
  * @param array $dates
455
  * @return float
456
  */
457
+ public function computeTotalOrdersCount($dates = array())
458
  {
459
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrders $model */
460
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_totalorders');
461
 
462
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
463
  }
464
 
465
  /**
466
+ *
467
  * @param array $dates
468
  * @param bool $withVat
469
  *
470
  * @return float
471
  */
472
+ public function computeLastUnorderedCartAmount($dates = array(), $withVat = false)
473
  {
474
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmountExclTax|Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmountInclTax $model */
475
  $model = null;
479
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_lastnotorderedcartamountexcltax');
480
  }
481
 
482
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'), $dates);
483
  }
484
 
485
  /**
 
486
  *
487
  * @param array $dates
488
  * @return float
489
  */
490
+ public function computeDiscountRuleCount()
491
  {
492
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_NbPromotionRulesUsed $model */
493
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_int_nbpromotionrulesused');
494
 
495
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'));
496
  }
497
 
498
  /**
 
499
  *
500
  * @return DateTime
501
  */
502
+ public function getFirstOrderDate()
503
  {
504
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_FirstOrder $model */
505
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_date_firstorder');
506
 
507
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'));
508
  }
509
 
510
  /**
 
511
  *
512
  * @return DateTime
513
  */
514
+ public function getLastOrderDate()
515
  {
516
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastOrder $model */
517
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_date_lastorder');
518
 
519
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'));
520
  }
521
 
522
+ public function getLastTwoOrdersRange()
523
  {
524
  $readAdapter = $this->_getReadAdapter();
525
 
526
  $tableName = null;
527
+ if($this->getDolistMainHelper()->isFlatTableEnabled()){
528
  $tableName = 'sales_flat_order';
529
  }else{
530
  $tableName = 'sales_order';
533
  /** @var Varien_Db_Select $select */
534
  $select = $readAdapter->select();
535
  $select->from(array('o' => $this->getTable($tableName)), array('o.created_at'))
536
+ ->where('o.customer_id=?', $this->getData('customer_id'))
537
+ ->where('o.store_id=?', $this->getData('store_id'))
538
  ->order('o.created_at DESC')
 
539
  ->limit(2)
540
  ;
541
 
 
542
  $data = $readAdapter->fetchAll($select);
543
 
544
  if(count($data) < 2) {
547
 
548
  $diff = date_create_from_format('Y-m-d H:i:s', $data[1]['created_at'])->diff(date_create_from_format('Y-m-d H:i:s', $data[0]['created_at']));
549
 
 
550
  return $diff->days;
551
  }
552
 
553
  /**
 
554
  *
555
  * @return DateTime
556
  */
557
+ public function getLastUnorderedCartDate()
558
  {
559
  /** @var Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastQuoteNotOrdered $model */
560
  $model = Mage::getModel('dolist_mysql4/dolistv8_export_adapter_date_lastquotenotordered');
561
 
562
+ return $model->calculatedAttributeRequest($this->getData('customer_id'), $this->getData('store_id'));
563
  }
564
 
565
  /**
584
  $tablePrefix = (string)Mage::getConfig()->getTablePrefix();
585
  return $tablePrefix . $tableName;
586
  }
587
+
588
+ /**
589
+ * @return Dolist_Net_Helper_Data
590
+ */
591
+ public function getDolistMainHelper()
592
+ {
593
+ return Mage::helper('dolist');
594
+ }
595
  }
app/code/community/Dolist/Net/Model/Exporter/Csv.php CHANGED
@@ -10,9 +10,6 @@
10
  */
11
  class Dolist_Net_Model_Exporter_Csv extends Varien_Object
12
  {
13
- private $_toExport;
14
- private $_dolistToExport;
15
-
16
  /**
17
  * Constructor
18
  *
@@ -21,73 +18,34 @@ class Dolist_Net_Model_Exporter_Csv extends Varien_Object
21
  protected function _construct()
22
  {
23
  parent::_construct();
24
- $this->_toExport = array();
25
  $this->setDelimiter(',');
26
  $this->setEnclosure('"');
27
  $this->setNoLineBreak(true);
28
  }
29
 
30
- /**
31
- * Adds an object to export
32
- *
33
- * format:
34
- * array(
35
- * 'prefix' => '<string>' /// prefix to put before all data fields (in header row)
36
- * 'object' => <Varien_Object>,
37
- * 'fields' => array('field1','field2'), /// if ommited all fields are exported
38
- * 'exclude' => array('field1','field2'), /// usefull if all fields but these must be exported
39
- * )
40
- *
41
- * @param array $objectArray Object to export
42
- *
43
- * @return Dolist_Net_Model_Exporter_Csv
44
- */
45
- public function addObjectToExport($objectArray)
46
- {
47
- $this->_toExport[] = $objectArray;
48
- return $this;
49
- }
50
-
51
- /**
52
- * Add subscriber to export queue
53
- *
54
- * @param Mage_Newsletter_Model_Subscriber $subscriber Newsletter subscriber
55
- * @param mixed $dolistv8SystemConfig Config
56
- *
57
- * @return Dolist_Net_Model_Exporter_Csv
58
- */
59
- public function setContactToExport($subscriber, $dolistv8SystemConfig)
60
- {
61
- $this->_dolistToExport = array(
62
- 'contact' => $subscriber,
63
- 'config' => $dolistv8SystemConfig
64
- );
65
- return $this;
66
- }
67
-
68
  /**
69
  * render all objects previously added to a CSV file
70
  *
71
  * @param string $filename Filename
 
 
 
72
  * @param mixed $addHeader auto => see $append, false => do not add, true => allways add
73
  * @param boolean $append if set to true and the file already exists the content is added at the end of the file
74
  * and the headers are not added (they are allready at the beginning of the file)
75
- * @param bool|string $specificHeader Specific header key
76
- * @param string $exportType Can be 'auto', or 'dolist'
77
- *
78
  * @param int $storeId
79
- * @throws Mage_Core_Exception
80
- * @return Smile_Interfaces_Model_Exporter_Csv
81
  */
82
- public function export($filename, $addHeader = 'auto', $append = true, $specificHeader = false, $exportType = 'auto', $storeId = 0)
83
  {
84
  $varienCsv = new Varien_File_Csv();
85
 
86
  $row = array();
87
  if ($exportType == 'auto') {
88
- $row = $this->_autoExportGetRow();
89
  } elseif ($exportType == 'dolist') {
90
- $row = $this->_dolistExportGetRow($storeId);
91
  }
92
 
93
  //open the file
@@ -112,12 +70,7 @@ class Dolist_Net_Model_Exporter_Csv extends Varien_Object
112
  $file = fopen($filename, $mode);
113
 
114
  // Prepare header every time (needed to prepare cells even if empty)
115
- $header = null;
116
- if ($specificHeader == false) {
117
- $header = array_keys($row);
118
- } else if ($specificHeader == 'contact_header') {
119
- $header = array_keys($this->getMapping(Mage::app()->getRequest()->getParam('store', $storeId)));
120
- }
121
 
122
  // but add the header only if needed
123
  if ($addHeader) {
@@ -143,8 +96,7 @@ class Dolist_Net_Model_Exporter_Csv extends Varien_Object
143
  fclose($file);
144
 
145
  } catch (Exception $e) {
146
- $this->_getHelper()->logDebug($e->__toString());
147
- Mage::throwException($e->getMessage());
148
  }
149
 
150
  return $this;
@@ -153,153 +105,194 @@ class Dolist_Net_Model_Exporter_Csv extends Varien_Object
153
  /**
154
  * Return row to export - automatic method
155
  *
 
156
  * @return array
157
  */
158
- protected function _autoExportGetRow()
159
  {
160
  $row = array();
161
  //fill the row
162
- $this->_getHelper(print_r($this->_toExport));
163
- foreach ($this->_toExport as $exportObj) {
164
- $this->_getHelper(print_r($exportObj));
165
- //transform this array in local variables to have a more readable code
166
- $obj = $exportObj['object'];
167
- $prefix = "";
168
- if (isset($exportObj['prefix'])) {
169
- $prefix = $exportObj['prefix'];
170
- }
171
- $fields = false;
172
- if (isset($exportObj['fields'])) {
173
- $fields = $exportObj['fields'];
174
- }
175
- $exclude = false;
176
- if (!$fields && isset($exportObj['exclude'])) {
177
- $exclude = $exportObj['exclude'];
178
- }
179
 
180
- //check all fields
181
- if ($fields !== false) {
182
- // only some fields must be added
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183
 
184
- foreach ($fields as $k) {
185
- $v = "-"; //avoid empty columns causing problems with the header
186
- if ($obj->hasData($k) && $obj->getData($k) != '') {
187
- $v = $obj->getData($k);
188
- }
189
- $row[$prefix . $k] = $this->_checkValueBeforeInsert($v);
190
  }
 
 
191
 
192
- } else {
193
- foreach ($obj->getData() as $k => $v) {
194
- $add = true;
195
 
196
- if ($exclude !== false) {
197
- //some fields musn't be exported
198
- $add = !array_key_exists($k, $exclude);
199
- }
200
 
201
- if ($add) {
202
- //add this field to the current row!
203
- $row[$prefix . $k] = $this->_checkValueBeforeInsert($v);
204
- }
205
  }
206
  }
207
  }
208
- return $row;
209
- }
210
 
211
- /**
212
- * @param $storeId
213
- * @return array
214
- */
215
- protected function getMapping($storeId)
216
- {
217
- /** @var Dolist_Net_Model_Dolistv8_Customfields $model */
218
- $model = Mage::getModel('dolist/dolistv8_customfields');
219
- return $model->getMapping($storeId);
220
  }
221
 
222
  /**
223
  * Return row to export - dolist method
224
  *
225
  * @param $storeId
 
226
  * @return array
227
  */
228
- protected function _dolistExportGetRow($storeId)
229
  {
230
  $row = array();
231
 
232
  $mappingConfig = $this->getMapping($storeId);
233
 
234
- $contact = $this->_dolistToExport['contact'];
235
-
236
  // If customer exists, load it
237
  /** @var Mage_Customer_Model_Customer $customer */
238
  $customer = null;
239
  $forceAbonneNewsletter = false;
240
 
 
 
 
241
  if (is_array($contact) && array_key_exists('customer_id', $contact) && filter_var($contact['customer_id'], FILTER_VALIDATE_INT) !== false) {
242
  $customer = Mage::getModel('customer/customer')->load($contact['customer_id']);
243
  } else {
244
- // If no customer exists, create a fictive customer (but DO NOT save it) with email, only in order to be exported
245
- $this->_getHelper()->logDebug('CustomerId : ' . $contact['customer_id']);
246
  $customer = Mage::getModel('customer/customer');
247
- $customer->setData('email', $contact['customer_id']);
248
 
249
- //
250
- $forceAbonneNewsletter = true;
251
- }
 
 
 
 
 
252
 
 
 
 
 
253
 
254
  /** @var Dolist_Net_Model_Dolistv8_Calculatedfields $dolistCalculatedFieldsModel */
255
  $dolistCalculatedFieldsModel = Mage::getModel('dolist/dolistv8_calculatedfields');
 
 
256
  $config = Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_mode", $storeId);
257
  $configStartDate = ($config == Dolist_Net_Model_Dolistv8_Calculatedfields::BEGIN_DATE) ? Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_date", $storeId) : null;
 
258
 
259
  foreach ($mappingConfig as $dolistHeader => $magentoAttributeCode) {
260
  $v = '';
261
- if ($dolistCalculatedFieldsModel->isCalculatedFieldConfig($magentoAttributeCode['field']) || $magentoAttributeCode['field'] == 'is_subscriber') {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  if (!$dolistCalculatedFieldsModel->getId()) {
263
- $dolistCalculatedFieldsModel->load($customer->getId());
264
-
265
- if (is_numeric($customer->getId())) {
266
- if (!$dolistCalculatedFieldsModel->getData('customer_id')) {
267
- $dolistCalculatedFieldsModel->compute($customer->getId());
268
- } elseif ($dolistCalculatedFieldsModel->getData('order_expire') && ($dolistCalculatedFieldsModel->getData('orders_expire')) <= time()) {
269
- $dolistCalculatedFieldsModel->recompute($customer->getId());
270
- } elseif ((!$dolistCalculatedFieldsModel->getData('first_order_amount') || $dolistCalculatedFieldsModel->getData('first_order_amount') == 0 || !$dolistCalculatedFieldsModel->getData('last_order_amount') || strlen($dolistCalculatedFieldsModel->getData('first_order_date')) > 0)) {
271
- $dolistCalculatedFieldsModel->recompute($customer->getId());
272
- } elseif ($dolistCalculatedFieldsModel->getData('config') != $config || $dolistCalculatedFieldsModel->getData('start_date') != $configStartDate) {
273
- // Calculated fields config has changed
274
- $dolistCalculatedFieldsModel->recompute($customer->getId());
275
- } elseif (strpos($magentoAttributeCode['field'], 'last_unordered_cart_') === 0) {
276
- // Always
277
- $dolistCalculatedFieldsModel->recompute($customer->getId());
278
- }
 
 
 
 
 
 
 
 
 
 
 
 
279
  }
280
  }
281
 
 
282
  if ($magentoAttributeCode['field'] == 'avg_order_amount_excl_tax') {
283
- $adapter = Mage::getModel($magentoAttributeCode['adapter']);
284
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getAvgOrdersAmount());
285
  } elseif ($magentoAttributeCode['field'] == 'avg_order_amount_incl_tax') {
286
- $adapter = Mage::getModel($magentoAttributeCode['adapter']);
287
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getAvgOrdersAmount(true));
288
  } elseif ($magentoAttributeCode['field'] == 'avg_nb_products_per_order') {
289
- $adapter = Mage::getModel($magentoAttributeCode['adapter']);
290
-
291
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getAvgProductCount());
292
-
293
- } elseif ($magentoAttributeCode['field'] == 'is_subscriber') {
294
- $adapter = Mage::getModel($magentoAttributeCode['adapter']);
295
- $subscriber = null;
296
- if (!$forceAbonneNewsletter) {
297
- $subscriber = Mage::getModel('newsletter/subscriber')->loadByEmail($customer->getEmail());
298
- }
299
-
300
- $v = $adapter->getExportedValue($forceAbonneNewsletter || $subscriber->getData('subscriber_status') == Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED ? $this->_getHelper()->__('newsletter subscriber') : $this->_getHelper()->__('not subscribed newsletter'));
301
  } else {
302
- $adapter = Mage::getModel($magentoAttributeCode['adapter']);
303
  // Calculated fields
304
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getData($magentoAttributeCode['field']));
305
  }
@@ -371,6 +364,17 @@ class Dolist_Net_Model_Exporter_Csv extends Varien_Object
371
  return $row;
372
  }
373
 
 
 
 
 
 
 
 
 
 
 
 
374
  /**
375
  * Check a value before inserting it into a CSV file
376
  *
10
  */
11
  class Dolist_Net_Model_Exporter_Csv extends Varien_Object
12
  {
 
 
 
13
  /**
14
  * Constructor
15
  *
18
  protected function _construct()
19
  {
20
  parent::_construct();
21
+
22
  $this->setDelimiter(',');
23
  $this->setEnclosure('"');
24
  $this->setNoLineBreak(true);
25
  }
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  /**
28
  * render all objects previously added to a CSV file
29
  *
30
  * @param string $filename Filename
31
+ * @param $contact
32
+ *
33
+ * @param string $exportType
34
  * @param mixed $addHeader auto => see $append, false => do not add, true => allways add
35
  * @param boolean $append if set to true and the file already exists the content is added at the end of the file
36
  * and the headers are not added (they are allready at the beginning of the file)
 
 
 
37
  * @param int $storeId
38
+ * @return $this
 
39
  */
40
+ public function export($filename, $contact, $exportType = 'auto', $addHeader = 'auto', $append = true, $storeId = 0)
41
  {
42
  $varienCsv = new Varien_File_Csv();
43
 
44
  $row = array();
45
  if ($exportType == 'auto') {
46
+ $row = $this->autoExportGetRow($contact);
47
  } elseif ($exportType == 'dolist') {
48
+ $row = $this->dolistExportGetRow($storeId, $contact);
49
  }
50
 
51
  //open the file
70
  $file = fopen($filename, $mode);
71
 
72
  // Prepare header every time (needed to prepare cells even if empty)
73
+ $header = array_keys($this->getMapping(Mage::app()->getRequest()->getParam('store', $storeId)));
 
 
 
 
 
74
 
75
  // but add the header only if needed
76
  if ($addHeader) {
96
  fclose($file);
97
 
98
  } catch (Exception $e) {
99
+ // file allready closed
 
100
  }
101
 
102
  return $this;
105
  /**
106
  * Return row to export - automatic method
107
  *
108
+ * @param $contact
109
  * @return array
110
  */
111
+ protected function autoExportGetRow($contact)
112
  {
113
  $row = array();
114
  //fill the row
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
 
116
+ //transform this array in local variables to have a more readable code
117
+ $obj = $contact['object'];
118
+ $prefix = "";
119
+ if (isset($contact['prefix'])) {
120
+ $prefix = $contact['prefix'];
121
+ }
122
+ $fields = false;
123
+ if (isset($contact['fields'])) {
124
+ $fields = $contact['fields'];
125
+ }
126
+ $exclude = false;
127
+ if (!$fields && isset($contact['exclude'])) {
128
+ $exclude = $contact['exclude'];
129
+ }
130
+
131
+ //check all fields
132
+ if ($fields !== false) {
133
+ // only some fields must be added
134
 
135
+ foreach ($fields as $k) {
136
+ $v = "-"; //avoid empty columns causing problems with the header
137
+ if ($obj->hasData($k) && $obj->getData($k) != '') {
138
+ $v = $obj->getData($k);
 
 
139
  }
140
+ $row[$prefix . $k] = $this->_checkValueBeforeInsert($v);
141
+ }
142
 
143
+ } else {
144
+ foreach ($obj->getData() as $k => $v) {
145
+ $add = true;
146
 
147
+ if ($exclude !== false) {
148
+ //some fields musn't be exported
149
+ $add = !array_key_exists($k, $exclude);
150
+ }
151
 
152
+ if ($add) {
153
+ //add this field to the current row!
154
+ $row[$prefix . $k] = $this->_checkValueBeforeInsert($v);
 
155
  }
156
  }
157
  }
 
 
158
 
159
+ return $row;
 
 
 
 
 
 
 
 
160
  }
161
 
162
  /**
163
  * Return row to export - dolist method
164
  *
165
  * @param $storeId
166
+ * @param $contact
167
  * @return array
168
  */
169
+ public function dolistExportGetRow($storeId, $contact)
170
  {
171
  $row = array();
172
 
173
  $mappingConfig = $this->getMapping($storeId);
174
 
 
 
175
  // If customer exists, load it
176
  /** @var Mage_Customer_Model_Customer $customer */
177
  $customer = null;
178
  $forceAbonneNewsletter = false;
179
 
180
+ /** @var Mage_Core_Model_Store $store */
181
+ $store = Mage::getModel('core/store')->load($storeId);
182
+
183
  if (is_array($contact) && array_key_exists('customer_id', $contact) && filter_var($contact['customer_id'], FILTER_VALIDATE_INT) !== false) {
184
  $customer = Mage::getModel('customer/customer')->load($contact['customer_id']);
185
  } else {
 
 
186
  $customer = Mage::getModel('customer/customer');
 
187
 
188
+ $customer->setWebsiteId($store->getWebsiteId());
189
+ $customer->loadByEmail($contact['customer_id']);
190
+
191
+ if (!$customer->getId()) {
192
+ // If no customer exists, create a fictive customer (but DO NOT save it) with email, only in order to be exported
193
+ $this->_getHelper()->logDebug('CustomerId : ' . $contact['customer_id']);
194
+ $customer = Mage::getModel('customer/customer');
195
+ $customer->setData('email', $contact['customer_id']);
196
 
197
+ //
198
+ $forceAbonneNewsletter = true;
199
+ }
200
+ }
201
 
202
  /** @var Dolist_Net_Model_Dolistv8_Calculatedfields $dolistCalculatedFieldsModel */
203
  $dolistCalculatedFieldsModel = Mage::getModel('dolist/dolistv8_calculatedfields');
204
+ $dolistCalculatedFieldsModel->setStoreId($storeId);
205
+
206
  $config = Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_mode", $storeId);
207
  $configStartDate = ($config == Dolist_Net_Model_Dolistv8_Calculatedfields::BEGIN_DATE) ? Mage::getStoreConfig("dolist/dolist_v8/calculatedfieds_date", $storeId) : null;
208
+ $computed = false;
209
 
210
  foreach ($mappingConfig as $dolistHeader => $magentoAttributeCode) {
211
  $v = '';
212
+ /** @var Dolist_Net_Model_Exporter_Adapter_Default $adapter */
213
+ $adapter = Mage::getModel($magentoAttributeCode['adapter']);
214
+
215
+ if ($magentoAttributeCode['field'] == 'is_subscriber') {
216
+ $subscriber = null;
217
+ if (!$forceAbonneNewsletter) {
218
+ $subscriber = $this->_getHelper()->loadSubscriberByCustomer($customer, $storeId);
219
+ }
220
+ else {
221
+ $subscriber = $this->_getHelper()->loadSubscriberByEmail($contact['customer_id'], $storeId);
222
+
223
+ }
224
+
225
+ // 0 : not subscribed
226
+ // 1 : subscribed
227
+ // 2 : unsubscribed
228
+ // 3 : dolist error
229
+ if ($subscriber && ($forceAbonneNewsletter || ($subscriber instanceof Mage_Newsletter_Model_Subscriber && strlen($subscriber->getData('subscriber_status')) != 0))) {
230
+ switch($subscriber->getData('subscriber_status')) {
231
+ case 0:
232
+ $v = 0;
233
+ break;
234
+ case Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED:
235
+ $v = 1;
236
+ break;
237
+ case Mage_Newsletter_Model_Subscriber::STATUS_UNSUBSCRIBED:
238
+ $v = 2;
239
+ break;
240
+ default:
241
+ $v = 3;
242
+ }
243
+ }
244
+ else {
245
+ $v = 0;
246
+ }
247
+
248
+ $v = $adapter->getExportedValue($v);
249
+
250
+ } else if ($customer->getId() && $dolistCalculatedFieldsModel->isCalculatedFieldConfig($magentoAttributeCode['field'])) {
251
+ if (!$dolistCalculatedFieldsModel->getId()) {
252
+ $this->_getHelper()->logDebug(sprintf('Try to load calculatedfields for customerId %s and store %s', $customer->getId(), $storeId));
253
+ $dolistCalculatedFieldsModel->loadByCustomerId($customer->getId());
254
+ }
255
+
256
  if (!$dolistCalculatedFieldsModel->getId()) {
257
+ $this->_getHelper()->logDebug('Missing calculatedfields. Create it');
258
+ $dolistCalculatedFieldsModel->compute();
259
+ $computed = true;
260
+ } elseif ($dolistCalculatedFieldsModel->getData('order_expire') && ($dolistCalculatedFieldsModel->getData('orders_expire')) <= time()) {
261
+ if (!$computed) {
262
+ $this->_getHelper()->logDebug('Calculatedfield is expired. Refresh it');
263
+ $dolistCalculatedFieldsModel->compute();
264
+ $computed = true;
265
+ }
266
+ } elseif ((!$dolistCalculatedFieldsModel->getData('first_order_amount') || $dolistCalculatedFieldsModel->getData('first_order_amount') == 0 || !$dolistCalculatedFieldsModel->getData('last_order_amount') || strlen($dolistCalculatedFieldsModel->getData('first_order_date')) > 0)) {
267
+ if (!$computed) {
268
+ $this->_getHelper()->logDebug('Calculatedfield is empty. Refresh it');
269
+ $dolistCalculatedFieldsModel->compute();
270
+ $computed = true;
271
+ }
272
+ } elseif ($dolistCalculatedFieldsModel->getData('config') != $config || $dolistCalculatedFieldsModel->getData('start_date') != $configStartDate) {
273
+ // Calculated fields config has changed
274
+ if (!$computed) {
275
+ $this->_getHelper()->logDebug('Calculatedfield config has changed. Refresh it');
276
+ $dolistCalculatedFieldsModel->compute();
277
+ $computed = true;
278
+ }
279
+ } elseif (strpos($magentoAttributeCode['field'], 'last_unordered_cart_') === 0) {
280
+ // Always
281
+ if (!$computed) {
282
+ $this->_getHelper()->logDebug('Unordered cart data used. Refresg calculatedfield');
283
+ $dolistCalculatedFieldsModel->compute();
284
+ $computed = true;
285
  }
286
  }
287
 
288
+
289
  if ($magentoAttributeCode['field'] == 'avg_order_amount_excl_tax') {
 
290
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getAvgOrdersAmount());
291
  } elseif ($magentoAttributeCode['field'] == 'avg_order_amount_incl_tax') {
 
292
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getAvgOrdersAmount(true));
293
  } elseif ($magentoAttributeCode['field'] == 'avg_nb_products_per_order') {
 
 
294
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getAvgProductCount());
 
 
 
 
 
 
 
 
 
295
  } else {
 
296
  // Calculated fields
297
  $v = $adapter->getExportedValue($dolistCalculatedFieldsModel->getData($magentoAttributeCode['field']));
298
  }
364
  return $row;
365
  }
366
 
367
+ /**
368
+ * @param $storeId
369
+ * @return array
370
+ */
371
+ protected function getMapping($storeId)
372
+ {
373
+ /** @var Dolist_Net_Model_Dolistv8_Customfields $model */
374
+ $model = Mage::getModel('dolist/dolistv8_customfields');
375
+ return $model->getMapping($storeId);
376
+ }
377
+
378
  /**
379
  * Check a value before inserting it into a CSV file
380
  *
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Calculatedfields.php CHANGED
@@ -9,7 +9,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields extends Mage_Core_Model_
9
  protected function _construct()
10
  {
11
  $this->_isPkAutoIncrement=false;
12
- $this->_init('dolist/dolistv8_calculatedfields', 'customer_id');
13
  }
14
 
15
  /**
@@ -41,4 +41,53 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Calculatedfields extends Mage_Core_Model_
41
  $row = $readAdapter->fetchOne($select);
42
  return $row;
43
  }
44
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  protected function _construct()
10
  {
11
  $this->_isPkAutoIncrement=false;
12
+ $this->_init('dolist/dolistv8_calculatedfields', 'id');
13
  }
14
 
15
  /**
41
  $row = $readAdapter->fetchOne($select);
42
  return $row;
43
  }
44
+
45
+ /**
46
+ * Retrieve select object for loading base entity row
47
+ *
48
+ * @param string $field
49
+ * @param mixed $value
50
+ * @param Mage_Core_Model_Abstract $object
51
+ * @return Varien_Db_Select
52
+ * @throws Exception
53
+ */
54
+ protected function _getLoadSelect($field, $value, $object)
55
+ {
56
+ $select = parent::_getLoadSelect($field, $value, $object);
57
+ if ($object->getStoreId()) {
58
+ $storeIdField = $this->_getReadAdapter()->quoteIdentifier(sprintf('%s.%s', $this->getMainTable(), 'store_id'));
59
+ $select->where($storeIdField . '=?', (int)$object->getStoreId());
60
+ }
61
+ else {
62
+ throw new \Exception('Unable to load calculated field without store_id');
63
+ }
64
+
65
+ return $select;
66
+ }
67
+
68
+ /**
69
+ * Load calculated field by customer id
70
+ * @param Dolist_Net_Model_Dolistv8_Calculatedfields $object
71
+ * @param $customerId
72
+ * @param bool $testOnly
73
+ * @return $this
74
+ * @throws Exception
75
+ */
76
+ public function loadByCustomerId(Dolist_Net_Model_Dolistv8_Calculatedfields $object, $customerId, $testOnly = false)
77
+ {
78
+ $adapter = $this->_getReadAdapter();
79
+ $select = $this->_getLoadSelect('customer_id', $customerId, $object);
80
+
81
+ $objectId = $adapter->fetchOne($select);
82
+ if ($objectId) {
83
+ $this->load($object, $objectId);
84
+ } else {
85
+ $object->setData(array(
86
+ 'store_id' => $object->getData('store_id'),
87
+ 'customer_id' => $customerId,
88
+ ));
89
+ }
90
+
91
+ return $this;
92
+ }
93
+ }
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Date/Firstorder.php CHANGED
@@ -11,66 +11,11 @@
11
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_FirstOrder extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
12
  {
13
  /**
14
- * Return value to display in export file for current field
15
- *
16
- * @param Mage_Customer_Model_Customer $customer Current customer
17
- * @param Varien_Object $config Config for this attribute
18
- *
19
- * @return string Exported value
20
  */
21
- public function getExportedValue($customer, $config)
22
- {
23
- // Load array from cache
24
- $serializedData = Mage::app()->loadCache(get_class($this));
25
- $cacheArray = unserialize($serializedData);
26
- $value = '';
27
-
28
- // Return value if in array
29
- if (is_array($cacheArray) && array_key_exists($customer->getEmail(), $cacheArray)) {
30
- $value = $cacheArray[$customer->getEmail()]['created_at'];
31
- $value = $this->formatDate($value);
32
- }
33
-
34
- return $value;
35
- }
36
-
37
- /**
38
- * Perform SQl request for calculated attribute and save result in cache
39
- * Call to this method is performed before exporting, to be done only once.
40
- *
41
- * @return void
42
- */
43
- public function performCalculatedAttributeRequest()
44
- {
45
- $readAdapter = $this->_getReadAdapter();
46
-
47
- if (Mage::helper('dolist')->isFlatTableEnabled()) {
48
- $tableName = 'sales_flat_order';
49
- $select = $readAdapter->select()
50
- ->from($this->getTable($tableName), array('customer_email', 'MIN(created_at) AS created_at'))
51
- ->group('customer_email');
52
- } else {
53
- $tableName = 'sales_order';
54
- $customerTableName = 'customer_entity';
55
- $select = $readAdapter->select()
56
- ->from(array('sa' => $this->getTable($tableName)), array('ce.email AS customer_email', 'MIN(sa.created_at) AS created_at'))
57
- ->join(
58
- array('ce' => $this->getTable($customerTableName)),
59
- "ce.entity_id=sa.customer_id",
60
- array()
61
- )
62
- ->group('customer_email');
63
- //SELECT ce.email as customer_email, min(o.created_at) as created_at FROM sales_order AS o INNER JOIN customer_entity ce ON ce.entity_id = o.customer_id GROUP BY o.customer_id;
64
- }
65
-
66
- $rows = $readAdapter->fetchAssoc($select, 'customer_email');
67
- $serializedData = serialize($rows);
68
-
69
- // Save array to cache: use class_name as cache key
70
- Mage::app()->saveCache($serializedData, get_class($this));
71
- }
72
-
73
- public function calculatedAttributeRequest($customerId)
74
  {
75
  $readAdapter = $this->_getReadAdapter();
76
 
@@ -86,7 +31,8 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_FirstOrder extends Do
86
  array(
87
  'date' => 'MIN(created_at)'
88
  ))
89
- ->where('o.customer_id = ?', $customerId);
 
90
 
91
  $row = $readAdapter->fetchOne($select);
92
  return $row;
11
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_FirstOrder extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
12
  {
13
  /**
14
+ * @param int $customerId
15
+ * @param int $storeId
16
+ * @return mixed
 
 
 
17
  */
18
+ public function calculatedAttributeRequest($customerId, $storeId)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  {
20
  $readAdapter = $this->_getReadAdapter();
21
 
31
  array(
32
  'date' => 'MIN(created_at)'
33
  ))
34
+ ->where('o.customer_id = ?', $customerId)
35
+ ->where('o.store_id = ?', $storeId);
36
 
37
  $row = $readAdapter->fetchOne($select);
38
  return $row;
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Date/Lastorder.php CHANGED
@@ -10,66 +10,11 @@
10
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastOrder extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
11
  {
12
  /**
13
- * Return value to display in export file for current field
14
- *
15
- * @param Mage_Customer_Model_Customer $customer Current customer
16
- * @param Varien_Object $config Config for this attribute
17
- *
18
- * @return void
19
  */
20
- public function getExportedValue($customer, $config)
21
- {
22
- // Load array from cache
23
- $serializedData = Mage::app()->loadCache(get_class($this));
24
- $cacheArray = unserialize($serializedData);
25
- $value = '';
26
-
27
- // Return value if in array
28
- if (is_array($cacheArray) && array_key_exists($customer->getEmail(), $cacheArray)) {
29
- $value = $cacheArray[$customer->getEmail()]['created_at'];
30
- $value = $this->formatDate($value);
31
- }
32
-
33
- return $value;
34
- }
35
-
36
- /**
37
- * Perform SQl request for calculated attribute and save result in cache
38
- * Call to this method is performed before exporting, to be done only once.
39
- *
40
- * @return void
41
- */
42
- public function performCalculatedAttributeRequest()
43
- {
44
- $readAdapter = $this->_getReadAdapter();
45
-
46
- if(Mage::helper('dolist')->isFlatTableEnabled()){
47
- $tableName = 'sales_flat_order';
48
- $select = $readAdapter->select()
49
- ->from($this->getTable($tableName), array('customer_email', 'MAX(created_at) AS created_at'))
50
- ->group('customer_email');
51
- }else{
52
- $tableName = 'sales_order';
53
- $customerTableName = 'customer_entity';
54
- $select = $readAdapter->select()
55
- ->from(array('sa' => $this->getTable($tableName)), array('ce.email AS customer_email', 'MAX(sa.created_at) AS created_at'))
56
- ->join(
57
- array('ce' => $this->getTable($customerTableName)),
58
- "ce.entity_id=sa.customer_id",
59
- array()
60
- )
61
- ->group('customer_email');
62
- //SELECT ce.email as customer_email, max(o.created_at) as created_at FROM sales_order AS o INNER JOIN customer_entity ce ON ce.entity_id = o.customer_id GROUP BY o.customer_id;
63
- }
64
-
65
- $rows = $readAdapter->fetchAssoc($select, 'customer_email');
66
- $serializedData = serialize($rows);
67
-
68
- // Save array to cache: use class_name as cache key
69
- Mage::app()->saveCache($serializedData, get_class($this));
70
- }
71
-
72
- public function calculatedAttributeRequest($customerId)
73
  {
74
  $readAdapter = $this->_getReadAdapter();
75
 
@@ -86,7 +31,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastOrder extends Dol
86
  'date'=>'MAX(created_at)'
87
  ))
88
  ->where('o.customer_id = ?', $customerId)
89
- ;
90
 
91
 
92
  $row = $readAdapter->fetchOne($select);
10
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastOrder extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
11
  {
12
  /**
13
+ * @param int $customerId
14
+ * @param int $storeId
15
+ * @return mixed
 
 
 
16
  */
17
+ public function calculatedAttributeRequest($customerId, $storeId)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
  {
19
  $readAdapter = $this->_getReadAdapter();
20
 
31
  'date'=>'MAX(created_at)'
32
  ))
33
  ->where('o.customer_id = ?', $customerId)
34
+ ->where('o.store_id = ?', $storeId);
35
 
36
 
37
  $row = $readAdapter->fetchOne($select);
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Date/Lastquotenotordered.php CHANGED
@@ -7,173 +7,18 @@
7
  * @copyright 2012 Dolist
8
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
  */
10
- class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastQuoteNotOrdered
11
- extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
12
  {
13
  /**
14
- * Return value to display in export file for current field
15
- *
16
- * @param Mage_Customer_Model_Customer $customer Current customer
17
- * @param Varien_Object $config Config for this attribute
18
- *
19
- * @return void
20
  */
21
- public function getExportedValue($customer, $config)
22
  {
23
- // Load array from cache
24
- $serializedData = Mage::app()->loadCache(get_class($this));
25
- $cacheArray = unserialize($serializedData);
26
- $value = '';
27
-
28
- // Return value if in array
29
- if (is_array($cacheArray) && array_key_exists($customer->getEmail(), $cacheArray)) {
30
- $value = $cacheArray[$customer->getEmail()]['created_at'];
31
- $value = $this->formatDate($value);
32
- }
33
-
34
- return $value;
35
- }
36
-
37
- /**
38
- * Perform SQl request for calculated attribute and save result in cache
39
- * Call to this method is performed before exporting, to be done only once.
40
- *
41
- * @return void
42
- */
43
- public function performCalculatedAttributeRequest()
44
- {
45
- $readAdapter = $this->_getReadAdapter();
46
-
47
- $quoteTableName = 'sales_flat_quote';
48
- $orderTableName = 'sales_flat_order';
49
- $customerTableName = 'customer_entity';
50
-
51
-
52
- if(Mage::helper('dolist')->isFlatTableEnabled()){
53
- // Nested request
54
- $nestedRequest = $readAdapter->select()
55
- ->from(
56
- array('q' => $this->getTable($quoteTableName)),
57
- array(
58
- 'q.entity_id AS quote_id',
59
- 'q.customer_id',
60
- 'q.created_at'
61
- )
62
- )
63
- ->joinLeft(
64
- array('o' => $this->getTable($orderTableName)),
65
- "q.entity_id=o.quote_id",
66
- array()
67
- )
68
- ->where('o.entity_id IS NULL')
69
- ->order('q.created_at DESC');
70
-
71
- $select = $readAdapter->select()
72
- ->from(
73
- array('l' => $nestedRequest),
74
- array(
75
- 'c.email AS customer_email',
76
- 'l.created_at'
77
- )
78
- )
79
- ->join(
80
- array('c' => $this->getTable($customerTableName)),
81
- "c.entity_id=l.customer_id",
82
- array()
83
- )
84
- ->group('l.customer_id');
85
-
86
- /*
87
- * MySQL request
88
- SELECT customer_entity.email, last_not_ordered_carts.created_at
89
- FROM
90
- (
91
- SELECT sales_flat_quote.entity_id AS quote_id, sales_flat_quote.customer_id, sales_flat_quote.created_at
92
- FROM sales_flat_quote
93
- LEFT JOIN sales_flat_order ON sales_flat_quote.entity_id = sales_flat_order.quote_id
94
- WHERE sales_flat_order.entity_id IS NULL
95
- ORDER BY sales_flat_quote.created_at DESC
96
- )
97
- AS last_not_ordered_carts
98
- INNER JOIN customer_entity ON customer_entity.entity_id = last_not_ordered_carts.customer_id
99
- GROUP BY last_not_ordered_carts.customer_id
100
- */
101
- }else{
102
- $quoteTableName = 'sales_flat_quote';
103
- $customerTableName = 'customer_entity';
104
- $orderTableName = 'sales_order';
105
- $attributeTableName = 'sales_order_int';
106
- $eavTableName = 'eav_attribute';
107
- $nestedRequest = $readAdapter->select()
108
- ->from(
109
- array('q' => $this->getTable($quoteTableName)),
110
- array(
111
- 'q.entity_id AS quote_id',
112
- 'q.customer_id',
113
- 'q.created_at'
114
- )
115
- )
116
- ->joinLeft(
117
- array('e' => $this->getTable($eavTableName)),
118
- "e.attribute_code='quote_id'",
119
- array()
120
- )
121
- ->joinLeft(
122
- array('a' => $this->getTable($attributeTableName)),
123
- "a.value=q.entity_id AND a.attribute_id = e.attribute_id",
124
- array()
125
- )
126
- ->joinLeft(
127
- array('o' => $this->getTable($orderTableName)),
128
- "a.entity_id=o.entity_id",
129
- array()
130
- )
131
- ->where('o.entity_id IS NULL')
132
- ->order('q.created_at DESC');
133
-
134
- $select = $readAdapter->select()
135
- ->from(
136
- array('l' => $nestedRequest),
137
- array(
138
- 'c.email AS customer_email',
139
- 'l.created_at'
140
- )
141
- )
142
- ->join(
143
- array('c' => $this->getTable($customerTableName)),
144
- "c.entity_id=l.customer_id",
145
- array()
146
- )
147
- ->group('l.customer_id');
148
-
149
- /*
150
- * MySQL request
151
- SELECT customer_entity.email, last_not_ordered_carts.created_at
152
- FROM
153
- (
154
- SELECT sales_flat_quote.entity_id AS quote_id, sales_flat_quote.customer_id, sales_flat_quote.created_at
155
- FROM sales_flat_quote
156
- LEFT JOIN sales_flat_order ON sales_flat_quote.entity_id = sales_flat_order.quote_id
157
- WHERE sales_flat_order.entity_id IS NULL
158
- ORDER BY sales_flat_quote.created_at DESC
159
- )
160
- AS last_not_ordered_carts
161
- INNER JOIN customer_entity ON customer_entity.entity_id = last_not_ordered_carts.customer_id
162
- GROUP BY last_not_ordered_carts.customer_id
163
- */
164
-
165
- }
166
-
167
- $rows = $readAdapter->fetchAssoc($select, 'customer_email');
168
- $serializedData = serialize($rows);
169
-
170
- // Save array to cache: use class_name as cache key
171
- Mage::app()->saveCache($serializedData, get_class($this));
172
- }
173
-
174
- public function calculatedAttributeRequest($customerId){
175
  $readAdapter = $this->_getReadAdapter();
176
  $quoteTableName = null;
 
177
  if (Mage::helper('dolist')->isFlatTableEnabled()) {
178
  $quoteTableName = 'sales_flat_quote';
179
  } else {
@@ -184,12 +29,14 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastQuoteNotOrdered
184
  ->from(
185
  array('q' => $this->getTable($quoteTableName)),
186
  array(
187
- 'q.created_at'
188
  )
189
  )
190
  ->where('q.customer_id = ?', $customerId)
191
- ->where('q.reserved_order_id IS NULL')
192
- ->order('q.created_at DESC');
 
 
193
 
194
  $row = $readAdapter->fetchOne($request);
195
  return $row;
7
  * @copyright 2012 Dolist
8
  * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
9
  */
10
+ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Date_LastQuoteNotOrdered extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
 
11
  {
12
  /**
13
+ * @param int $customerId
14
+ * @param int $storeId
15
+ * @return mixed
 
 
 
16
  */
17
+ public function calculatedAttributeRequest($customerId, $storeId)
18
  {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  $readAdapter = $this->_getReadAdapter();
20
  $quoteTableName = null;
21
+
22
  if (Mage::helper('dolist')->isFlatTableEnabled()) {
23
  $quoteTableName = 'sales_flat_quote';
24
  } else {
29
  ->from(
30
  array('q' => $this->getTable($quoteTableName)),
31
  array(
32
+ 'q.updated_at'
33
  )
34
  )
35
  ->where('q.customer_id = ?', $customerId)
36
+ ->where('q.is_active = 1')
37
+ ->where('q.items_count > 0')
38
+ ->where('q.store_id = ?', $storeId)
39
+ ->order('q.updated_at DESC');
40
 
41
  $row = $readAdapter->fetchOne($request);
42
  return $row;
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgnbdifferentproductsperorder.php CHANGED
@@ -13,10 +13,12 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProducts
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
- * @param $customerId
 
 
17
  * @return mixed
18
  */
19
- public function calculatedAttributeRequest($customerId, $dates = array())
20
  {
21
  $readAdapter = $this->_getReadAdapter();
22
 
@@ -31,7 +33,8 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProducts
31
  'AVG(o.total_item_count) AS avg_total_item_count'
32
  )
33
  )
34
- ->where('o.customer_id = ?', $customerId);
 
35
  } else {
36
  $orderTableName = 'sales_order';
37
  $orderItemTableName = 'sales_flat_order_item';
@@ -48,7 +51,8 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProducts
48
  "sf.order_id = o.entity_id",
49
  array()
50
  )
51
- ->where('o.customer_id = ?', $customerId);
 
52
  }
53
 
54
  if (!empty($dates)) {
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
+ * @param int $customerId
17
+ * @param int $storeId
18
+ * @param array $dates
19
  * @return mixed
20
  */
21
+ public function calculatedAttributeRequest($customerId, $storeId, $dates = array())
22
  {
23
  $readAdapter = $this->_getReadAdapter();
24
 
33
  'AVG(o.total_item_count) AS avg_total_item_count'
34
  )
35
  )
36
+ ->where('o.customer_id = ?', $customerId)
37
+ ->where('o.store_id = ?', $storeId);
38
  } else {
39
  $orderTableName = 'sales_order';
40
  $orderItemTableName = 'sales_flat_order_item';
51
  "sf.order_id = o.entity_id",
52
  array()
53
  )
54
+ ->where('o.customer_id = ?', $customerId)
55
+ ->where('o.store_id = ?', $storeId);
56
  }
57
 
58
  if (!empty($dates)) {
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgnbdifferentproductsperorderline.php CHANGED
@@ -13,10 +13,12 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProducts
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
- * @param $customerId
 
 
17
  * @return mixed
18
  */
19
- public function calculatedAttributeRequest($customerId, $dates=array())
20
  {
21
  $readAdapter = $this->_getReadAdapter();
22
 
@@ -32,7 +34,8 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProducts
32
  'AVG(total_qty_ordered / total_item_count) AS avg_products_per_line'
33
  )
34
  )
35
- ->where('o.customer_id = ?', $customerId);
 
36
  } else {
37
  $orderTableName = 'sales_order';
38
  $orderItemTableName = 'sales_flat_order_item';
@@ -48,7 +51,8 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbDifferentProducts
48
  "sf.order_id = o.entity_id",
49
  array()
50
  )
51
- ->where('o.customer_id = ?', $customerId);
 
52
  }
53
 
54
  if (!empty($dates)) {
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
+ * @param int $customerId
17
+ * @param int $storeId
18
+ * @param array $dates
19
  * @return mixed
20
  */
21
+ public function calculatedAttributeRequest($customerId, $storeId, $dates=array())
22
  {
23
  $readAdapter = $this->_getReadAdapter();
24
 
34
  'AVG(total_qty_ordered / total_item_count) AS avg_products_per_line'
35
  )
36
  )
37
+ ->where('o.customer_id = ?', $customerId)
38
+ ->where('o.store_id = ?', $storeId);
39
  } else {
40
  $orderTableName = 'sales_order';
41
  $orderItemTableName = 'sales_flat_order_item';
51
  "sf.order_id = o.entity_id",
52
  array()
53
  )
54
+ ->where('o.customer_id = ?', $customerId)
55
+ ->where('o.store_id = ?', $storeId);
56
  }
57
 
58
  if (!empty($dates)) {
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgnbproductsperorder.php CHANGED
@@ -13,8 +13,13 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbProductsPerOrder
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
 
16
  */
17
- public function calculatedAttributeRequest($customerId, $dates = array())
18
  {
19
  $readAdapter = $this->_getReadAdapter();
20
  $orderTableName = null;
@@ -33,6 +38,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgNbProductsPerOrder
33
  )
34
  )
35
  ->where('o.customer_id = ?', $customerId)
 
36
  ->order('o.created_at ASC');
37
 
38
  if (!empty($dates)) {
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
16
+ *
17
+ * @param $customerId
18
+ * @param array $dates
19
+ * @param $storeId
20
+ * @return
21
  */
22
+ public function calculatedAttributeRequest($customerId, $storeId, $dates = array())
23
  {
24
  $readAdapter = $this->_getReadAdapter();
25
  $orderTableName = null;
38
  )
39
  )
40
  ->where('o.customer_id = ?', $customerId)
41
+ ->where('o.store_id = ?', $storeId)
42
  ->order('o.created_at ASC');
43
 
44
  if (!empty($dates)) {
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgorderamountexcltax.php CHANGED
@@ -14,8 +14,13 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountExclTax
14
  /**
15
  * Perform SQl request for calculated attribute and save result in cache
16
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
 
17
  */
18
- public function calculatedAttributeRequest($customerId, $dates = array())
19
  {
20
  $readAdapter = $this->_getReadAdapter();
21
  $orderTableName = null;
@@ -34,6 +39,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountExclTax
34
  )
35
  )
36
  ->where('o.customer_id = ?', $customerId)
 
37
  ->order('o.created_at ASC');
38
 
39
  if (!empty($dates)) {
14
  /**
15
  * Perform SQl request for calculated attribute and save result in cache
16
  * Call to this method is performed before exporting, to be done only once.
17
+ *
18
+ * @param int $customerId
19
+ * @param int $storeId
20
+ * @param array $dates
21
+ * @return
22
  */
23
+ public function calculatedAttributeRequest($customerId, $storeId, $dates = array())
24
  {
25
  $readAdapter = $this->_getReadAdapter();
26
  $orderTableName = null;
39
  )
40
  )
41
  ->where('o.customer_id = ?', $customerId)
42
+ ->where('o.store_id = ?', $storeId)
43
  ->order('o.created_at ASC');
44
 
45
  if (!empty($dates)) {
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Avgorderamountincltax.php CHANGED
@@ -10,90 +10,12 @@
10
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountInclTax extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
11
  {
12
  /**
13
- * Return value to display in export file for current field
14
- *
15
- * @param Mage_Customer_Model_Customer $customer Current customer
16
- * @param Varien_Object $config Config for this attribute
17
- *
18
- * @return void
19
  */
20
- public function getExportedValue($customer, $config)
21
- {
22
- // Load array from cache
23
- $serializedData = Mage::app()->loadCache(get_class($this));
24
- $cacheArray = unserialize($serializedData);
25
- $value = '';
26
-
27
- // Return value if in array
28
- if (is_array($cacheArray) && array_key_exists($customer->getEmail(), $cacheArray)) {
29
- $value = $cacheArray[$customer->getEmail()]['avg_grand_total'];
30
- $value = $this->formatInt($value);
31
- }
32
-
33
- return $value;
34
- }
35
-
36
- /**
37
- * Perform SQl request for calculated attribute and save result in cache
38
- * Call to this method is performed before exporting, to be done only once.
39
- *
40
- * @return void
41
- */
42
- public function performCalculatedAttributeRequest()
43
- {
44
- $readAdapter = $this->_getReadAdapter();
45
-
46
- if(Mage::helper('dolist')->isFlatTableEnabled()){
47
- $orderTableName = 'sales_flat_order';
48
-
49
- // Nested request
50
- $select = $readAdapter->select()
51
- ->from(
52
- array('o' => $this->getTable($orderTableName)),
53
- array(
54
- 'o.customer_email AS customer_email',
55
- 'o.customer_id',
56
- 'AVG(o.grand_total) AS avg_grand_total'
57
- )
58
- )
59
- ->group('o.customer_id');
60
-
61
- /*
62
- * MySQL request
63
- SELECT o.customer_id, o.customer_email, AVG(o.subtotal), AVG(o.grand_total)
64
- FROM sales_flat_order AS o
65
- GROUP BY o.customer_id
66
- */
67
- }else{
68
- $orderTableName = 'sales_order';
69
- $customerTableName = 'customer_entity';
70
-
71
- // Nested request
72
- $select = $readAdapter->select()
73
- ->from(
74
- array('o' => $this->getTable($orderTableName)),
75
- array(
76
- 'ce.email AS customer_email',
77
- 'o.customer_id',
78
- 'AVG(o.grand_total) AS avg_grand_total'
79
- )
80
- )->join(
81
- array('ce' => $this->getTable($customerTableName)),
82
- "ce.entity_id=o.customer_id",
83
- array()
84
- )
85
- ->group('o.customer_id');
86
- //SELECT o.customer_id, ce.email as customer_email, AVG(o.grand_total) as avg_grand_total FROM sales_order AS o INNER JOIN customer_entity ce ON ce.entity_id = o.customer_id GROUP BY o.customer_id
87
- }
88
-
89
- $rows = $readAdapter->fetchAssoc($select, 'customer_email');
90
- $serializedData = serialize($rows);
91
-
92
- // Save array to cache: use class_name as cache key
93
- Mage::app()->saveCache($serializedData, get_class($this));
94
- }
95
-
96
- public function calculatedAttributeRequest($customerId, $dates=array())
97
  {
98
  $readAdapter = $this->_getReadAdapter();
99
  $orderTableName = null;
@@ -112,6 +34,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountInclTax
112
  )
113
  )
114
  ->where('o.customer_id = ?', $customerId)
 
115
  ->order('o.created_at ASC');
116
 
117
  if (!empty($dates)) {
10
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_AvgOrderAmountInclTax extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
11
  {
12
  /**
13
+ * @param int $customerId
14
+ * @param int $storeId
15
+ * @param array $dates
16
+ * @return mixed
 
 
17
  */
18
+ public function calculatedAttributeRequest($customerId, $storeId, $dates=array())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  {
20
  $readAdapter = $this->_getReadAdapter();
21
  $orderTableName = null;
34
  )
35
  )
36
  ->where('o.customer_id = ?', $customerId)
37
+ ->where('o.store_id = ?', $storeId)
38
  ->order('o.created_at ASC');
39
 
40
  if (!empty($dates)) {
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Firstorderamountexcltax.php CHANGED
@@ -10,16 +10,15 @@
10
  */
11
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountExclTax extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
12
  {
13
-
14
-
15
  /**
16
  * Perform SQl request for calculated attribute and save result in cache
17
  * Call to this method is performed before exporting, to be done only once.
18
  *
19
- * @param $customerId
 
20
  * @return mixed
21
  */
22
- public function calculatedAttributeRequest($customerId)
23
  {
24
  $readAdapter = $this->_getReadAdapter();
25
  $orderTableName = null;
@@ -38,6 +37,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountExclTa
38
  )
39
  )
40
  ->where('o.customer_id = ?', $customerId)
 
41
  ->order('o.created_at ASC');
42
 
43
  $row = $readAdapter->fetchOne($select);
10
  */
11
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountExclTax extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
12
  {
 
 
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
16
  *
17
+ * @param int $customerId
18
+ * @param int $storeId
19
  * @return mixed
20
  */
21
+ public function calculatedAttributeRequest($customerId, $storeId)
22
  {
23
  $readAdapter = $this->_getReadAdapter();
24
  $orderTableName = null;
37
  )
38
  )
39
  ->where('o.customer_id = ?', $customerId)
40
+ ->where('o.store_id = ?', $storeId)
41
  ->order('o.created_at ASC');
42
 
43
  $row = $readAdapter->fetchOne($select);
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Firstorderamountincltax.php CHANGED
@@ -15,8 +15,11 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountInclTa
15
  * Perform SQl request for calculated attribute and save result in cache
16
  * Call to this method is performed before exporting, to be done only once.
17
  *
 
 
 
18
  */
19
- public function calculatedAttributeRequest($customerId)
20
  {
21
  $readAdapter = $this->_getReadAdapter();
22
  $orderTableName = null;
@@ -34,6 +37,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_FirstOrderAmountInclTa
34
  )
35
  )
36
  ->where('o.customer_id = ?', $customerId)
 
37
  ->order('o.created_at ASC');
38
 
39
  $row = $readAdapter->fetchOne($select);
15
  * Perform SQl request for calculated attribute and save result in cache
16
  * Call to this method is performed before exporting, to be done only once.
17
  *
18
+ * @param int $customerId
19
+ * @param int $storeId
20
+ * @return
21
  */
22
+ public function calculatedAttributeRequest($customerId, $storeId)
23
  {
24
  $readAdapter = $this->_getReadAdapter();
25
  $orderTableName = null;
37
  )
38
  )
39
  ->where('o.customer_id = ?', $customerId)
40
+ ->where('o.store_id = ?', $storeId)
41
  ->order('o.created_at ASC');
42
 
43
  $row = $readAdapter->fetchOne($select);
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastnotorderedcartamountexcltax.php CHANGED
@@ -13,10 +13,11 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmou
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
- * @param $customerId
 
17
  * @return mixed
18
  */
19
- public function calculatedAttributeRequest($customerId)
20
  {
21
  $readAdapter = $this->_getReadAdapter();
22
 
@@ -31,15 +32,17 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmou
31
  ->from(
32
  array('q' => $this->getTable($quoteTableName)),
33
  array(
34
- 'q.subtotal'
35
  )
36
  )
37
  ->where('q.customer_id = ?', $customerId)
38
- ->where('q.reserved_order_id IS NULL')
39
- ->order('q.created_at DESC');
 
 
40
 
41
  $row = $readAdapter->fetchOne($request);
42
 
43
- return $row;
44
  }
45
  }
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
+ * @param int $customerId
17
+ * @param int $storeId
18
  * @return mixed
19
  */
20
+ public function calculatedAttributeRequest($customerId, $storeId)
21
  {
22
  $readAdapter = $this->_getReadAdapter();
23
 
32
  ->from(
33
  array('q' => $this->getTable($quoteTableName)),
34
  array(
35
+ 'q.base_subtotal_with_discount'
36
  )
37
  )
38
  ->where('q.customer_id = ?', $customerId)
39
+ ->where('q.is_active = 1')
40
+ ->where('q.items_count > 0')
41
+ ->where('q.store_id = ?', $storeId)
42
+ ->order('q.updated_at DESC');
43
 
44
  $row = $readAdapter->fetchOne($request);
45
 
46
+ return $row === false ? null : $row;
47
  }
48
  }
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastnotorderedcartamountincltax.php CHANGED
@@ -10,153 +10,11 @@
10
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmountInclTax extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
11
  {
12
  /**
13
- * Return value to display in export file for current field
14
- *
15
- * @param Mage_Customer_Model_Customer $customer Current customer
16
- * @param Varien_Object $config Config for this attribute
17
- *
18
- * @return void
19
- */
20
- public function getExportedValue($customer, $config)
21
- {
22
- // Load array from cache
23
- $serializedData = Mage::app()->loadCache(get_class($this));
24
- $cacheArray = unserialize($serializedData);
25
- $value = '';
26
-
27
- // Return value if in array
28
- if (is_array($cacheArray) && array_key_exists($customer->getEmail(), $cacheArray)) {
29
- $value = $cacheArray[$customer->getEmail()]['grand_total'];
30
- $value = $this->formatInt($value);
31
- }
32
-
33
- return $value;
34
- }
35
-
36
- /**
37
- * Perform SQl request for calculated attribute and save result in cache
38
- * Call to this method is performed before exporting, to be done only once.
39
- *
40
- * @return void
41
- */
42
- public function performCalculatedAttributeRequest()
43
- {
44
- $readAdapter = $this->_getReadAdapter();
45
-
46
-
47
- if(Mage::helper('dolist')->isFlatTableEnabled()){
48
- $quoteTableName = 'sales_flat_quote';
49
- $orderTableName = 'sales_flat_order';
50
- $customerTableName = 'customer_entity';
51
- // Nested request
52
- $nestedRequest = $readAdapter->select()
53
- ->from(
54
- array('q' => $this->getTable($quoteTableName)),
55
- array(
56
- 'q.entity_id AS quote_id',
57
- 'q.customer_id',
58
- 'q.grand_total'
59
- )
60
- )
61
- ->joinLeft(
62
- array('o' => $this->getTable($orderTableName)),
63
- "q.entity_id=o.quote_id",
64
- array()
65
- )
66
- ->where('o.entity_id IS NULL')
67
- ->order('q.created_at DESC');
68
-
69
- $select = $readAdapter->select()
70
- ->from(
71
- array('l' => $nestedRequest),
72
- array(
73
- 'c.email AS customer_email',
74
- 'l.grand_total'
75
- )
76
- )
77
- ->join(
78
- array('c' => $this->getTable($customerTableName)),
79
- "c.entity_id=l.customer_id",
80
- array()
81
- )
82
- ->group('l.customer_id');
83
-
84
- /*
85
- * MySQL request
86
- SELECT customer_entity.email, last_not_ordered_carts.grand_total, last_not_ordered_carts.subtotal
87
- FROM
88
- (
89
- SELECT q.grand_total, q.subtotal, q.customer_id
90
- FROM sales_flat_quote AS q
91
- LEFT JOIN sales_flat_order ON q.entity_id = sales_flat_order.quote_id
92
- WHERE sales_flat_order.entity_id IS NULL
93
- ORDER BY q.created_at DESC
94
- )
95
- AS last_not_ordered_carts
96
- INNER JOIN customer_entity ON customer_entity.entity_id = last_not_ordered_carts.customer_id
97
- */
98
- }else{
99
- $quoteTableName = 'sales_flat_quote';
100
- $customerTableName = 'customer_entity';
101
- $orderTableName = 'sales_order';
102
- $attributeTableName = 'sales_order_int';
103
- $eavTableName = 'eav_attribute';
104
- // Nested request
105
- $nestedRequest = $readAdapter->select()
106
- ->from(
107
- array('q' => $this->getTable($quoteTableName)),
108
- array(
109
- 'q.entity_id AS quote_id',
110
- 'q.customer_id',
111
- 'q.grand_total'
112
- )
113
- )
114
- ->joinLeft(
115
- array('e' => $this->getTable($eavTableName)),
116
- "e.attribute_code='quote_id'",
117
- array()
118
- )
119
- ->joinLeft(
120
- array('a' => $this->getTable($attributeTableName)),
121
- "a.value=q.entity_id AND a.attribute_id = e.attribute_id",
122
- array()
123
- )
124
- ->joinLeft(
125
- array('o' => $this->getTable($orderTableName)),
126
- "a.entity_id=o.entity_id",
127
- array()
128
- )
129
- ->where('o.entity_id IS NULL')
130
- ->order('q.created_at DESC');
131
-
132
- $select = $readAdapter->select()
133
- ->from(
134
- array('l' => $nestedRequest),
135
- array(
136
- 'c.email AS customer_email',
137
- 'l.grand_total'
138
- )
139
- )
140
- ->join(
141
- array('c' => $this->getTable($customerTableName)),
142
- "c.entity_id=l.customer_id",
143
- array()
144
- )
145
- ->group('l.customer_id');
146
- }
147
-
148
- $rows = $readAdapter->fetchAssoc($select, 'customer_email');
149
- $serializedData = serialize($rows);
150
-
151
- // Save array to cache: use class_name as cache key
152
- Mage::app()->saveCache($serializedData, get_class($this));
153
- }
154
-
155
- /**
156
- * @param $customerId
157
  * @return mixed
158
  */
159
- public function calculatedAttributeRequest($customerId)
160
  {
161
  $readAdapter = $this->_getReadAdapter();
162
  $quoteTableName = null;
@@ -166,18 +24,22 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmou
166
  $quoteTableName = 'sales_flat_quote';
167
  }
168
 
 
169
  $request = $readAdapter->select()
170
  ->from(
171
  array('q' => $this->getTable($quoteTableName)),
172
  array(
173
- 'q.grand_total'
174
  )
175
  )
176
  ->where('q.customer_id = ?', $customerId)
177
- ->where('q.reserved_order_id IS NULL')
178
- ->order('q.created_at DESC');
 
 
179
 
180
  $row = $readAdapter->fetchOne($request);
181
- return $row;
 
182
  }
183
  }
10
  class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastNotOrderedCartAmountInclTax extends Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Abstract
11
  {
12
  /**
13
+ * @param int $customerId
14
+ * @param int $storeId
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  * @return mixed
16
  */
17
+ public function calculatedAttributeRequest($customerId, $storeId)
18
  {
19
  $readAdapter = $this->_getReadAdapter();
20
  $quoteTableName = null;
24
  $quoteTableName = 'sales_flat_quote';
25
  }
26
 
27
+ /** @var Varien_Db_Select $request */
28
  $request = $readAdapter->select()
29
  ->from(
30
  array('q' => $this->getTable($quoteTableName)),
31
  array(
32
+ 'subtotal' => '(q.base_subtotal_with_discount*q.base_to_global_rate)',
33
  )
34
  )
35
  ->where('q.customer_id = ?', $customerId)
36
+ ->where('q.is_active = 1')
37
+ ->where('q.items_count > 0')
38
+ ->where('q.store_id = ?', $storeId)
39
+ ->order('q.updated_at DESC');
40
 
41
  $row = $readAdapter->fetchOne($request);
42
+
43
+ return $row === false ? null : $row;
44
  }
45
  }
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastorderamountexcltax.php CHANGED
@@ -12,8 +12,12 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountExclTax
12
  /**
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
15
  */
16
- public function calculatedAttributeRequest($customerId)
17
  {
18
  $readAdapter = $this->_getReadAdapter();
19
  $orderTableName = null;
@@ -32,6 +36,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountExclTax
32
  )
33
  )
34
  ->where('o.customer_id = ?', $customerId)
 
35
  ->order('o.created_at DESC');
36
 
37
  $row = $readAdapter->fetchOne($select);
12
  /**
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
+ *
16
+ * @param int $customerId
17
+ * @param int $storeId
18
+ * @return
19
  */
20
+ public function calculatedAttributeRequest($customerId, $storeId)
21
  {
22
  $readAdapter = $this->_getReadAdapter();
23
  $orderTableName = null;
36
  )
37
  )
38
  ->where('o.customer_id = ?', $customerId)
39
+ ->where('o.store_id = ?', $storeId)
40
  ->order('o.created_at DESC');
41
 
42
  $row = $readAdapter->fetchOne($select);
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Lastorderamountincltax.php CHANGED
@@ -13,10 +13,11 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountInclTax
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
- * @param $customerId
 
17
  * @return mixed
18
  */
19
- public function calculatedAttributeRequest($customerId)
20
  {
21
  $readAdapter = $this->_getReadAdapter();
22
  $orderTableName = null;
@@ -34,6 +35,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_LastOrderAmountInclTax
34
  )
35
  )
36
  ->where('o.customer_id = ?', $customerId)
 
37
  ->order('o.created_at DESC');
38
 
39
 
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
  *
16
+ * @param int $customerId
17
+ * @param int $storeId
18
  * @return mixed
19
  */
20
+ public function calculatedAttributeRequest($customerId, $storeId)
21
  {
22
  $readAdapter = $this->_getReadAdapter();
23
  $orderTableName = null;
35
  )
36
  )
37
  ->where('o.customer_id = ?', $customerId)
38
+ ->where('o.store_id = ?', $storeId)
39
  ->order('o.created_at DESC');
40
 
41
 
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Nbpromotionrulesused.php CHANGED
@@ -12,8 +12,12 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_NbPromotionRulesUsed e
12
  /**
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
15
  */
16
- public function calculatedAttributeRequest($customerId)
17
  {
18
  $readAdapter = $this->_getReadAdapter();
19
 
@@ -31,6 +35,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_NbPromotionRulesUsed e
31
 
32
 
33
  $row = $readAdapter->fetchOne($select);
34
- return $row;
 
35
  }
36
  }
12
  /**
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
+ *
16
+ * @param int $customerId
17
+ * @param int $storeId
18
+ * @return
19
  */
20
+ public function calculatedAttributeRequest($customerId, $storeId)
21
  {
22
  $readAdapter = $this->_getReadAdapter();
23
 
35
 
36
 
37
  $row = $readAdapter->fetchOne($select);
38
+
39
+ return $row !== null ? $row : 0;
40
  }
41
  }
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorderamountexcltax.php CHANGED
@@ -13,8 +13,13 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountExclTa
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
 
16
  */
17
- public function calculatedAttributeRequest($customerId, $dates=array())
18
  {
19
  $readAdapter = $this->_getReadAdapter();
20
  $orderTableName = null;
@@ -33,6 +38,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountExclTa
33
  )
34
  )
35
  ->where('o.customer_id = ?', $customerId)
 
36
  ->order('o.created_at ASC');
37
 
38
  if (!empty($dates)) {
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
16
+ *
17
+ * @param int $customerId
18
+ * @param int $storeId
19
+ * @param array $dates
20
+ * @return
21
  */
22
+ public function calculatedAttributeRequest($customerId, $storeId, $dates=array())
23
  {
24
  $readAdapter = $this->_getReadAdapter();
25
  $orderTableName = null;
38
  )
39
  )
40
  ->where('o.customer_id = ?', $customerId)
41
+ ->where('o.store_id = ?', $storeId)
42
  ->order('o.created_at ASC');
43
 
44
  if (!empty($dates)) {
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorderamountincltax.php CHANGED
@@ -13,8 +13,13 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountInclTa
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
 
16
  */
17
- public function calculatedAttributeRequest($customerId, $dates = array())
18
  {
19
  $readAdapter = $this->_getReadAdapter();
20
  $orderTableName = null;
@@ -32,7 +37,9 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountInclTa
32
  'total' => 'SUM(o.grand_total)'
33
  )
34
  )
35
- ->where('o.customer_id = ?', $customerId);
 
 
36
 
37
 
38
  if (!empty($dates)) {
@@ -44,8 +51,6 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderAmountInclTa
44
  }
45
  }
46
 
47
- $select->order('o.created_at ASC');
48
-
49
  $row = $readAdapter->fetchOne($select);
50
  return $row;
51
  }
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
16
+ *
17
+ * @param int $customerId
18
+ * @param int $storeId
19
+ * @param array $dates
20
+ * @return
21
  */
22
+ public function calculatedAttributeRequest($customerId, $storeId, $dates = array())
23
  {
24
  $readAdapter = $this->_getReadAdapter();
25
  $orderTableName = null;
37
  'total' => 'SUM(o.grand_total)'
38
  )
39
  )
40
+ ->where('o.customer_id = ?', $customerId)
41
+ ->where('o.store_id = ?', $storeId)
42
+ ->order('o.created_at ASC');
43
 
44
 
45
  if (!empty($dates)) {
51
  }
52
  }
53
 
 
 
54
  $row = $readAdapter->fetchOne($select);
55
  return $row;
56
  }
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorderedproducts.php CHANGED
@@ -12,17 +12,24 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderedProducts e
12
  /**
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
 
15
  */
16
- public function calculatedAttributeRequest($customerId, $dates = array())
17
  {
18
  $readAdapter = $this->_getReadAdapter();
19
  $orderTableName = null;
 
20
  if (Mage::helper('dolist')->isFlatTableEnabled()) {
21
  $orderTableName = 'sales_flat_order';
22
 
23
  } else {
24
  $orderTableName = 'sales_order';
25
  }
 
26
  $select = $readAdapter
27
  ->select()
28
  ->from(
@@ -32,6 +39,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderedProducts e
32
  )
33
  )
34
  ->where('o.customer_id = ?', $customerId)
 
35
  ->order('o.created_at ASC');
36
 
37
  if (!empty($dates)) {
@@ -42,6 +50,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrderedProducts e
42
  $select->where('o.created_at < ?', $dates['stop']->format('Y-m-d H:i:s'));
43
  }
44
  }
 
45
  $row = $readAdapter->fetchOne($select);
46
  return $row;
47
  }
12
  /**
13
  * Perform SQl request for calculated attribute and save result in cache
14
  * Call to this method is performed before exporting, to be done only once.
15
+ *
16
+ * @param int $customerId
17
+ * @param int $storeId
18
+ * @param array $dates
19
+ * @return
20
  */
21
+ public function calculatedAttributeRequest($customerId, $storeId, $dates = array())
22
  {
23
  $readAdapter = $this->_getReadAdapter();
24
  $orderTableName = null;
25
+
26
  if (Mage::helper('dolist')->isFlatTableEnabled()) {
27
  $orderTableName = 'sales_flat_order';
28
 
29
  } else {
30
  $orderTableName = 'sales_order';
31
  }
32
+
33
  $select = $readAdapter
34
  ->select()
35
  ->from(
39
  )
40
  )
41
  ->where('o.customer_id = ?', $customerId)
42
+ ->where('o.store_id = ?', $storeId)
43
  ->order('o.created_at ASC');
44
 
45
  if (!empty($dates)) {
50
  $select->where('o.created_at < ?', $dates['stop']->format('Y-m-d H:i:s'));
51
  }
52
  }
53
+
54
  $row = $readAdapter->fetchOne($select);
55
  return $row;
56
  }
app/code/community/Dolist/Net/Model/Mysql4/Dolistv8/Export/Adapter/Int/Totalorders.php CHANGED
@@ -13,17 +13,24 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrders extends Do
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
 
 
 
 
 
16
  */
17
- public function calculatedAttributeRequest($customerId, $dates = array())
18
  {
19
  $readAdapter = $this->_getReadAdapter();
20
  $orderTableName = null;
 
21
  if (Mage::helper('dolist')->isFlatTableEnabled()) {
22
  $orderTableName = 'sales_flat_order';
23
 
24
  } else {
25
  $orderTableName = 'sales_order';
26
  }
 
27
  $select = $readAdapter
28
  ->select()
29
  ->from(
@@ -33,6 +40,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrders extends Do
33
  )
34
  )
35
  ->where('o.customer_id = ?', $customerId)
 
36
  ->order('o.created_at ASC');
37
 
38
  if (!empty($dates)) {
@@ -43,6 +51,7 @@ class Dolist_Net_Model_Mysql4_Dolistv8_Export_Adapter_Int_TotalOrders extends Do
43
  $select->where('o.created_at < ?', $dates['stop']->format('Y-m-d H:i:s'));
44
  }
45
  }
 
46
  $row = $readAdapter->fetchOne($select);
47
  return $row;
48
  }
13
  /**
14
  * Perform SQl request for calculated attribute and save result in cache
15
  * Call to this method is performed before exporting, to be done only once.
16
+ *
17
+ * @param int $customerId
18
+ * @param int $storeId
19
+ * @param array $dates
20
+ * @return
21
  */
22
+ public function calculatedAttributeRequest($customerId, $storeId, $dates = array())
23
  {
24
  $readAdapter = $this->_getReadAdapter();
25
  $orderTableName = null;
26
+
27
  if (Mage::helper('dolist')->isFlatTableEnabled()) {
28
  $orderTableName = 'sales_flat_order';
29
 
30
  } else {
31
  $orderTableName = 'sales_order';
32
  }
33
+
34
  $select = $readAdapter
35
  ->select()
36
  ->from(
40
  )
41
  )
42
  ->where('o.customer_id = ?', $customerId)
43
+ ->where('o.store_id = ?', $storeId)
44
  ->order('o.created_at ASC');
45
 
46
  if (!empty($dates)) {
51
  $select->where('o.created_at < ?', $dates['stop']->format('Y-m-d H:i:s'));
52
  }
53
  }
54
+
55
  $row = $readAdapter->fetchOne($select);
56
  return $row;
57
  }
app/code/community/Dolist/Net/Model/Observer.php CHANGED
@@ -12,7 +12,81 @@ class Dolist_Net_Model_Observer extends Mage_Core_Model_Abstract
12
  const SEND_MESSAGE_PROCESS_ID = 'dolist_send_message';
13
 
14
  protected $_processes = array();
15
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  /**
17
  * List all queued messages and send its
18
  *
@@ -295,6 +369,41 @@ class Dolist_Net_Model_Observer extends Mage_Core_Model_Abstract
295
 
296
  return $this;
297
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
298
 
299
 
300
  /**
12
  const SEND_MESSAGE_PROCESS_ID = 'dolist_send_message';
13
 
14
  protected $_processes = array();
15
+
16
+ /**
17
+ * Update calculatedfields table on new order
18
+ *
19
+ * @param Varien_Event_Observer $event
20
+ */
21
+ public function onNewOrder(Varien_Event_Observer $event)
22
+ {
23
+ $currentOrder = null;
24
+ /** @var Mage_Sales_Model_Order $currentOrder */
25
+ if ($event) {
26
+ $currentOrder = $event->getData('order');
27
+ }
28
+
29
+ if ($currentOrder) {
30
+ $customerId = $currentOrder->getData('customer_id');
31
+
32
+ if (!$customerId) {
33
+ return;
34
+ }
35
+
36
+ /** @var Dolist_Net_Model_Dolistv8_Calculatedfields $calculatedFields */
37
+ $calculatedFields = Mage::getModel('dolist/dolistv8_calculatedfields');
38
+ $calculatedFields->setStoreId($currentOrder->getStoreId())->loadByCustomerId($customerId);
39
+
40
+ $dates = $calculatedFields->computeOrderDataTtl();
41
+ $now = new DateTime('now');
42
+
43
+ // full update
44
+ if (!$calculatedFields->getId()) {
45
+ $calculatedFields->compute();
46
+ } else {
47
+ if ((in_array(Mage::getStoreConfig('dolist/dolist_v8/calculatedfieds_mode'), array(Dolist_Net_Model_Dolistv8_Calculatedfields::RANGE_1, Dolist_Net_Model_Dolistv8_Calculatedfields::RANGE_3, Dolist_Net_Model_Dolistv8_Calculatedfields::RANGE_6, Dolist_Net_Model_Dolistv8_Calculatedfields::RANGE_12, Dolist_Net_Model_Dolistv8_Calculatedfields::RANGE_24)) && $calculatedFields->getData('orders_expire') == null) || ($calculatedFields->getData('orders_expire') != null && strtotime($calculatedFields->getData('orders_expire')) < $now->getTimestamp())) {
48
+ $calculatedFields->compute();
49
+ } else {
50
+ $calculatedFields->addData(array(
51
+ "total_orders_amount" => $calculatedFields->getData('total_orders_amount') + ($currentOrder->getData('grand_total') - $currentOrder->getData('tax_amount')),
52
+ "total_orders_amount_with_vat" => $calculatedFields->getData('total_orders_amount') + $currentOrder->getData('grand_total'),
53
+ "average_unique_product_count" => $calculatedFields->computeAverageUniqueProductCount($dates),
54
+ "average_product_count_by_command_line" => $calculatedFields->computeAverageProductCountByCommandLine($dates),
55
+ "total_product_count" => $calculatedFields->getData('total_product_count') + $currentOrder->getData('total_item_count'),
56
+ "total_orders_count" => $calculatedFields->getData('total_orders_count') + 1,
57
+ "discount_rule_count" => $calculatedFields->computeDiscountRuleCount(),
58
+ ));
59
+ }
60
+
61
+ if (!$calculatedFields->getData('first_order_amount') || $calculatedFields->getData('first_order_amount') == 0) {
62
+ $calculatedFields->setData('first_order_amount', $calculatedFields->computeFirstOrderAmount());
63
+ }
64
+ if (!$calculatedFields->getData('first_order_date')) {
65
+ $calculatedFields->setData('first_order_date', $calculatedFields->getFirstOrderDate());
66
+ }
67
+
68
+ if (!$calculatedFields->getData('first_order_amount_with_vat')) {
69
+ $calculatedFields->setData('first_order_amount_with_vat', $calculatedFields->computeFirstOrderAmount(true));
70
+ }
71
+
72
+ $calculatedFields->setData('last_order_amount', $calculatedFields->computeLastOrderAmount());
73
+ $calculatedFields->setData('last_order_amount_with_vat', $calculatedFields->computeLastOrderAmount(true));
74
+ $calculatedFields->setData('last_order_date', $calculatedFields->getLastOrderDate());
75
+ $calculatedFields->setData('last_orders_range', (strtotime($currentOrder->getData('created_at')) - strtotime($calculatedFields->getData('last_order_date'))) / 60 / 60 / 24);
76
+ $calculatedFields->setData('updated_at', $now->format('Y-m-d H:i:s'));
77
+
78
+ if (is_array($dates) && !empty($dates) && array_key_exists('stop', $dates) && $dates['stop']) {
79
+ $calculatedFields->setData('orders_expire', $dates['stop']->format('Y-m-d H:i:s'));
80
+ }
81
+ try {
82
+ $calculatedFields->save();
83
+ } catch (Exception $e) {
84
+ Mage::logException($e);
85
+ }
86
+ }
87
+ }
88
+ }
89
+
90
  /**
91
  * List all queued messages and send its
92
  *
369
 
370
  return $this;
371
  }
372
+
373
+ public function cronSegmentExport()
374
+ {
375
+
376
+ $this->_getHelper()->logDebug('Starting Segments export');
377
+ $process = new Mage_Index_Model_Process();
378
+ $process->setId("segment_export");
379
+ if($process->isLocked()){
380
+ $this->_getHelper()->logError('segment_export is locked');
381
+ return;
382
+ }
383
+ $process->lockAndBlock();
384
+
385
+ $segments = Mage::getModel('enterprise_customersegment/segment')->getCollection();
386
+
387
+ /* @var $segment Dolist_Net_Model_Customersegment */
388
+ foreach ($segments as $segment) {
389
+ $exportSuccess = FALSE;
390
+ if($this->_getHelper()->isSegmentExportCronEnabled($segment->getId())) {
391
+ $this->_getHelper()->logDebug('segment ' . $segment->getName() .' export is set to be processed by cron');
392
+
393
+ $exportSuccess = $this->_getHelper()->exportSegment($segment->getId());
394
+ if($exportSuccess) {
395
+ $this->_getHelper()->logDebug('segment ' . $segment->getName() .' has been successfully exported by cron');
396
+ } else {
397
+ $this->_getHelper()->logError('segment ' . $segment->getName() . ' has not been successfully exported by cron');
398
+ }
399
+ } else {
400
+ $this->_getHelper()->logDebug('segment ' . $segment->getName() .' export is not set to be exported by cron ');
401
+ }
402
+ }
403
+
404
+ $process->unlock();
405
+ $this->_getHelper()->logDebug('Ending Segments export');
406
+ }
407
 
408
 
409
  /**
app/code/community/Dolist/Net/Model/Reports.php CHANGED
@@ -30,7 +30,9 @@ class Dolist_Net_Model_Reports extends Mage_Core_Model_Abstract
30
  public function end($result = 'success')
31
  {
32
  $now = new DateTime();
33
- $this->setData('progress_current', $this->getData('progress_end'));
 
 
34
  $this->setData('result', $result);
35
  $this->setData('ended_at', $now->format(DateTime::W3C));
36
 
@@ -60,6 +62,8 @@ class Dolist_Net_Model_Reports extends Mage_Core_Model_Abstract
60
  */
61
  public function log($message)
62
  {
 
 
63
  $this->setData('last_logs', $message);
64
  $this->setData('logs', $this->getData('logs') . PHP_EOL . $message);
65
 
30
  public function end($result = 'success')
31
  {
32
  $now = new DateTime();
33
+ if('success' === $result) {
34
+ $this->setData('progress_current', $this->getData('progress_end'));
35
+ }
36
  $this->setData('result', $result);
37
  $this->setData('ended_at', $now->format(DateTime::W3C));
38
 
62
  */
63
  public function log($message)
64
  {
65
+ $message = sprintf('[%s] %s', date('Y-m-d H:i:s'), $message);
66
+
67
  $this->setData('last_logs', $message);
68
  $this->setData('logs', $this->getData('logs') . PHP_EOL . $message);
69
 
app/code/community/Dolist/Net/Model/Service.php CHANGED
@@ -447,7 +447,7 @@ class Dolist_Net_Model_Service extends Varien_Object
447
  *
448
  * @param int $storeId Store ID
449
  *
450
- * @return void
451
  */
452
  public function dolistV8ContactImport($storeId = 0)
453
  {
@@ -563,7 +563,8 @@ class Dolist_Net_Model_Service extends Varien_Object
563
  // Remove flag on current store id to be exported
564
  $this->_getHelper()->removeExportStoreId('full', $storeId);
565
 
566
- $report->log($this->_getHelper()->__('Nothing to export')) .
 
567
  $report->end();
568
  return;
569
  }
@@ -688,7 +689,7 @@ class Dolist_Net_Model_Service extends Varien_Object
688
 
689
  if ($result[0]['total'] == 0) {
690
  if ($report) {
691
- $report->log($this->_getHelper()->__('Nothing to export')) .
692
  $report->end();
693
  }
694
  $this->_getHelper()->removeExportStoreId('differential', $storeId);
@@ -706,8 +707,6 @@ class Dolist_Net_Model_Service extends Varien_Object
706
  $now = time();
707
  // Export for differential subscribers
708
  $exportDiffPerformed = false;
709
- // Export for differential unsubscribers
710
- $exportUnsubsPerformed = false;
711
 
712
  // 1. Retrieve differential export file name (either in configuration table, either from webservice)
713
  $exportFileName = $this->retrieveFileName('differential_export', $storeId);
@@ -722,16 +721,8 @@ class Dolist_Net_Model_Service extends Varien_Object
722
  $exportDiffPerformed = $this->pushExportFile($exportFileName, $localFilename, $storeId, $report);
723
  }
724
 
725
- // 4. Generate newsletter unsubscribed contacts file
726
- $localUnsubscribeFilename = $this->generateUnsubscribeFile($storeId);
727
-
728
- // 5. Push newsletter unsubscribed contacts file on Dolist FTP server
729
- if (!is_null($localUnsubscribeFilename)) {
730
- $exportUnsubsPerformed = $this->pushUnsubscribeFile($localUnsubscribeFilename, $storeId);
731
- }
732
-
733
- // 6. Save dolist_last_export flag; only if export has been performed
734
- if ($exportDiffPerformed || $exportUnsubsPerformed) {
735
 
736
  // First, try to retrieve stored object
737
  $flag = $this->_getHelper()->getFlagDolistLastExport($storeId);
@@ -759,8 +750,8 @@ class Dolist_Net_Model_Service extends Varien_Object
759
 
760
  public function getCustomerIdCollection($startPagination, $storeId, $count = false, $differential = false)
761
  {
762
- $exportPageSize = Mage::getStoreConfig('dolist/dolist_v8/export_page_size');
763
- $exportWithCustomer = Mage::getStoreConfig('dolist/dolist_v8/export_customer_with_order');
764
 
765
  $query = null;
766
  if ($exportWithCustomer) {
@@ -772,7 +763,7 @@ class Dolist_Net_Model_Service extends Varien_Object
772
  ->getSelect();
773
  $select2 = Mage::getModel('newsletter/subscriber')
774
  ->getCollection()
775
- ->addFieldToFilter('subscriber_status', Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED)
776
  ->addFieldToFilter('store_id', $storeId)
777
  ->getSelect();
778
  $select2->reset(Zend_Db_Select::COLUMNS);
@@ -800,7 +791,7 @@ class Dolist_Net_Model_Service extends Varien_Object
800
  /** @var Varien_Db_Select $query */
801
  $query = Mage::getModel('newsletter/subscriber')
802
  ->getCollection()
803
- ->addFieldToFilter('subscriber_status', Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED)
804
  ->addFieldToFilter('store_id', $storeId)
805
  ->getSelect();
806
 
@@ -809,7 +800,7 @@ class Dolist_Net_Model_Service extends Varien_Object
809
  ->reset(Zend_Db_Select::FROM)
810
  ->reset(Zend_Db_Select::WHERE)
811
  ->from($this->getTable('newsletter_subscriber'), '')
812
- ->where($this->getTable('newsletter_subscriber') . '.subscriber_status = ?', Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED)
813
  ->where($this->getTable('newsletter_subscriber') . '.store_id = ?', $storeId);
814
 
815
  if ($count) {
@@ -836,6 +827,8 @@ class Dolist_Net_Model_Service extends Varien_Object
836
  return $query;
837
  }
838
 
 
 
839
  /**
840
  * Retrieve export file name, either stored value or generated by webservice
841
  *
@@ -902,8 +895,6 @@ class Dolist_Net_Model_Service extends Varien_Object
902
  $exportPageSize = 5000;
903
  }
904
 
905
- $query = $this->getCustomerIdCollection($startPagination, $storeId, false);
906
-
907
  $report = null;
908
  $reportId = $this->_getHelper()->getCurrentReportId($exportType, $storeId);
909
 
@@ -937,6 +928,10 @@ class Dolist_Net_Model_Service extends Varien_Object
937
  }
938
  }
939
 
 
 
 
 
940
  if (Mage::getStoreConfig('dev/log/active') && $report) {
941
  $report->log($query->assemble());
942
  }
@@ -953,9 +948,6 @@ class Dolist_Net_Model_Service extends Varien_Object
953
  $exporter->setEnclosure(); // Dolist does not use enclosures
954
  $exporter->setDelimiter(chr(9));
955
 
956
- // Retrieve export config. Fields to export and mapping attributes
957
- $dolistv8SystemConfig = $this->_getDolistV8SystemConfig($storeId);
958
-
959
  $i = 0;
960
  // Write one line for each subscriber to export
961
  foreach ($collection as $object) {
@@ -967,11 +959,10 @@ class Dolist_Net_Model_Service extends Varien_Object
967
  }
968
  }
969
 
970
- $exporter->setContactToExport($object, $dolistv8SystemConfig);
971
  $localFilename = sys_get_temp_dir() . '/' . $exportFileName; // Temporary filename
972
 
973
  // Write in tmp CSV file
974
- $exporter->export($localFilename, 'auto', true, 'contact_header', 'dolist', $storeId);
975
 
976
  //We reset until all content is exported
977
  $localFilename = null;
@@ -1004,164 +995,6 @@ class Dolist_Net_Model_Service extends Varien_Object
1004
  return $localFilename;
1005
  }
1006
 
1007
- /**
1008
- * Retrieve Dolist-V8 system config from back-office
1009
- * and return Mapping between Export file header fields and Magento attributes to export
1010
- *
1011
- * @param int $storeId Store ID
1012
- *
1013
- * @return array Mapping between Export file header fields and Magento attributes to export
1014
- */
1015
- protected function _getDolistV8SystemConfig($storeId)
1016
- {
1017
- // System configuration (set in back office)
1018
- $systemConfig = Mage::getStoreConfig('dolist/dolist_v8', $storeId);
1019
-
1020
- // Mapping configuration (set in config.xml)
1021
- $mappingConfig = $this->_getHelper()->getContactExportRowAdapterConfig();
1022
-
1023
- $exportContactFileMapping = array_flip($this->_getHelper()->getDolistExportContactFileHeader());
1024
- // Empty values
1025
- $this->_eraseVal($exportContactFileMapping);
1026
-
1027
- // Keys are Magento system config attribute names
1028
- $mandatoryFields = array('email');
1029
- foreach ($mandatoryFields as $mandatoryField) {
1030
- $object = $mappingConfig[$mandatoryField];
1031
- $exportContactFileMapping[$object->getHeader()] = $mandatoryField;
1032
- }
1033
-
1034
- // Specific case: group
1035
- if (array_key_exists('group', $systemConfig)) {
1036
- $exportContactFileMapping[$systemConfig['group']] = 'group_id';
1037
- }
1038
-
1039
- // Usual fields can only be enabled and disabled. Their name in export file is defined in config.xml
1040
- $usualFields = array();
1041
-
1042
- // Filter enabled fields
1043
- $enabledUsualFields = array();
1044
- foreach ($usualFields as $usualField) {
1045
- if ($systemConfig[$usualField] == 1) {
1046
- $enabledUsualFields[] = $usualField;
1047
- }
1048
- }
1049
-
1050
- // Add enabled field to export file mapping
1051
- foreach ($enabledUsualFields as $usualField) {
1052
- $object = $mappingConfig[$usualField];
1053
- $exportContactFileMapping[$object->getHeader()] = $usualField;
1054
- }
1055
-
1056
- // Retrieve Custom fields (str, int and date)
1057
- if (array_key_exists('custom_str_fields', $systemConfig)) {
1058
- $customStrFields = unserialize($systemConfig['custom_str_fields']);
1059
- foreach ($customStrFields as $customStrField) {
1060
- $exportContactFileMapping[$customStrField['dolist_custom_str_fields']] = $customStrField['magento_customer_attribute_1'];
1061
- }
1062
- }
1063
- if (array_key_exists('custom_int_fields', $systemConfig)) {
1064
- $customIntFields = unserialize($systemConfig['custom_int_fields']);
1065
- foreach ($customIntFields as $customIntField) {
1066
- $exportContactFileMapping[$customIntField['dolist_custom_int_fields']] = $customIntField['magento_customer_attribute_2'];
1067
- }
1068
- }
1069
- if (array_key_exists('custom_date_fields', $systemConfig)) {
1070
- $customDateFields = unserialize($systemConfig['custom_date_fields']);
1071
- foreach ($customDateFields as $customDateField) {
1072
- $exportContactFileMapping[$customDateField['dolist_custom_date_fields']] = $customDateField['magento_customer_attribute_3'];
1073
- }
1074
- }
1075
-
1076
- return $exportContactFileMapping;
1077
- }
1078
-
1079
- /**
1080
- * Empty array values per reference
1081
- *
1082
- * @param array &$myarr Input array
1083
- *
1084
- * @return array
1085
- */
1086
- protected function _eraseVal(&$myarr)
1087
- {
1088
- $myarr = array_map(create_function('$n', 'return null;'), $myarr);
1089
- }
1090
-
1091
- /**
1092
- * Generate unsubscribe file
1093
- * Contain contacts unsubscribed from last export
1094
- * File format:
1095
- * - file at UTF-8 format
1096
- * - separator: carriage return
1097
- * - no header line
1098
- * - only email address per line
1099
- * - filename unsubscribe_<YYYYMMDD_hhmmss>.txt
1100
- *
1101
- * @param int $storeId Store ID
1102
- *
1103
- * @return string Tmp unsubscribe file name
1104
- */
1105
- public function generateUnsubscribeFile($storeId)
1106
- {
1107
- $shortFileName = null;
1108
- $unsubscribeFilename = null;
1109
- $error = false;
1110
-
1111
- // Look for last export date
1112
- // First, try to retrieve stored value
1113
- $flag = $this->_getHelper()->getFlagDolistLastExport($storeId);
1114
-
1115
- // Log error if flag has never been set
1116
- if ($flag->getId() == null) {
1117
- $this->_getHelper()->logError(
1118
- $this->_getHelper()->__(
1119
- 'At least one full export should have been perfomed before generating unsubscribe file.'
1120
- )
1121
- );
1122
-
1123
- // Stop processing if export never performed
1124
- $error = true;
1125
-
1126
- } else {
1127
- $lastExportTimestamp = $flag->getFlagData(); // timestamp format
1128
- $collection = Mage::getModel('newsletter/subscriber')
1129
- ->getCollection()
1130
- ->addFieldToFilter('subscriber_status', Mage_Newsletter_Model_Subscriber::STATUS_UNSUBSCRIBED)
1131
- ->addFieldToFilter('updated_at', array('from' => $lastExportTimestamp))
1132
- ->addFieldToFilter('store_id', $storeId);
1133
-
1134
- // Perform only if collection is not empty and no error found
1135
- if ($collection->getSize() > 0 && !$error) {
1136
- $exporter = Mage::getModel('dolist/exporter_csv');
1137
- $exporter->setEnclosure(); // Dolist does not use enclosures
1138
- $exporter->setDelimiter(chr(9));
1139
-
1140
- // Write one line for each subscriber to export
1141
- foreach ($collection as $subscriber) {
1142
-
1143
- $exporter->addObjectToExport(
1144
- array(
1145
- 'prefix' => '',
1146
- 'object' => $subscriber,
1147
- 'fields' => array(
1148
- 'subscriber_email'
1149
- )
1150
- )
1151
- );
1152
-
1153
- $now = new Zend_Date();
1154
- $shortFileName = 'unsubscribe_' . $now->toString('YYYYMMdd_HHmmss') . '.txt';
1155
- $unsubscribeFilename = sys_get_temp_dir() . '/' . $shortFileName; // Temporary filename
1156
- // Write in tmp CSV file, no header
1157
- $exporter->export($unsubscribeFilename, false);
1158
- }
1159
- }
1160
- }
1161
-
1162
- return $shortFileName;
1163
- }
1164
-
1165
  /**
1166
  * Generate segment file
1167
  * File format:
@@ -1175,33 +1008,39 @@ class Dolist_Net_Model_Service extends Varien_Object
1175
  *
1176
  * @return string Tmp segment file name
1177
  */
1178
- public function generateSegmentFile($collection, $exportFileName)
1179
  {
1180
  $localFilename = null;
1181
 
1182
  // Perform only if collection is not empty
1183
  if ($collection->getSize() > 0) {
 
1184
  $exporter = Mage::getModel('dolist/exporter_csv');
1185
  $exporter->setEnclosure(); // Dolist does not use enclosures
1186
  $exporter->setDelimiter(chr(9));
1187
 
1188
  // Write one line for each customer to export
 
1189
  foreach ($collection as $customer) {
1190
 
1191
- // Only email field is filled in
1192
- $exporter->addObjectToExport(
1193
- array(
1194
- 'prefix' => '',
1195
- 'object' => $customer,
1196
- 'fields' => array(
1197
- 'email'
1198
- )
1199
  )
1200
  );
 
1201
 
1202
- $localFilename = sys_get_temp_dir() . '/' . $exportFileName; // Temporary filename
1203
- // Write in tmp CSV file
1204
- $exporter->export($localFilename, 'auto', true, 'contact_header');
 
 
 
1205
  }
1206
  }
1207
 
@@ -1283,50 +1122,6 @@ class Dolist_Net_Model_Service extends Varien_Object
1283
  return $result;
1284
  }
1285
 
1286
- /**
1287
- * Push unsubscribe file to FTP server
1288
- *
1289
- * @param string $shortFilename Local unsubscribe filename (usually in /tmp directory)
1290
- * @param int $storeId Store ID
1291
- *
1292
- * @return void
1293
- */
1294
- public function pushUnsubscribeFile($shortFilename, $storeId)
1295
- {
1296
- $ftpConnection = Mage::getSingleton('dolist/dolistv8_ftp', array('store_id' => $storeId));
1297
- $connection = $ftpConnection->getConnection();
1298
- $result = false;
1299
-
1300
- $unsubscribeFilename = sys_get_temp_dir() . '/' . $shortFilename; // Temporary filename
1301
-
1302
- try {
1303
- // Generate remote filename from export filename
1304
- $remoteFolder = (string)Mage::getConfig()->getNode('dolistparams/ftp/unsubscribe_contact_directory');
1305
- // To be sure to get only one slash
1306
- $remoteFolder = rtrim($remoteFolder, '/') . '/';
1307
- $remoteFilename = $remoteFolder . $shortFilename;
1308
-
1309
- //reencode file in UTF16 with BOM
1310
- $this->_reencodeFileToExport($localFilename);
1311
-
1312
- // Push on FTP server
1313
- $result = $connection->write($remoteFilename, $unsubscribeFilename);
1314
-
1315
- // Close FTP connection
1316
- $connection->close();
1317
-
1318
- // Delete tmp file
1319
- unlink($unsubscribeFilename);
1320
-
1321
- } catch (Exception $e) {
1322
- // Delete tmp file
1323
- unlink($unsubscribeFilename);
1324
- $this->_getHelper()->logError($e->getMessage());
1325
- }
1326
-
1327
- return $result;
1328
- }
1329
-
1330
  /**
1331
  * Perfom segment export for given $segmentId to Dolist-V8
1332
  * Perform one export for each website.
@@ -1342,6 +1137,7 @@ class Dolist_Net_Model_Service extends Varien_Object
1342
  {
1343
  $return = true;
1344
 
 
1345
  $customerSegment = Mage::getModel('enterprise_customersegment/segment')->load($segmentId);
1346
  $exportPerformed = false;
1347
 
@@ -1350,6 +1146,22 @@ class Dolist_Net_Model_Service extends Varien_Object
1350
 
1351
  $storeId = $storeIds[$configWebsiteId];
1352
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1353
  if ($customerSegment->getId()) {
1354
 
1355
  // Retrieve segment customers to export
@@ -1359,43 +1171,70 @@ class Dolist_Net_Model_Service extends Varien_Object
1359
  ->addSegmentFilter($customerSegment)
1360
  ->addWebsiteFilter($websiteListToFilter);
1361
 
 
 
1362
  if ($collection->count() > 0) {
1363
 
1364
  // Create new import.
1365
- // ImportName : 'MAGENTO - <segment.name> - <YYYYMMDD_HHmmss>
1366
- $now = new Zend_Date();
1367
- $importName = 'MAGENTO - ' . $customerSegment->getName() . ' - ' . $now->toString('YYYYMMdd_HHmmss');
1368
- $response = $this->dolistV8CreateImport($importName, true, $storeId);
1369
- $exportFileName = $response->getData('FileName');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1370
 
1371
  // Create segment file
1372
  if (!is_null($exportFileName)) {
1373
- $localFilename = $this->generateSegmentFile($collection, $exportFileName);
1374
 
1375
  if (!is_null($localFilename)) {
1376
  // Push file on FTP server
1377
- $exportPerformed = $this->pushExportFile($exportFileName, $localFilename, $storeId);
1378
  }
1379
  }
1380
 
1381
  if ($exportPerformed) {
1382
  // If success, check if this segment has already been exported
1383
  // If never exported, add it to exported segment list (dolist_exported_segment_list)
1384
- $this->_getHelper()->addExportedSegment($customerSegment->getId(), $storeId);
 
 
 
1385
 
1386
  Mage::getSingleton('adminhtml/session')
1387
  ->addSuccess($this->_getHelper()->__("Exporting segment id %s to Dolist-V8 succeeded", $segmentId));
1388
-
 
1389
  } else {
1390
 
1391
  Mage::getSingleton('adminhtml/session')
1392
  ->addError($this->_getHelper()->__("Exporting segment id %s to Dolist-V8 failed", $segmentId));
 
 
 
 
1393
  $return = false;
1394
  }
1395
 
1396
  } else {
1397
  Mage::getSingleton('adminhtml/session')
1398
  ->addError($this->_getHelper()->__("Segment id %s has not been exported because it is empty", $segmentId));
 
 
 
1399
  $return = false;
1400
  }
1401
 
@@ -1403,9 +1242,18 @@ class Dolist_Net_Model_Service extends Varien_Object
1403
  Mage::getSingleton('adminhtml/session')
1404
  ->addNotice($this->_getHelper()->__("Segment id %s couldn't be loaded", $segmentId));
1405
 
 
 
1406
 
1407
  // Remove this segment from dolist exported segment list
1408
- $this->_getHelper()->removeExportedSegment($segmentId);
 
 
 
 
 
 
 
1409
  }
1410
  }
1411
 
447
  *
448
  * @param int $storeId Store ID
449
  *
450
+ * @return boolean
451
  */
452
  public function dolistV8ContactImport($storeId = 0)
453
  {
563
  // Remove flag on current store id to be exported
564
  $this->_getHelper()->removeExportStoreId('full', $storeId);
565
 
566
+ $report->log($this->_getHelper()->__('Nothing to export'));
567
+ $report->start(0);
568
  $report->end();
569
  return;
570
  }
689
 
690
  if ($result[0]['total'] == 0) {
691
  if ($report) {
692
+ $report->log($this->_getHelper()->__('Nothing to export'));
693
  $report->end();
694
  }
695
  $this->_getHelper()->removeExportStoreId('differential', $storeId);
707
  $now = time();
708
  // Export for differential subscribers
709
  $exportDiffPerformed = false;
 
 
710
 
711
  // 1. Retrieve differential export file name (either in configuration table, either from webservice)
712
  $exportFileName = $this->retrieveFileName('differential_export', $storeId);
721
  $exportDiffPerformed = $this->pushExportFile($exportFileName, $localFilename, $storeId, $report);
722
  }
723
 
724
+ // 4. Save dolist_last_export flag; only if export has been performed
725
+ if ($exportDiffPerformed) {
 
 
 
 
 
 
 
 
726
 
727
  // First, try to retrieve stored object
728
  $flag = $this->_getHelper()->getFlagDolistLastExport($storeId);
750
 
751
  public function getCustomerIdCollection($startPagination, $storeId, $count = false, $differential = false)
752
  {
753
+ $exportPageSize = Mage::getStoreConfig('dolist/dolist_v8/export_page_size', $storeId);
754
+ $exportWithCustomer = Mage::getStoreConfig('dolist/dolist_v8/export_customer_with_order', $storeId);
755
 
756
  $query = null;
757
  if ($exportWithCustomer) {
763
  ->getSelect();
764
  $select2 = Mage::getModel('newsletter/subscriber')
765
  ->getCollection()
766
+ //->addFieldToFilter('subscriber_status', Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED)
767
  ->addFieldToFilter('store_id', $storeId)
768
  ->getSelect();
769
  $select2->reset(Zend_Db_Select::COLUMNS);
791
  /** @var Varien_Db_Select $query */
792
  $query = Mage::getModel('newsletter/subscriber')
793
  ->getCollection()
794
+ //->addFieldToFilter('subscriber_status', Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED)
795
  ->addFieldToFilter('store_id', $storeId)
796
  ->getSelect();
797
 
800
  ->reset(Zend_Db_Select::FROM)
801
  ->reset(Zend_Db_Select::WHERE)
802
  ->from($this->getTable('newsletter_subscriber'), '')
803
+ //->where($this->getTable('newsletter_subscriber') . '.subscriber_status = ?', Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED)
804
  ->where($this->getTable('newsletter_subscriber') . '.store_id = ?', $storeId);
805
 
806
  if ($count) {
827
  return $query;
828
  }
829
 
830
+
831
+
832
  /**
833
  * Retrieve export file name, either stored value or generated by webservice
834
  *
895
  $exportPageSize = 5000;
896
  }
897
 
 
 
898
  $report = null;
899
  $reportId = $this->_getHelper()->getCurrentReportId($exportType, $storeId);
900
 
928
  }
929
  }
930
 
931
+ if (!isset($query) || !$query) {
932
+ $query = $this->getCustomerIdCollection($startPagination, $storeId, false);
933
+ }
934
+
935
  if (Mage::getStoreConfig('dev/log/active') && $report) {
936
  $report->log($query->assemble());
937
  }
948
  $exporter->setEnclosure(); // Dolist does not use enclosures
949
  $exporter->setDelimiter(chr(9));
950
 
 
 
 
951
  $i = 0;
952
  // Write one line for each subscriber to export
953
  foreach ($collection as $object) {
959
  }
960
  }
961
 
 
962
  $localFilename = sys_get_temp_dir() . '/' . $exportFileName; // Temporary filename
963
 
964
  // Write in tmp CSV file
965
+ $exporter->export($localFilename, $object, 'dolist', 'auto', true, $storeId);
966
 
967
  //We reset until all content is exported
968
  $localFilename = null;
995
  return $localFilename;
996
  }
997
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
998
  /**
999
  * Generate segment file
1000
  * File format:
1008
  *
1009
  * @return string Tmp segment file name
1010
  */
1011
+ public function generateSegmentFile($collection, $exportFileName, $report = null)
1012
  {
1013
  $localFilename = null;
1014
 
1015
  // Perform only if collection is not empty
1016
  if ($collection->getSize() > 0) {
1017
+ /** @var Dolist_Net_Model_Exporter_Csv $exporter */
1018
  $exporter = Mage::getModel('dolist/exporter_csv');
1019
  $exporter->setEnclosure(); // Dolist does not use enclosures
1020
  $exporter->setDelimiter(chr(9));
1021
 
1022
  // Write one line for each customer to export
1023
+ $i = 0;
1024
  foreach ($collection as $customer) {
1025
 
1026
+ $localFilename = sys_get_temp_dir() . '/' . $exportFileName; // Temporary filename
1027
+
1028
+ // Write in tmp CSV file
1029
+ $exportObj = array(
1030
+ 'prefix' => '',
1031
+ 'object' => $customer,
1032
+ 'fields' => array(
1033
+ 'email'
1034
  )
1035
  );
1036
+ $exporter->export($localFilename, $exportObj, 'auto', 'auto', true);
1037
 
1038
+ if($i && $i%100 === 0)
1039
+ if($report instanceof Dolist_Net_Model_Reports) {
1040
+ $report->progress(100);
1041
+ $report->log('100 lines added...');
1042
+ }
1043
+ $i++;
1044
  }
1045
  }
1046
 
1122
  return $result;
1123
  }
1124
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1125
  /**
1126
  * Perfom segment export for given $segmentId to Dolist-V8
1127
  * Perform one export for each website.
1137
  {
1138
  $return = true;
1139
 
1140
+ /** @var Enterprise_CustomerSegment_Model_Segment $customerSegment */
1141
  $customerSegment = Mage::getModel('enterprise_customersegment/segment')->load($segmentId);
1142
  $exportPerformed = false;
1143
 
1146
 
1147
  $storeId = $storeIds[$configWebsiteId];
1148
 
1149
+ $websiteNames = array();
1150
+ if(is_array($websiteListToFilter)) {
1151
+ foreach($websiteListToFilter as $websiteId) {
1152
+ $websiteNames[] = Mage::app()->getWebsite($websiteId)->getName();
1153
+ }
1154
+ } else {
1155
+ $websiteNames[] = Mage::app()->getWebsite(reset($websiteIds))->getName();
1156
+ }
1157
+
1158
+ /** @var Dolist_Net_Model_Reports $report */
1159
+ $report = Mage::getModel('dolist/reports');
1160
+ $report->setData(array(
1161
+ 'type' => 'export',
1162
+ 'name' => sprintf('Segment Export %s - (%s)',$customerSegment->getName(),join(',', $websiteNames ))
1163
+ ))->save();
1164
+
1165
  if ($customerSegment->getId()) {
1166
 
1167
  // Retrieve segment customers to export
1171
  ->addSegmentFilter($customerSegment)
1172
  ->addWebsiteFilter($websiteListToFilter);
1173
 
1174
+ $report->start($collection->count());
1175
+
1176
  if ($collection->count() > 0) {
1177
 
1178
  // Create new import.
1179
+ $flagCode = 'dolist_segment_filename_' . $segmentId;
1180
+
1181
+ // First, try to retrieve stored value
1182
+ /** @var Mage_Core_Model_Flag $flag */
1183
+ $flag = Mage::getModel('core/flag')->load($flagCode, 'flag_code');
1184
+
1185
+ if ($flag->getId() != null) {
1186
+ $exportFileName = $flag->getFlagData();
1187
+ }
1188
+ else {
1189
+ // ImportName : 'MAGENTO - <segment.name> - <YYYYMMDD_HHmmss>
1190
+ $now = new Zend_Date();
1191
+ $importName = 'MAGENTO - ' . $customerSegment->getName() . ' - ' . $now->toString('YYYYMMdd_HHmmss');
1192
+ $response = $this->dolistV8CreateImport($importName, true, $storeId);
1193
+ $exportFileName = $response->getData('FileName');
1194
+
1195
+ $flag = Mage::getModel('core/flag', array('flag_code' => $flagCode));
1196
+ $flag->setFlagData($exportFileName)->save();
1197
+ }
1198
 
1199
  // Create segment file
1200
  if (!is_null($exportFileName)) {
1201
+ $localFilename = $this->generateSegmentFile($collection, $exportFileName, $report);
1202
 
1203
  if (!is_null($localFilename)) {
1204
  // Push file on FTP server
1205
+ $exportPerformed = $this->pushExportFile($exportFileName, $localFilename, $storeId, $report);
1206
  }
1207
  }
1208
 
1209
  if ($exportPerformed) {
1210
  // If success, check if this segment has already been exported
1211
  // If never exported, add it to exported segment list (dolist_exported_segment_list)
1212
+ foreach($websiteListToFilter as $websiteId) {
1213
+ $storeId = Mage::app()->getWebsite($websiteId)->getDefaultStore()->getId();
1214
+ $this->_getHelper()->addExportedSegment($customerSegment->getId(), $storeId);
1215
+ }
1216
 
1217
  Mage::getSingleton('adminhtml/session')
1218
  ->addSuccess($this->_getHelper()->__("Exporting segment id %s to Dolist-V8 succeeded", $segmentId));
1219
+ $report->end('success');
1220
+ $report->log(sprintf('Exporting segment id %s to Dolist-V8 succeeded', $segmentId));
1221
  } else {
1222
 
1223
  Mage::getSingleton('adminhtml/session')
1224
  ->addError($this->_getHelper()->__("Exporting segment id %s to Dolist-V8 failed", $segmentId));
1225
+
1226
+ $report->end('error');
1227
+ $report->log(sprintf('Exporting segment id %s to Dolist-V8 failed', $segmentId));
1228
+
1229
  $return = false;
1230
  }
1231
 
1232
  } else {
1233
  Mage::getSingleton('adminhtml/session')
1234
  ->addError($this->_getHelper()->__("Segment id %s has not been exported because it is empty", $segmentId));
1235
+ $report->end('error');
1236
+ $report->log(sprintf('Segment id %s has not been exported because it is empty', $segmentId));
1237
+
1238
  $return = false;
1239
  }
1240
 
1242
  Mage::getSingleton('adminhtml/session')
1243
  ->addNotice($this->_getHelper()->__("Segment id %s couldn't be loaded", $segmentId));
1244
 
1245
+ $report->end('error');
1246
+ $report->log(sprintf('Segment id %s couldn\'t be loaded', $segmentId));
1247
 
1248
  // Remove this segment from dolist exported segment list
1249
+ $allStoreIds = array_keys(Mage::app()->getStores());
1250
+ // Remove exported segments from all stores
1251
+ foreach ($allStoreIds as $storeId) {
1252
+ $this->_getHelper()->removeExportedSegment($segmentId, $storeId);
1253
+ }
1254
+
1255
+ $report->delete();
1256
+
1257
  }
1258
  }
1259
 
app/code/community/Dolist/Net/Model/System/Config/Source/Dolistv8/Customerattributelist.php CHANGED
@@ -79,18 +79,21 @@ class Dolist_Net_Model_System_Config_Source_Dolistv8_Customerattributelist
79
  // Display these attributes
80
  if (in_array($key, $backendType)) {
81
  $options[] = array('value' => array(), 'label' => Mage::helper('dolist')->__("Calculated attributes"));
82
- foreach ($calculatedAttributeList as $id => $calculatedAttributeItem) {
83
 
84
- if ($calculatedAttributeItem['adapter'] == "separator") {
85
- $options[] = array(
86
- 'value' => array(),
87
- 'label' => Mage::helper('dolist')->__($calculatedAttributeItem['label'])
88
- );
89
- } else {
90
- $options[] = array(
91
- 'value' => $id,
92
- 'label' => Mage::helper('dolist')->__($calculatedAttributeItem['label'])
93
- );
 
 
 
 
94
  }
95
  }
96
  }
79
  // Display these attributes
80
  if (in_array($key, $backendType)) {
81
  $options[] = array('value' => array(), 'label' => Mage::helper('dolist')->__("Calculated attributes"));
 
82
 
83
+ if(is_array($calculatedAttributeList)) {
84
+ foreach ($calculatedAttributeList as $id => $calculatedAttributeItem) {
85
+
86
+ if ($calculatedAttributeItem['adapter'] == "separator") {
87
+ $options[] = array(
88
+ 'value' => array(),
89
+ 'label' => Mage::helper('dolist')->__($calculatedAttributeItem['label'])
90
+ );
91
+ } else {
92
+ $options[] = array(
93
+ 'value' => $id,
94
+ 'label' => Mage::helper('dolist')->__($calculatedAttributeItem['label'])
95
+ );
96
+ }
97
  }
98
  }
99
  }
app/code/community/Dolist/Net/controllers/Adminhtml/CustomerdolistController.php CHANGED
@@ -10,6 +10,10 @@
10
  */
11
  class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Controller_Action
12
  {
 
 
 
 
13
 
14
  /**
15
  * index action
@@ -27,6 +31,9 @@ class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Contr
27
  $this->renderLayout();
28
  }
29
 
 
 
 
30
  public function reportAction()
31
  {
32
  $this->loadLayout();
@@ -163,6 +170,8 @@ class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Contr
163
  }
164
 
165
  $this->_getSession()->addSuccess($this->_getHelper()->__('Saved.'));
 
 
166
  } catch (Exception $e) {
167
  $this->_getSession()->addError($e->getMessage());
168
  $this->_redirect('*/*/', array('store' => $storeId));
@@ -346,6 +355,18 @@ class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Contr
346
  $stores = $this->_getStoreList($storeId);
347
  $error = false;
348
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  // Loop on every store
350
  foreach ($stores as $storeId) {
351
  if ($this->_getHelper()->isDolistV8Enabled($storeId)) {
@@ -395,6 +416,10 @@ class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Contr
395
  );
396
  }
397
 
 
 
 
 
398
  $this->_redirect('*/*/', array('store' => $initStoreId));
399
  }
400
 
@@ -468,17 +493,28 @@ class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Contr
468
  */
469
  public function exportSegmentAction()
470
  {
471
- // Load segment
472
  $segmentId = $this->getRequest()->getParam('segment_id');
473
- $websiteIds = unserialize(urldecode($this->getRequest()->getParam('website_ids')));
474
- // Array of enabled stored indexed by website id
475
- $storeIds = unserialize(urldecode($this->getRequest()->getParam('store_ids')));
476
- // Website ids grouped by same Dolist-V8 config
477
- $filteredWebsiteIds = $this->_getHelper()->filterDistinctEnabledWebsites($websiteIds);
 
 
 
 
 
 
 
 
 
 
 
478
 
479
- /** @var Dolist_Net_Model_Service $service */
480
- $service = Mage::getSingleton('dolist/service');
481
- $service->exportSegment($segmentId, $filteredWebsiteIds, $storeIds);
 
482
 
483
  // Redirect to segment index page
484
  $this->_redirect('*/customersegment/index');
@@ -500,10 +536,40 @@ class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Contr
500
  $this->_getHelper()->removeExportedSegment($segmentId, $storeId);
501
  }
502
 
 
 
 
 
503
  // Redirect to segment index page
504
  $this->_redirect('*/customersegment/index');
505
  }
506
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
507
  /**
508
  * Return array with default store view ids for each website
509
  *
10
  */
11
  class Dolist_Net_Adminhtml_CustomerdolistController extends Mage_Adminhtml_Controller_Action
12
  {
13
+ protected function _isAllowed()
14
+ {
15
+ return Mage::getSingleton('admin/session')->isAllowed('customer/customerdolist');
16
+ }
17
 
18
  /**
19
  * index action
31
  $this->renderLayout();
32
  }
33
 
34
+ /**
35
+ *
36
+ */
37
  public function reportAction()
38
  {
39
  $this->loadLayout();
170
  }
171
 
172
  $this->_getSession()->addSuccess($this->_getHelper()->__('Saved.'));
173
+
174
+ Mage::app()->getCacheInstance()->cleanType('config');
175
  } catch (Exception $e) {
176
  $this->_getSession()->addError($e->getMessage());
177
  $this->_redirect('*/*/', array('store' => $storeId));
355
  $stores = $this->_getStoreList($storeId);
356
  $error = false;
357
 
358
+
359
+ $process = new Mage_Index_Model_Process();
360
+ $process->setId("segment_export");
361
+ if($process->isLocked()){
362
+ $this->_getHelper()->logError('segment_export is locked');
363
+ $this->_getSession()->addError($this->_getHelper()->__('Another export is already running. Please try again later.'));
364
+ // Redirect to segment edit page
365
+ $this->_redirect('*/*/', array('store' => $initStoreId));
366
+ return;
367
+ }
368
+ $process->lockAndBlock();
369
+
370
  // Loop on every store
371
  foreach ($stores as $storeId) {
372
  if ($this->_getHelper()->isDolistV8Enabled($storeId)) {
416
  );
417
  }
418
 
419
+
420
+ $process->unlock();
421
+
422
+
423
  $this->_redirect('*/*/', array('store' => $initStoreId));
424
  }
425
 
493
  */
494
  public function exportSegmentAction()
495
  {
 
496
  $segmentId = $this->getRequest()->getParam('segment_id');
497
+ $process = new Mage_Index_Model_Process();
498
+ $process->setId("segment_export");
499
+ if($process->isLocked()){
500
+ $this->_getHelper()->logError('segment_export is locked');
501
+ $this->_getSession()->addError($this->_getHelper()->__('Another export is already running. Please try again later.'));
502
+ // Redirect to segment edit page
503
+ $this->_redirect('*/customersegment/edit/',array('id'=> $segmentId));
504
+ return;
505
+ }
506
+ $process->lockAndBlock();
507
+
508
+ // Force new segment on dolist platforme
509
+ $flagCode = 'dolist_segment_filename_' . $segmentId;
510
+ $flag = Mage::getModel('core/flag')->load($flagCode, 'flag_code');
511
+ $flag->delete();
512
+
513
 
514
+ // Trigger Export
515
+ $this->_getHelper()->exportSegment($segmentId);
516
+
517
+ $process->unlock();
518
 
519
  // Redirect to segment index page
520
  $this->_redirect('*/customersegment/index');
536
  $this->_getHelper()->removeExportedSegment($segmentId, $storeId);
537
  }
538
 
539
+ //we can assume that segment's Export should not be cronned
540
+ $this->_getHelper()->removeSegmentExportFromCron($segmentId);
541
+
542
+
543
  // Redirect to segment index page
544
  $this->_redirect('*/customersegment/index');
545
  }
546
 
547
+ /**
548
+ * Add Segment Export to Magento Cron
549
+ */
550
+ public function addSegmentExportToCronAction() {
551
+ // Load segment
552
+ $segmentId = $this->getRequest()->getParam('segment_id');
553
+
554
+ $this->_getHelper()->addSegmentExportToCron($segmentId);
555
+
556
+ // Redirect to segment edit page
557
+ $this->_redirect('*/customersegment/edit/',array('id'=> $segmentId));
558
+ }
559
+
560
+ /**
561
+ * Remove Segment Export from Magento Cron
562
+ */
563
+ public function removeSegmentExportFromCronAction() {
564
+ // Load segment
565
+ $segmentId = $this->getRequest()->getParam('segment_id');
566
+
567
+ $this->_getHelper()->removeSegmentExportFromCron($segmentId);
568
+
569
+ // Redirect to segment edit page
570
+ $this->_redirect('*/customersegment/edit/',array('id'=> $segmentId));
571
+ }
572
+
573
  /**
574
  * Return array with default store view ids for each website
575
  *
app/code/community/Dolist/Net/controllers/Adminhtml/System/Config/TestconnectionController.php CHANGED
@@ -9,6 +9,11 @@
9
  */
10
  class Dolist_Net_Adminhtml_System_Config_TestconnectionController extends Mage_Adminhtml_Controller_Action
11
  {
 
 
 
 
 
12
  /**
13
  * Check connection to Dolist-V8 webservice,
14
  * then check connection to Dolist-V8 FTP server
9
  */
10
  class Dolist_Net_Adminhtml_System_Config_TestconnectionController extends Mage_Adminhtml_Controller_Action
11
  {
12
+ protected function _isAllowed()
13
+ {
14
+ return Mage::getSingleton('admin/session')->isAllowed('system/config/dolist');
15
+ }
16
+
17
  /**
18
  * Check connection to Dolist-V8 webservice,
19
  * then check connection to Dolist-V8 FTP server
app/code/community/Dolist/Net/etc/config.xml CHANGED
@@ -4,7 +4,7 @@
4
 
5
  <modules>
6
  <Dolist_Net>
7
- <version>2.0.0.6</version>
8
  </Dolist_Net>
9
  </modules>
10
 
@@ -149,13 +149,12 @@
149
  <!-- Calculated attributes -->
150
  <!-- Custom int fields -->
151
  <calculated_attributes>
152
- <varchar>
 
153
  <is_subscriber>
154
  <label>Subscriber state of the customer</label>
155
- <adapter></adapter>
156
  </is_subscriber>
157
- </varchar>
158
- <int>
159
  <first_order_amount>
160
  <label>First order amount excluding tax</label>
161
  <adapter>dolist/dolistv8_export_adapter_int_firstOrderAmountExclTax</adapter>
@@ -458,27 +457,11 @@
458
  <sales_order_place_after>
459
  <observers>
460
  <dolist_sales_order_place_after>
461
- <class>dolist/dolistv8_calculatedfields</class>
462
  <method>onNewOrder</method>
463
  </dolist_sales_order_place_after>
464
  </observers>
465
  </sales_order_place_after>
466
- <checkout_cart_product_add_after>
467
- <observers>
468
- <dolist_checkout_cart_product_add_after>
469
- <class>dolist/dolistv8_calculatedfields</class>
470
- <method>onNewCart</method>
471
- </dolist_checkout_cart_product_add_after>
472
- </observers>
473
- </checkout_cart_product_add_after>
474
- <checkout_cart_save_after>
475
- <observers>
476
- <dolist_checkout_cart_save_after>
477
- <class>dolist/dolistv8_calculatedfields</class>
478
- <method>onNewCart</method>
479
- </dolist_checkout_cart_save_after>
480
- </observers>
481
- </checkout_cart_save_after>
482
  </events>
483
  </frontend>
484
 
@@ -520,6 +503,13 @@
520
  <model>dolist/observer::sendQueuedMessages</model>
521
  </run>
522
  </dolist_send_queued_messages>
 
 
 
 
 
 
 
523
  </jobs>
524
  </crontab>
525
 
4
 
5
  <modules>
6
  <Dolist_Net>
7
+ <version>2.0.0.7</version>
8
  </Dolist_Net>
9
  </modules>
10
 
149
  <!-- Calculated attributes -->
150
  <!-- Custom int fields -->
151
  <calculated_attributes>
152
+ <varchar />
153
+ <int>
154
  <is_subscriber>
155
  <label>Subscriber state of the customer</label>
156
+ <adapter />
157
  </is_subscriber>
 
 
158
  <first_order_amount>
159
  <label>First order amount excluding tax</label>
160
  <adapter>dolist/dolistv8_export_adapter_int_firstOrderAmountExclTax</adapter>
457
  <sales_order_place_after>
458
  <observers>
459
  <dolist_sales_order_place_after>
460
+ <class>dolist/observer</class>
461
  <method>onNewOrder</method>
462
  </dolist_sales_order_place_after>
463
  </observers>
464
  </sales_order_place_after>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
465
  </events>
466
  </frontend>
467
 
503
  <model>dolist/observer::sendQueuedMessages</model>
504
  </run>
505
  </dolist_send_queued_messages>
506
+ <dolist_segment_export>
507
+ <!-- Every 5 minutes -->
508
+ <schedule><cron_expr>0 5 * * *</cron_expr></schedule>
509
+ <run>
510
+ <model>dolist/observer::cronSegmentExport</model>
511
+ </run>
512
+ </dolist_segment_export>
513
  </jobs>
514
  </crontab>
515
 
app/code/community/Dolist/Net/sql/dolist_setup/mysql4-upgrade-2.0.0.6-2.0.0.7.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /** @var Mage_Core_Model_Resource_Setup $installer */
4
+ $installer = $this;
5
+ $installer->startSetup();
6
+
7
+ // Create new table to store Dolist-EMT templates
8
+ $installer->run("ALTER TABLE {$this->getTable('dolist_dolistv8_calculatedfields')} DROP PRIMARY KEY;");
9
+ $installer->run("ALTER TABLE {$this->getTable('dolist_dolistv8_calculatedfields')} ADD id INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;");
10
+ $installer->run("ALTER TABLE {$this->getTable('dolist_dolistv8_calculatedfields')} ADD store_id INT AFTER start_date;");
11
+ $installer->run("ALTER TABLE {$this->getTable('dolist_dolistv8_calculatedfields')} ADD CONSTRAINT uc_customerid_storeid UNIQUE (customer_id,store_id);");
12
+ $installer->run("TRUNCATE TABLE {$this->getTable('dolist_dolistv8_calculatedfields')};");
13
+
14
+ $installer->endSetup();
app/design/adminhtml/default/default/template/dolist/customerexport.phtml CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- /** @var Dolist_Dolist_Block_Adminhtml_Edit_Tab_Export $this */
3
  ?>
4
  <?php echo $this->getChildHtml(); ?>
5
  <table class="form-list">
1
  <?php
2
+ /** @var Dolist_Net_Block_Adminhtml_Edit_Tab_Export $this */
3
  ?>
4
  <?php echo $this->getChildHtml(); ?>
5
  <table class="form-list">
app/locale/fr_FR/Dolist_Net.csv CHANGED
@@ -85,6 +85,8 @@
85
  "Last not ordered cart date","Date de dernier panier non commandé"
86
  "Export again this segment to Dolist-V8","Exporter à nouveau ce segment vers Dolist-V8"
87
  "Remove this segment from exported list","Cesser l'export de ce segment"
 
 
88
  "Connection test refreshes Dolist-EMT template list","Le test de connexion rafraîchit la liste des gabarits Dolist-EMT"
89
  "Save configuration before adding first template mapping","Sauvegarder la configuration avant d'ajouter des correspondances de gabarits"
90
  "Magento customer attribute","Attribut client Magento"
85
  "Last not ordered cart date","Date de dernier panier non commandé"
86
  "Export again this segment to Dolist-V8","Exporter à nouveau ce segment vers Dolist-V8"
87
  "Remove this segment from exported list","Cesser l'export de ce segment"
88
+ "Enable export from Cron","Activer l'export par le Cron"
89
+ "Disable export from Cron","Désactiver l'export par le Cron"
90
  "Connection test refreshes Dolist-EMT template list","Le test de connexion rafraîchit la liste des gabarits Dolist-EMT"
91
  "Save configuration before adding first template mapping","Sauvegarder la configuration avant d'ajouter des correspondances de gabarits"
92
  "Magento customer attribute","Attribut client Magento"
package.xml CHANGED
@@ -1,5 +1,5 @@
1
  <?xml version='1.0' encoding='utf-8'?>
2
- <package><name>Dolist_Net</name><license uri="http://opensource.org/licenses/osl-3.0.php">OSL 3.0</license><notes>v2</notes><time>10:05:15</time><__packager>build_package.py v0.0.3</__packager><summary>Official extension for Dolist email marketing solution.</summary><stability>stable</stability><__commit_hash>bbe8758e8f3259cf09224fa34f534d7db35b050e</__commit_hash><version>2.0.0.6</version><extends /><contents><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file hash="9116ca5966c127c3a065d3ccf991f6dd" name="dolist.xml" /></dir><dir name="template"><dir name="dolist"><file hash="05db7ca8032551aea167c573c06d0287" name="configuration.phtml" /><file hash="930ce49748a97b9bd3b0024cf08ba026" name="customerexport.phtml" /><dir name="store"><file hash="4100093e08cf4ce57c317ee017cba630" name="switcher.phtml" /></dir><dir name="system"><dir name="config"><dir name="dolistemt"><file hash="ba10b87cd51fef3d88a0dcf747d8b8dc" name="testconnection.phtml" /></dir><dir name="dolistv8"><file hash="a9b57b458cb1dfb83f0f5061be82f9f9" name="array.phtml" /><file hash="5c89a07ee29d11640870592c2edfc114" name="testconnection.phtml" /></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="magecommunity"><dir name="Dolist"><dir name="Net"><dir name="Block"><dir name="Adminhtml"><file hash="b5c65ae9b68d820870fb38e78e100265" name="Customerexport.php" /><file hash="fd8f4ad560d6777587a9ed90223c18c4" name="Edit.php" /><file hash="2e37abf70940f00b110279cef8b82280" name="Report.php" /><dir name="Customer"><file hash="8f6d9965be320c972d998f34171c4a5a" name="Edit.php" /></dir><dir name="Customersegment"><file hash="cf6a52e571dd475b96e93c00a8e2b5f0" name="Edit.php" /></dir><dir name="Edit"><file hash="057c9ee5853ea17801c990b42385fa5f" name="Form.php" /><file hash="45aba333e3e017601eff3a730e2991df" name="Tabs.php" /><dir name="Tab"><file hash="d93a56df1f7d60a8f4d275886f150ddf" name="Configuration.php" /><file hash="d1299519d583afd8b8afdad5ddafc326" name="Export.php" /><file hash="a55d01b5e4d114b20adef94f5dc503db" name="Report.php" /></dir></dir><dir name="System"><dir name="Config"><file hash="8393df0943d5575c31cb596c8d368ce6" name="Abstract.php" /><file hash="77b6b112b2492beb3dae124efe0b924a" name="Date.php" /><file hash="59fa9be3d71a648ab9d4dfe697d2e183" name="Enable.php" /><file hash="c62a40696ae0028b2908ed34768d8c2a" name="Switcher.php" /><file hash="883194919f569b7f49a12fd9d4f83082" name="Templatelist.php" /><dir name="Dolistemt"><file hash="9193591b22b093d9e5baaf83b0818ec8" name="Templatelist.php" /><file hash="4025ca1026614c48996c57112b25cf1c" name="Templatemapping.php" /><file hash="b95697d6fea9d16003f01b5a1f63db6a" name="Testconnection.php" /></dir><dir name="Dolistv8"><file hash="5be525c4398c036956d6489aa8fa582d" name="Attributelist.php" /><file hash="88336cf98961a1df4e23bf2de819c17d" name="Customdatefields.php" /><file hash="485252191fb609780609f7ec6b9d0fad" name="Customerattributelist.php" /><file hash="96a8428b3503291204d8922500e39210" name="Customintfields.php" /><file hash="2011749c69cae4968ded68dc4cce6945" name="Customstrfields.php" /><file hash="cb016b986834178808cad7dd9c8d96c2" name="Testconnection.php" /></dir></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file hash="794e6ade20567baee95139a73d684ea7" name="CustomerdolistController.php" /><dir name="System"><dir name="Config"><file hash="50676bfa56ac975dfb6a4d717d71e550" name="TestconnectionController.php" /></dir></dir></dir></dir><dir name="etc"><file hash="1f9d77e2b9f8e4b86f54f272eb213218" name="adminhtml.xml" /><file hash="59d110f1b2c3b4028e8ba062c1c7acf3" name="config.xml" /><file hash="f0d6b4651431d1d11532fe9402fc5003" name="system.xml" /></dir><dir name="Helper"><file hash="8693ced58cdbe1c151a04e5611eee235" name="Data.php" /><file hash="1d28b2acc7b47c17bb17af60e60c891d" name="Log.php" /><file hash="46b027b6f19b5a4ba72e1e992ac95269" name="Queue.php" /></dir><dir name="Model"><file hash="61da7cc29853bb9ce85b0bb587545c99" name="Customersegment.php" /><file hash="bf7e03605a1bd1d5fc5eba5c96f8231d" name="Observer.php" /><file hash="df11dd8d15b4603d5434fabf9cbf1d0e" name="Reports.php" /><file hash="889862dc356c85a109eebd2389dd1528" name="Service.php" /><dir name="Adminhtml"><file hash="c50d803637b3b679e1d944ed882c201e" name="Observer.php" /><dir name="System"><dir name="Config"><dir name="Backend"><dir name="Serialized"><file hash="ce8002b5ba1bd19901b5de4db7200672" name="Array.php" /></dir></dir><dir name="Source"><file hash="d594a5df0ec9c76ca0f55ac0c4422f56" name="Timeperiods.php" /></dir></dir></dir></dir><dir name="Dolistemt"><file hash="67917ea713604769bdc5e348d04830b4" name="Template.php" /><dir name="Email"><file hash="7e39b7cdc9a6f62c784937317d344d0b" name="Template.php" /></dir><dir name="Message"><file hash="3dd939ec132047606cc1f322677bcc1c" name="Queued.php" /></dir></dir><dir name="Dolistv8"><file hash="c15976cfb0b7a5805e724f11f89fe417" name="Calculatedfields.php" /><file hash="b1d4006ddf6c62b46bcadeb6a6b56fc0" name="Customfields.php" /><file hash="6a91b08ff749b635ffaff68a267cee53" name="Ftp.php" /></dir><dir name="Exporter"><file hash="010c818b65be9e51519e476d59c5e735" name="Csv.php" /><dir name="Adapter"><file hash="c52f8d05c198b2ee691d25104aa191ca" name="Date.php" /><file hash="66b2ee18bdf3924011a068f936b8818a" name="Default.php" /><file hash="797f1a935a1f8e1a9ce213d6cf03c235" name="Int.php" /></dir></dir><dir name="Mysql4"><file hash="7a3a3de6ef2fd144c192ef60357e370f" name="Reports.php" /><dir name="Dolistemt"><file hash="f972ef82ba3003da8d849e60df044440" name="Template.php" /><dir name="Message"><file hash="466461ebec5e905d89659698a21ed0ed" name="Queued.php" /><dir name="Queued"><file hash="1b0ed0a91ecd7fb5941c694221d12578" name="Collection.php" /></dir></dir><dir name="Template"><file hash="7b845449076c1dfaee11a7b04cb50400" name="Collection.php" /></dir></dir><dir name="Dolistv8"><file hash="255c05052b1a4371193d6174ea9a8a94" name="Calculatedfields.php" /><file hash="0c66d48562faaa3641a190becc66f618" name="Customfields.php" /><dir name="Calculatedfields"><file hash="106dc6dd921c134378002992e4d94e08" name="Collection.php" /></dir><dir name="Customfields"><file hash="93a52bb46b05487e79471448b46ca51e" name="Collection.php" /></dir><dir name="Export"><dir name="Adapter"><file hash="08a870e9120893dfe74349313bbb0c75" name="Abstract.php" /><file hash="83d064b83909ac3a4421d474397b5029" name="Address1.php" /><file hash="b9dc124ff88ecbaa750e580f97b246f2" name="Address2.php" /><file hash="b87316bf23926e93485b6868323f88a4" name="Address3.php" /><file hash="75e243f2a3526955ea7d94cad4798ec2" name="City.php" /><file hash="b2372fe91c4a61bd81549fbee4722e85" name="Company.php" /><file hash="176e3a58ab1371ffd87a8dd41ff6231b" name="Country.php" /><file hash="a47e3ada99704b2cfebd7ed151d39762" name="Default.php" /><file hash="a96d9b7d0d6e810533df36901e0dc7ac" name="Fax.php" /><file hash="f044aed5b697abb4b5b7722307413fef" name="Phone.php" /><file hash="1a84be76756c8b6e550a683301bf455f" name="Postcode.php" /><dir name="Date"><file hash="c46a5408f7f314ff3a81c71af1fa15e2" name="Default.php" /><file hash="5e90b0c82c4c462d4c54354d4ded91eb" name="Firstorder.php" /><file hash="918c1394a1079430b1805d424766d057" name="Lastorder.php" /><file hash="0e27cb7666aa7d95c0208e86bf29f15c" name="Lastquotenotordered.php" /></dir><dir name="Int"><file hash="d7f2bf25cde508f18ef3591aa9b7239d" name="Avgnbdifferentproductsperorder.php" /><file hash="0e7cef58f9745684107006c1f19c3c18" name="Avgnbdifferentproductsperorderline.php" /><file hash="1072246ffeaaf5c65b2c44a831a9197c" name="Avgnbproductsperorder.php" /><file hash="01676e283d4796cb156d8e7ca9443f8b" name="Avgorderamountexcltax.php" /><file hash="aaa1d0f0019ded333b6f01c29ca30484" name="Avgorderamountincltax.php" /><file hash="695e7ca8c23c38962257db17c5de17f9" name="Firstorderamountexcltax.php" /><file hash="121c81d6629a62e03845391b263fc21a" name="Firstorderamountincltax.php" /><file hash="5e1363c976eb7cc14f3ca64ff1de9d1a" name="Lastnotorderedcartamountexcltax.php" /><file hash="383b2b6d23e6073c1719fcdda44f63fb" name="Lastnotorderedcartamountincltax.php" /><file hash="4ae1b5a8956d432aa224a07d39eda15b" name="Lastorderamountexcltax.php" /><file hash="0db2ba5e1f4a36aca38b003ba88daf3d" name="Lastorderamountincltax.php" /><file hash="c32efb9a18ad8f6645a940c9bd925c6c" name="Nbpromotionrulesused.php" /><file hash="b2d30d69093ac1e1971de239f2294414" name="Totalorderamountexcltax.php" /><file hash="fe7a821618d817fff93eb23a6e162c4c" name="Totalorderamountincltax.php" /><file hash="b203fbd80b38d7dd974fddb042661af0" name="Totalorderedproducts.php" /><file hash="d8fea3d3d98cd4ade81931d72b7eba0c" name="Totalorders.php" /></dir></dir></dir></dir><dir name="Reports"><file hash="3ec7cc4fd35c539db1411cbe0bf98a25" name="Collection.php" /></dir></dir><dir name="Service"><dir name="Dolistemt"><dir name="Request"><file hash="bfe76bef2f1301562f9003cacd82b5b1" name="Getauthenticationtoken.php" /><file hash="f08c835bbcb6ca69daf2bdeaaea28a4c" name="Gettemplatelist.php" /><file hash="06062e2ccf54c189874000d50d909de6" name="SendEmail.php" /></dir><dir name="Response"><file hash="387210c798ed818d410ac7a62a8f7a08" name="Getauthenticationtoken.php" /><file hash="ab3db8a6a1bc1e38dc163c28f64f9612" name="Gettemplatelist.php" /><file hash="45d3740fe05ecd90bf722b19725ad7d8" name="SendEmail.php" /></dir></dir><dir name="Dolistv8"><dir name="Request"><file hash="55a56a710b88398c99f1aaeb01816976" name="Createimport.php" /><file hash="af14961d044f007696452307b9f7a89e" name="Getauthenticationtoken.php" /><file hash="d085194dc5f599884969de6f5cc32f9d" name="Getcontact.php" /><file hash="d710c9e4d512a929e4aa2a0c32d1becc" name="Getfieldlist.php" /></dir><dir name="Response"><file hash="93e32967b4c1ba7ae0981023e49f9471" name="Createimport.php" /><file hash="5f14b532c12728495b6163092bce1003" name="Getauthenticationtoken.php" /><file hash="59c766c7fefe70fb1e18571f8904942a" name="Getcontact.php" /><file hash="1ab5aef6b09f671a382d5eef5a182bce" name="Getfieldlist.php" /></dir></dir><dir name="Message"><file hash="e10bee52c6cebf4ccd4c93a41afe5ae0" name="Abstract.php" /></dir></dir><dir name="System"><dir name="Config"><file hash="b64b291b560a8522094c203333cadae6" name="Check.php" /><dir name="Source"><file hash="3d7e993ac25b0ade883df78a9ef97b19" name="Group.php" /><dir name="Dolistemt"><file hash="de59edbfbae9db377ff561a49fcb8ff5" name="Defaulttemplate.php" /><file hash="6fe1abcf43f76468eaea0e3616584243" name="Errors.php" /><file hash="8debc19194b97203394b012b0258ac91" name="Template.php" /></dir><dir name="Dolistv8"><file hash="081e4f0dea584a9d4ff435069190671a" name="Customerattributelist.php" /><file hash="10485fb8f6477d5a55c2b8ddcd4c9d02" name="Customfield.php" /></dir><dir name="Email"><file hash="e5af986543b65db2684e4a62a3967a89" name="Template.php" /></dir></dir></dir></dir></dir><dir name="sql"><dir name="dolist_setup"><file hash="dfd2ee346a310bb35daafbe68c4794a3" name="mysql4-install-0.0.1.0.php" /><file hash="f073c48493bc6a0b9a58faec608c870c" name="mysql4-upgrade-0.0.1.0-0.0.1.1.php" /><file hash="cd2920e566d6733b9688720416ed5211" name="mysql4-upgrade-0.0.1.1-0.0.2.0.php" /><file hash="33db9c1fa136d893692a73e1b670caff" name="mysql4-upgrade-0.0.2.0-0.0.3.0.php" /><file hash="8b8d0544161894ab0c9ae56a5d2cca8c" name="mysql4-upgrade-0.0.3.0-0.0.4.0.php" /><file hash="afc7e28dd865ab008376ab58453a3221" name="mysql4-upgrade-0.0.4.0-0.0.5.0.php" /><file hash="33f55ec12f8b0481320491bfb71da3b1" name="mysql4-upgrade-0.0.5.0-0.0.6.0.php" /></dir></dir></dir></dir></target><target name="magelocale"><dir name="fr_FR"><file hash="5c3a5d77ce534894afdaaabde6ef6af7" name="Dolist_Net.csv" /></dir></target><target name="magelocal"><dir name="modules"><file hash="73c963262d3cb6831bf1240a165b215e" name="Dolist_Net.xml" /></dir></target></contents><dependencies><required><php><min>5.3.2</min><max>5.6.0</max></php></required></dependencies><authors><author><name>Dolist</name><user>Dolist</user><email>magento@dolist.net</email></author></authors><date>2015-06-02</date><compatibile /><channel>community</channel><description>&amp;lt;p&amp;gt;Take simultaneous advantage from both Magento's Community Edition or Enterprise
3
  Edition and Dolist's e-mail marketing platforms power. Dolist-V8 for e-mail marketing campaigns and
4
  Dolist-EMT for
5
  transactional messages in order to optimize both your prospects and customers relationship.&amp;lt;/p&amp;gt;&amp;#xD;
1
  <?xml version='1.0' encoding='utf-8'?>
2
+ <package><name>Dolist_Net</name><license uri="http://opensource.org/licenses/osl-3.0.php">OSL 3.0</license><notes>v2</notes><time>13:57:27</time><__packager>build_package.py v0.0.3</__packager><summary>Official extension for Dolist email marketing solution.</summary><stability>stable</stability><__commit_hash>e705dcaf98dc83be11b11be412f50a8d10ce7901</__commit_hash><version>2.0.0.7</version><extends /><contents><target name="mage"><dir name="shell"><file hash="9b10f919097a3abe18833961359449c4" name="dolist_export_segments.php" /></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file hash="9116ca5966c127c3a065d3ccf991f6dd" name="dolist.xml" /></dir><dir name="template"><dir name="dolist"><file hash="05db7ca8032551aea167c573c06d0287" name="configuration.phtml" /><file hash="468f46da25ee4c840098e0754299a9a1" name="customerexport.phtml" /><dir name="store"><file hash="4100093e08cf4ce57c317ee017cba630" name="switcher.phtml" /></dir><dir name="system"><dir name="config"><dir name="dolistemt"><file hash="ba10b87cd51fef3d88a0dcf747d8b8dc" name="testconnection.phtml" /></dir><dir name="dolistv8"><file hash="a9b57b458cb1dfb83f0f5061be82f9f9" name="array.phtml" /><file hash="5c89a07ee29d11640870592c2edfc114" name="testconnection.phtml" /></dir></dir></dir></dir></dir></dir></dir></dir></target><target name="magecommunity"><dir name="Dolist"><dir name="Net"><dir name="Block"><dir name="Adminhtml"><file hash="b5c65ae9b68d820870fb38e78e100265" name="Customerexport.php" /><file hash="fd8f4ad560d6777587a9ed90223c18c4" name="Edit.php" /><file hash="2e37abf70940f00b110279cef8b82280" name="Report.php" /><dir name="Customer"><file hash="8f6d9965be320c972d998f34171c4a5a" name="Edit.php" /></dir><dir name="Customersegment"><file hash="cf6a52e571dd475b96e93c00a8e2b5f0" name="Edit.php" /></dir><dir name="Edit"><file hash="057c9ee5853ea17801c990b42385fa5f" name="Form.php" /><file hash="45aba333e3e017601eff3a730e2991df" name="Tabs.php" /><dir name="Tab"><file hash="d93a56df1f7d60a8f4d275886f150ddf" name="Configuration.php" /><file hash="d1299519d583afd8b8afdad5ddafc326" name="Export.php" /><file hash="a55d01b5e4d114b20adef94f5dc503db" name="Report.php" /></dir></dir><dir name="System"><dir name="Config"><file hash="8393df0943d5575c31cb596c8d368ce6" name="Abstract.php" /><file hash="77b6b112b2492beb3dae124efe0b924a" name="Date.php" /><file hash="59fa9be3d71a648ab9d4dfe697d2e183" name="Enable.php" /><file hash="c62a40696ae0028b2908ed34768d8c2a" name="Switcher.php" /><file hash="883194919f569b7f49a12fd9d4f83082" name="Templatelist.php" /><dir name="Dolistemt"><file hash="9193591b22b093d9e5baaf83b0818ec8" name="Templatelist.php" /><file hash="4025ca1026614c48996c57112b25cf1c" name="Templatemapping.php" /><file hash="b95697d6fea9d16003f01b5a1f63db6a" name="Testconnection.php" /></dir><dir name="Dolistv8"><file hash="5be525c4398c036956d6489aa8fa582d" name="Attributelist.php" /><file hash="88336cf98961a1df4e23bf2de819c17d" name="Customdatefields.php" /><file hash="485252191fb609780609f7ec6b9d0fad" name="Customerattributelist.php" /><file hash="96a8428b3503291204d8922500e39210" name="Customintfields.php" /><file hash="2011749c69cae4968ded68dc4cce6945" name="Customstrfields.php" /><file hash="cb016b986834178808cad7dd9c8d96c2" name="Testconnection.php" /></dir></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file hash="651fed35ece40312ac21e2fb8efd1dea" name="CustomerdolistController.php" /><dir name="System"><dir name="Config"><file hash="9c42cecb347d4ffb4db54ee901345359" name="TestconnectionController.php" /></dir></dir></dir></dir><dir name="etc"><file hash="1f9d77e2b9f8e4b86f54f272eb213218" name="adminhtml.xml" /><file hash="3a7b19a76b041fe1fecaf3e56c55dc63" name="config.xml" /><file hash="f0d6b4651431d1d11532fe9402fc5003" name="system.xml" /></dir><dir name="Helper"><file hash="d7058bb7a3ae89c7a586d8b42ad64062" name="Data.php" /><file hash="1d28b2acc7b47c17bb17af60e60c891d" name="Log.php" /><file hash="46b027b6f19b5a4ba72e1e992ac95269" name="Queue.php" /></dir><dir name="Model"><file hash="61da7cc29853bb9ce85b0bb587545c99" name="Customersegment.php" /><file hash="84647426508242e63f12912bd49ce3be" name="Observer.php" /><file hash="5a820cdad6554553ba9ecc189862397e" name="Reports.php" /><file hash="0b383f9c0be8903d28b11f45cc643e1b" name="Service.php" /><dir name="Adminhtml"><file hash="8ff835df0881b386870fe52a116e10bb" name="Observer.php" /><dir name="System"><dir name="Config"><dir name="Backend"><dir name="Serialized"><file hash="ce8002b5ba1bd19901b5de4db7200672" name="Array.php" /></dir></dir><dir name="Source"><file hash="d594a5df0ec9c76ca0f55ac0c4422f56" name="Timeperiods.php" /></dir></dir></dir></dir><dir name="Dolistemt"><file hash="67917ea713604769bdc5e348d04830b4" name="Template.php" /><dir name="Email"><file hash="7e39b7cdc9a6f62c784937317d344d0b" name="Template.php" /></dir><dir name="Message"><file hash="3dd939ec132047606cc1f322677bcc1c" name="Queued.php" /></dir></dir><dir name="Dolistv8"><file hash="e627285fbd280f66ba8a286a666c289f" name="Calculatedfields.php" /><file hash="b1d4006ddf6c62b46bcadeb6a6b56fc0" name="Customfields.php" /><file hash="6a91b08ff749b635ffaff68a267cee53" name="Ftp.php" /></dir><dir name="Exporter"><file hash="35b7d1d7f6d5e49297be4e342c19d60a" name="Csv.php" /><dir name="Adapter"><file hash="c52f8d05c198b2ee691d25104aa191ca" name="Date.php" /><file hash="66b2ee18bdf3924011a068f936b8818a" name="Default.php" /><file hash="797f1a935a1f8e1a9ce213d6cf03c235" name="Int.php" /></dir></dir><dir name="Mysql4"><file hash="7a3a3de6ef2fd144c192ef60357e370f" name="Reports.php" /><dir name="Dolistemt"><file hash="f972ef82ba3003da8d849e60df044440" name="Template.php" /><dir name="Message"><file hash="466461ebec5e905d89659698a21ed0ed" name="Queued.php" /><dir name="Queued"><file hash="1b0ed0a91ecd7fb5941c694221d12578" name="Collection.php" /></dir></dir><dir name="Template"><file hash="7b845449076c1dfaee11a7b04cb50400" name="Collection.php" /></dir></dir><dir name="Dolistv8"><file hash="63e8d5f6589c8ffa587dbfdb6ad21027" name="Calculatedfields.php" /><file hash="0c66d48562faaa3641a190becc66f618" name="Customfields.php" /><dir name="Calculatedfields"><file hash="106dc6dd921c134378002992e4d94e08" name="Collection.php" /></dir><dir name="Customfields"><file hash="93a52bb46b05487e79471448b46ca51e" name="Collection.php" /></dir><dir name="Export"><dir name="Adapter"><file hash="08a870e9120893dfe74349313bbb0c75" name="Abstract.php" /><file hash="83d064b83909ac3a4421d474397b5029" name="Address1.php" /><file hash="b9dc124ff88ecbaa750e580f97b246f2" name="Address2.php" /><file hash="b87316bf23926e93485b6868323f88a4" name="Address3.php" /><file hash="75e243f2a3526955ea7d94cad4798ec2" name="City.php" /><file hash="b2372fe91c4a61bd81549fbee4722e85" name="Company.php" /><file hash="176e3a58ab1371ffd87a8dd41ff6231b" name="Country.php" /><file hash="a47e3ada99704b2cfebd7ed151d39762" name="Default.php" /><file hash="a96d9b7d0d6e810533df36901e0dc7ac" name="Fax.php" /><file hash="f044aed5b697abb4b5b7722307413fef" name="Phone.php" /><file hash="1a84be76756c8b6e550a683301bf455f" name="Postcode.php" /><dir name="Date"><file hash="c46a5408f7f314ff3a81c71af1fa15e2" name="Default.php" /><file hash="a48a0eed243297a43aa6461c1b5b6e03" name="Firstorder.php" /><file hash="05f3b71b731ef2705dbb6fa1368e896f" name="Lastorder.php" /><file hash="b05b9d4832f4d71b514cef3df5d2fffc" name="Lastquotenotordered.php" /></dir><dir name="Int"><file hash="ee37b3a560f78424f854a7b0ddfcb81a" name="Avgnbdifferentproductsperorder.php" /><file hash="99ed6713b29425a263f344605c30a92e" name="Avgnbdifferentproductsperorderline.php" /><file hash="4ced1dd88746fae3cc32d6c8f3305aec" name="Avgnbproductsperorder.php" /><file hash="cac637c6aa9c4e9b97c36727c9d7ecab" name="Avgorderamountexcltax.php" /><file hash="6573738e3dc12cbb2348633635c3f1fb" name="Avgorderamountincltax.php" /><file hash="89686b61f7e201bf64a26c91ff035a34" name="Firstorderamountexcltax.php" /><file hash="50f04945e8297134b6fde3c305ae4d0b" name="Firstorderamountincltax.php" /><file hash="93cd651cf1b246f8670604e1278b938d" name="Lastnotorderedcartamountexcltax.php" /><file hash="5ba8b21f31f42f72d017579313d7be02" name="Lastnotorderedcartamountincltax.php" /><file hash="60cb423f6ee43a558c6a1f376838701f" name="Lastorderamountexcltax.php" /><file hash="e59c163c0f82fe449ee6d4da5f3a02b9" name="Lastorderamountincltax.php" /><file hash="6adaf658e0cd36f0980344c727439d4c" name="Nbpromotionrulesused.php" /><file hash="f0c0d785e76069fd95095d33cd10f88f" name="Totalorderamountexcltax.php" /><file hash="0aca766b611a08ea57d01b8f8066e77f" name="Totalorderamountincltax.php" /><file hash="713e6a127000c24fa32edd98f3893e32" name="Totalorderedproducts.php" /><file hash="215bb7375fe16e53c4230659819c1e62" name="Totalorders.php" /></dir></dir></dir></dir><dir name="Reports"><file hash="3ec7cc4fd35c539db1411cbe0bf98a25" name="Collection.php" /></dir></dir><dir name="Service"><dir name="Dolistemt"><dir name="Request"><file hash="bfe76bef2f1301562f9003cacd82b5b1" name="Getauthenticationtoken.php" /><file hash="f08c835bbcb6ca69daf2bdeaaea28a4c" name="Gettemplatelist.php" /><file hash="06062e2ccf54c189874000d50d909de6" name="SendEmail.php" /></dir><dir name="Response"><file hash="387210c798ed818d410ac7a62a8f7a08" name="Getauthenticationtoken.php" /><file hash="ab3db8a6a1bc1e38dc163c28f64f9612" name="Gettemplatelist.php" /><file hash="45d3740fe05ecd90bf722b19725ad7d8" name="SendEmail.php" /></dir></dir><dir name="Dolistv8"><dir name="Request"><file hash="55a56a710b88398c99f1aaeb01816976" name="Createimport.php" /><file hash="af14961d044f007696452307b9f7a89e" name="Getauthenticationtoken.php" /><file hash="d085194dc5f599884969de6f5cc32f9d" name="Getcontact.php" /><file hash="d710c9e4d512a929e4aa2a0c32d1becc" name="Getfieldlist.php" /></dir><dir name="Response"><file hash="93e32967b4c1ba7ae0981023e49f9471" name="Createimport.php" /><file hash="5f14b532c12728495b6163092bce1003" name="Getauthenticationtoken.php" /><file hash="59c766c7fefe70fb1e18571f8904942a" name="Getcontact.php" /><file hash="1ab5aef6b09f671a382d5eef5a182bce" name="Getfieldlist.php" /></dir></dir><dir name="Message"><file hash="e10bee52c6cebf4ccd4c93a41afe5ae0" name="Abstract.php" /></dir></dir><dir name="System"><dir name="Config"><file hash="b64b291b560a8522094c203333cadae6" name="Check.php" /><dir name="Source"><file hash="3d7e993ac25b0ade883df78a9ef97b19" name="Group.php" /><dir name="Dolistemt"><file hash="de59edbfbae9db377ff561a49fcb8ff5" name="Defaulttemplate.php" /><file hash="6fe1abcf43f76468eaea0e3616584243" name="Errors.php" /><file hash="8debc19194b97203394b012b0258ac91" name="Template.php" /></dir><dir name="Dolistv8"><file hash="7bcd4cf17c51414df7c4633b6c89ddf2" name="Customerattributelist.php" /><file hash="10485fb8f6477d5a55c2b8ddcd4c9d02" name="Customfield.php" /></dir><dir name="Email"><file hash="e5af986543b65db2684e4a62a3967a89" name="Template.php" /></dir></dir></dir></dir></dir><dir name="sql"><dir name="dolist_setup"><file hash="dfd2ee346a310bb35daafbe68c4794a3" name="mysql4-install-0.0.1.0.php" /><file hash="f073c48493bc6a0b9a58faec608c870c" name="mysql4-upgrade-0.0.1.0-0.0.1.1.php" /><file hash="cd2920e566d6733b9688720416ed5211" name="mysql4-upgrade-0.0.1.1-0.0.2.0.php" /><file hash="33db9c1fa136d893692a73e1b670caff" name="mysql4-upgrade-0.0.2.0-0.0.3.0.php" /><file hash="8b8d0544161894ab0c9ae56a5d2cca8c" name="mysql4-upgrade-0.0.3.0-0.0.4.0.php" /><file hash="afc7e28dd865ab008376ab58453a3221" name="mysql4-upgrade-0.0.4.0-0.0.5.0.php" /><file hash="33f55ec12f8b0481320491bfb71da3b1" name="mysql4-upgrade-0.0.5.0-0.0.6.0.php" /><file hash="3b88e0c1e51137ebf1e3af199a4d59ab" name="mysql4-upgrade-2.0.0.6-2.0.0.7.php" /></dir></dir></dir></dir></target><target name="magelocale"><dir name="fr_FR"><file hash="fb0e33fdd1a7018e9cd00cb7ec2f8e73" name="Dolist_Net.csv" /></dir></target><target name="magelocal"><dir name="modules"><file hash="73c963262d3cb6831bf1240a165b215e" name="Dolist_Net.xml" /></dir></target></contents><dependencies><required><php><min>5.3.2</min><max>5.6.0</max></php></required></dependencies><authors><author><name>Dolist</name><user>Dolist</user><email>magento@dolist.net</email></author></authors><date>2015-08-26</date><compatibile /><channel>community</channel><description>&amp;lt;p&amp;gt;Take simultaneous advantage from both Magento's Community Edition or Enterprise
3
  Edition and Dolist's e-mail marketing platforms power. Dolist-V8 for e-mail marketing campaigns and
4
  Dolist-EMT for
5
  transactional messages in order to optimize both your prospects and customers relationship.&amp;lt;/p&amp;gt;&amp;#xD;
shell/dolist_export_segments.php ADDED
@@ -0,0 +1,95 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ require_once 'abstract.php';
3
+
4
+ /**
5
+ * Dolist Segment Export Shell Script
6
+ *
7
+ * @category Mage
8
+ * @package Mage_Shell
9
+ */
10
+ class Mage_Shell_Segments_Export extends Mage_Shell_Abstract
11
+ {
12
+
13
+ /**
14
+ * Run script
15
+ *
16
+ */
17
+ public function run()
18
+ {
19
+ if ($ids = $this->getArg('ids')) {
20
+ $this->_getHelper()->logDebug('Starting Segments export');
21
+ $process = new Mage_Index_Model_Process();
22
+ $process->setId("segment_export");
23
+ if($process->isLocked()){
24
+ $this->_getHelper()->logDebug('segment_export process is already locked');
25
+ return;
26
+ }
27
+ $process->lockAndBlock();
28
+ $this->_getHelper()->logDebug('segment_export was not locked, but now it is');
29
+
30
+ //Récuperation des ids des segments
31
+ $idList = explode(',',$ids);
32
+ $idList = array_filter($idList, 'is_numeric');
33
+
34
+ $existingSegmentIds = Mage::getModel('enterprise_customersegment/segment')->getCollection()->getAllIds();
35
+ $exportSegments = TRUE;
36
+
37
+ if (!is_array($existingSegmentIds)) {
38
+ $exportSegments = FALSE;
39
+ $msg = 'No segments defined yet.';
40
+ $this->_getHelper()->logError($msg);
41
+ } else {
42
+ foreach($idList as $segmentId) {
43
+ if (!in_array($segmentId, $existingSegmentIds)) {
44
+ $exportSegments = FALSE;
45
+ $msg = sprintf('Segment Id %s does not exist.',$segmentId);
46
+ $this->_getHelper()->logError($msg);
47
+ }
48
+ }
49
+ }
50
+
51
+ if ($exportSegments) {
52
+ foreach($idList as $segmentId) {
53
+ $this->_getHelper()->exportSegment($segmentId);
54
+ }
55
+ } else {
56
+ $msg = 'No segment were exported, please check segment ids provided';
57
+ $this->_getHelper()->logError($msg);
58
+ }
59
+ $process->unlock();
60
+ $this->_getHelper()->logDebug('Ending Segments export');
61
+
62
+ } else {
63
+ echo $this->usageHelp();
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Retrieve Usage Help Message
69
+ *
70
+ */
71
+ public function usageHelp()
72
+ {
73
+ return <<<USAGE
74
+ Usage: php -f dolist_export_segments.php -- [options]
75
+
76
+ --ids segmentId1,segmentId2 exports the list of segments defined by their id (comma separated)
77
+ help This help
78
+
79
+ USAGE;
80
+ }
81
+
82
+
83
+ /**
84
+ * Retrieve model helper
85
+ *
86
+ * @return Dolist_Net_Helper_Data
87
+ */
88
+ protected function _getHelper()
89
+ {
90
+ return Mage::helper('dolist');
91
+ }
92
+ }
93
+
94
+ $shell = new Mage_Shell_Segments_Export();
95
+ $shell->run();