dotmailermagento - Version 1.5.1

Version Notes

Product recommendation and dynamic content for connector.

Download this release

Release Info

Developer Calin Diacon
Extension dotmailermagento
Version 1.5.1
Comparing to
See all releases


Version 1.5.1

Files changed (90) hide show
  1. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Bestsellers.php +18 -0
  2. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Gridlist.php +104 -0
  3. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Insertvariable.php +13 -0
  4. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Messagedefault.php +46 -0
  5. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Password.php +12 -0
  6. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessagefour.php +23 -0
  7. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessageone.php +41 -0
  8. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessagethree.php +23 -0
  9. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessagetwo.php +23 -0
  10. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Validator.php +73 -0
  11. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Waitingfield.php +43 -0
  12. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Wrapper.php +53 -0
  13. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Couponinfo.php +18 -0
  14. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Crosssell.php +20 -0
  15. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Lostbasket.php +19 -0
  16. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Mostviewed.php +18 -0
  17. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Productpush.php +19 -0
  18. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Recentlyviewed.php +20 -0
  19. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Related.php +19 -0
  20. app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Upsell.php +19 -0
  21. app/code/local/Dotdigitalgroup/Email/Block/Basket.php +43 -0
  22. app/code/local/Dotdigitalgroup/Email/Block/Coupon.php +48 -0
  23. app/code/local/Dotdigitalgroup/Email/Block/Debug/Countcontacts.php +21 -0
  24. app/code/local/Dotdigitalgroup/Email/Block/Debug/Deletecontacts.php +21 -0
  25. app/code/local/Dotdigitalgroup/Email/Block/Debug/Forcecustomersync.php +21 -0
  26. app/code/local/Dotdigitalgroup/Email/Block/Debug/Forcelostbasketsync.php +21 -0
  27. app/code/local/Dotdigitalgroup/Email/Block/Debug/Forcesuppressedsync.php +21 -0
  28. app/code/local/Dotdigitalgroup/Email/Block/Debug/Initialsync.php +20 -0
  29. app/code/local/Dotdigitalgroup/Email/Block/Debug/Rescuenow.php +21 -0
  30. app/code/local/Dotdigitalgroup/Email/Block/Debug/Testcredentials.php +21 -0
  31. app/code/local/Dotdigitalgroup/Email/Block/Debug/Transactionalsync.php +20 -0
  32. app/code/local/Dotdigitalgroup/Email/Block/Products.php +53 -0
  33. app/code/local/Dotdigitalgroup/Email/Helper/Api/DotNetExample.php +182 -0
  34. app/code/local/Dotdigitalgroup/Email/Helper/Api/Restrequest.php +298 -0
  35. app/code/local/Dotdigitalgroup/Email/Helper/Data.php +96 -0
  36. app/code/local/Dotdigitalgroup/Email/Helper/File.php +159 -0
  37. app/code/local/Dotdigitalgroup/Email/Helper/Recommended.php +191 -0
  38. app/code/local/Dotdigitalgroup/Email/Model/Account/Test.php +40 -0
  39. app/code/local/Dotdigitalgroup/Email/Model/Api/Rest.php +729 -0
  40. app/code/local/Dotdigitalgroup/Email/Model/Connector/Account.php +218 -0
  41. app/code/local/Dotdigitalgroup/Email/Model/Connector/Customer.php +286 -0
  42. app/code/local/Dotdigitalgroup/Email/Model/Connector/Order.php +118 -0
  43. app/code/local/Dotdigitalgroup/Email/Model/Connector/Quote.php +75 -0
  44. app/code/local/Dotdigitalgroup/Email/Model/Connector/Wishlist.php +86 -0
  45. app/code/local/Dotdigitalgroup/Email/Model/Cron.php +58 -0
  46. app/code/local/Dotdigitalgroup/Email/Model/Customer/Customer.php +480 -0
  47. app/code/local/Dotdigitalgroup/Email/Model/Customer/Suppressed.php +85 -0
  48. app/code/local/Dotdigitalgroup/Email/Model/Customer/Wishlist/Item.php +100 -0
  49. app/code/local/Dotdigitalgroup/Email/Model/Dynamic/Product/Mapper.php +90 -0
  50. app/code/local/Dotdigitalgroup/Email/Model/Dynamic/Recommended.php +228 -0
  51. app/code/local/Dotdigitalgroup/Email/Model/Newsletter/Subscriber.php +19 -0
  52. app/code/local/Dotdigitalgroup/Email/Model/Observer.php +189 -0
  53. app/code/local/Dotdigitalgroup/Email/Model/Order.php +33 -0
  54. app/code/local/Dotdigitalgroup/Email/Model/Sales/Order.php +96 -0
  55. app/code/local/Dotdigitalgroup/Email/Model/Sales/Quote.php +289 -0
  56. app/code/local/Dotdigitalgroup/Email/Model/Sales/Sms.php +70 -0
  57. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Backend/Syncschedule/Customer.php +50 -0
  58. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Backend/Syncschedule/Suppressed.php +54 -0
  59. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Activebasket.php +12 -0
  60. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Addressbooks.php +30 -0
  61. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Campaigns.php +30 -0
  62. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Datafields.php +35 -0
  63. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Displayifnot.php +12 -0
  64. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Displaytype.php +13 -0
  65. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Gridview.php +21 -0
  66. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Lostbasket.php +21 -0
  67. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Orderlimit.php +19 -0
  68. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Orderstatus.php +16 -0
  69. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Sendcampain.php +30 -0
  70. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Syncfrequency.php +40 -0
  71. app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Timeperiod.php +13 -0
  72. app/code/local/Dotdigitalgroup/Email/Test/Model/Product.php +18 -0
  73. app/code/local/Dotdigitalgroup/Email/controllers/Adminhtml/DebugController.php +125 -0
  74. app/code/local/Dotdigitalgroup/Email/controllers/EmailController.php +133 -0
  75. app/code/local/Dotdigitalgroup/Email/etc/adminhtml.xml +43 -0
  76. app/code/local/Dotdigitalgroup/Email/etc/config.xml +289 -0
  77. app/code/local/Dotdigitalgroup/Email/etc/system.xml +1610 -0
  78. app/code/local/Dotdigitalgroup/Email/sql/connector_setup/mysql4-install-0.1.0.php +53 -0
  79. app/code/local/Dotdigitalgroup/Email/sql/connector_setup/mysql4-upgrade-1.1.1-1.1.2.php +9 -0
  80. app/code/local/Varien/Data/Collection.php +818 -0
  81. app/design/frontend/base/default/layout/connector.xml +37 -0
  82. app/design/frontend/base/default/template/connector/basket.phtml +63 -0
  83. app/design/frontend/base/default/template/connector/coupon.phtml +6 -0
  84. app/design/frontend/base/default/template/connector/price.phtml +428 -0
  85. app/design/frontend/base/default/template/connector/roi_code.phtml +23 -0
  86. app/design/frontend/base/default/template/connector/tracking_code.phtml +4 -0
  87. app/design/frontend/base/default/template/page/blank.phtml +1 -0
  88. app/design/frontend/base/default/template/page/connector/products.phtml +37 -0
  89. app/etc/modules/Dotdigitalgroup_Email.xml +9 -0
  90. package.xml +18 -0
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Bestsellers.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Bestsellers extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
6
+ {
7
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
8
+ $code = Mage::helper('connector')->getPasscode();
9
+ $order = Mage::helper('connector')->getLastOrderNo();
10
+ if(!strlen($code)) $code = '[PLEASE SET UP A PASSCODE]';
11
+ if(!$order) $order = '[PLEASE MAP THE LAST ORDER NO]';
12
+ $text = $baseUr . 'connector/email/products/order/@' . $order . '@/code/' . $code . '/mode/bestsellers';
13
+ $element->setData('value', $text);
14
+ $element->setData('disabled', 'disabled');
15
+ return parent::_getElementHtml($element);
16
+
17
+ }
18
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Gridlist.php ADDED
@@ -0,0 +1,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Gridlist extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
6
+ {
7
+ // Get the default HTML for this option
8
+ $html = parent::_getElementHtml($element);
9
+
10
+
11
+ $jQuery = '<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>';
12
+
13
+ $jQuery .='
14
+ <script type="text/javascript">
15
+ jQuery.noConflict();
16
+ jQuery(document).ready(function() {
17
+ var gridOptions = {
18
+ "4" : "4",
19
+ "8" : "8",
20
+ "12" : "12",
21
+ "16" : "16",
22
+ "20" : "20",
23
+ "24" : "24",
24
+ "28" : "28",
25
+ "32" : "32"
26
+
27
+ };
28
+ var listOptions = {
29
+ "2" : "2",
30
+ "4" : "4",
31
+ "6" : "6",
32
+ "8" : "8"
33
+ }
34
+
35
+ jQuery("#dynamic_content_products_related_display_type").change(function(){
36
+
37
+ var display_type = jQuery(this).closest("tr").next().find("select");
38
+ var display_mode = jQuery(this).val();
39
+ changeOptions(display_type, display_mode);
40
+
41
+
42
+ });
43
+
44
+ jQuery("#dynamic_content_products_upsell_display_type").change(function(){
45
+ var display_type = jQuery(this).closest("tr").next().find("select");
46
+ var display_mode = jQuery(this).val();
47
+ changeOptions(display_type, display_mode);
48
+
49
+ });
50
+ jQuery("#dynamic_content_products_crosssell_display_type").change(function(){
51
+ var display_type = jQuery(this).closest("tr").next().find("select");
52
+ var display_mode = jQuery(this).val();
53
+ changeOptions(display_type, display_mode);
54
+ });
55
+ jQuery("#dynamic_content_products_best_display_type").change(function(){
56
+ var display_type = jQuery(this).closest("tr").next().find("select");
57
+ var display_mode = jQuery(this).val();
58
+ changeOptions(display_type, display_mode);
59
+ });
60
+ jQuery("#dynamic_content_products_most_viewed_display_type").change(function(){
61
+ var display_type = jQuery(this).closest("tr").next().find("select");
62
+ var display_mode = jQuery(this).val();
63
+ changeOptions(display_type, display_mode);
64
+ });
65
+ jQuery("#dynamic_content_manual_product_search_display_type").change(function(){
66
+ var display_type = jQuery(this).closest("tr").next().find("select");
67
+ var display_mode = jQuery(this).val();
68
+ changeOptions(display_type, display_mode);
69
+ });
70
+ jQuery("#dynamic_content_products_recently_viewed_display_type").change(function(){
71
+ var display_type = jQuery(this).closest("tr").next().find("select");
72
+ var display_mode = jQuery(this).val();
73
+ changeOptions(display_type, display_mode);
74
+ });
75
+
76
+ function changeOptions(display_type, display_mode){
77
+ if(display_mode == "list"){
78
+ display_type.empty();
79
+
80
+ jQuery.each(listOptions, function(key, value) {
81
+ display_type.append(jQuery("<option></option>")
82
+ .attr("value", value).text(key));
83
+ });
84
+
85
+ }
86
+ if(display_mode == "grid"){
87
+ display_type.empty();
88
+ jQuery.each(gridOptions, function(key, value) {
89
+ display_type.append(jQuery("<option></option>")
90
+ .attr("value", value).text(key));
91
+ });
92
+ }
93
+ }
94
+
95
+ });
96
+ </script>';
97
+
98
+ $html .= $jQuery;
99
+
100
+ return $html;
101
+ }
102
+
103
+
104
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Insertvariable.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Insertvariable extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ public function _getElementHtml($element){
6
+
7
+ $element->setData('onclick', 'templateControl.openVariableChooser();return false;');
8
+
9
+
10
+ return parent::_getElementHtml($element);
11
+ }
12
+
13
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Messagedefault.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Messagedefault extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ const DEFAULT_TEXT = 'Default SMS Text';
6
+
7
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract$element){
8
+
9
+
10
+ $element->setData('placeholder', self::DEFAULT_TEXT);
11
+
12
+ $element->setData('after_element_html', "
13
+
14
+ <a href='#' onclick=\"injectText('sms_section_sms_message_one_message', '{{var order_number}}');return false;\">Insert Order Number</a>
15
+ <a href='#' onclick=\"injectText('sms_section_sms_message_one_message', '{{var customer_name}}');return false;\">Insert Customer Name</a>
16
+
17
+ <script type='text/javascript'>
18
+
19
+ function addText(text){
20
+ $('sms_section_sms_message_one_message').value += text;
21
+ }
22
+
23
+ function injectText(element,value){
24
+ var element_dom=document.getElementById(element);
25
+ if(document.selection){
26
+ element_dom.focus();
27
+ sel=document.selection.createRange();
28
+ sel.text=value;
29
+ return;
30
+ }if(element_dom.selectionStart||element_dom.selectionStart=='0'){
31
+ var t_start=element_dom.selectionStart;
32
+ var t_end=element_dom.selectionEnd;
33
+ var val_start=element_dom.value.substring(0,t_start);
34
+ var val_end=element_dom.value.substring(t_end,element_dom.value.length);
35
+ element_dom.value=val_start+value+val_end;
36
+ }else{
37
+ element_dom.value+=value;
38
+ }
39
+ }
40
+ </script>
41
+ ");
42
+ return parent::_getElementHtml($element);
43
+ }
44
+
45
+
46
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Password.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Password extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ public function _getElementHtml(Varien_Data_Form_Element_Abstract$element){
6
+
7
+ $element->setData('onchange', "apiValidation(this.form, this)");
8
+
9
+ return parent::_getElementHtml($element);
10
+
11
+ }
12
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessagefour.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Smsmessagefour extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ const DEFAULT_TEXT = 'Default SMS Text';
6
+
7
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract$element){
8
+
9
+
10
+ $element->setData('placeholder', self::DEFAULT_TEXT);
11
+
12
+ $element->setData('after_element_html', "
13
+
14
+ <a href='#' onclick=\"injectText('sms_section_sms_message_four_message', '{{var order_number}}');return false;\">Insert Order Number</a>
15
+ <a href='#' onclick=\"injectText('sms_section_sms_message_four_message', '{{var customer_name}}');return false;\">Insert Customer Name</a>
16
+
17
+
18
+ ");
19
+ return parent::_getElementHtml($element);
20
+ }
21
+
22
+
23
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessageone.php ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Smsmessageone extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ const DEFAULT_TEXT = 'Default SMS Text';
6
+
7
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract$element){
8
+
9
+
10
+ $element->setData('placeholder', self::DEFAULT_TEXT);
11
+
12
+ $element->setData('after_element_html', "
13
+
14
+ <a href='#' onclick=\"injectText('sms_section_sms_message_one_message', '{{var order_number}}');return false;\">Insert Order Number</a>
15
+ <a href='#' onclick=\"injectText('sms_section_sms_message_one_message', '{{var customer_name}}');return false;\">Insert Customer Name</a>
16
+
17
+ <script type='text/javascript'>
18
+ function injectText(element,value){
19
+ var element_dom=document.getElementById(element);
20
+ if(document.selection){
21
+ element_dom.focus();
22
+ sel=document.selection.createRange();
23
+ sel.text=value;
24
+ return;
25
+ }if(element_dom.selectionStart||element_dom.selectionStart=='0'){
26
+ var t_start=element_dom.selectionStart;
27
+ var t_end=element_dom.selectionEnd;
28
+ var val_start=element_dom.value.substring(0,t_start);
29
+ var val_end=element_dom.value.substring(t_end,element_dom.value.length);
30
+ element_dom.value=val_start+value+val_end;
31
+ }else{
32
+ element_dom.value+=value;
33
+ }
34
+ }
35
+ </script>
36
+ ");
37
+ return parent::_getElementHtml($element);
38
+ }
39
+
40
+
41
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessagethree.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Smsmessagethree extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ const DEFAULT_TEXT = 'Default SMS Text';
6
+
7
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract$element){
8
+
9
+
10
+ $element->setData('placeholder', self::DEFAULT_TEXT);
11
+
12
+ $element->setData('after_element_html', "
13
+
14
+ <a href='#' onclick=\"injectText('sms_section_sms_message_three_message', '{{var order_number}}');return false;\">Insert Order Number</a>
15
+ <a href='#' onclick=\"injectText('sms_section_sms_message_three_message', '{{var customer_name}}');return false;\">Insert Customer Name</a>
16
+
17
+
18
+ ");
19
+ return parent::_getElementHtml($element);
20
+ }
21
+
22
+
23
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Smsmessagetwo.php ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Smsmessagetwo extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ const DEFAULT_TEXT = 'Default SMS Text';
6
+
7
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract$element){
8
+
9
+
10
+ $element->setData('placeholder', self::DEFAULT_TEXT);
11
+
12
+ $element->setData('after_element_html', "
13
+
14
+ <a href='#' onclick=\"injectText('sms_section_sms_message_two_message', '{{var order_number}}');return false;\">Insert Order Number</a>
15
+ <a href='#' onclick=\"injectText('sms_section_sms_message_two_message', '{{var customer_name}}');return false;\">Insert Customer Name</a>
16
+
17
+
18
+ ");
19
+ return parent::_getElementHtml($element);
20
+ }
21
+
22
+
23
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Validator.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+
4
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Validator extends Mage_Adminhtml_Block_System_Config_Form_Field
5
+ {
6
+
7
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
8
+ {
9
+
10
+ // Get the default HTML for this option
11
+ $html = parent::_getElementHtml($element);
12
+
13
+ // Set up additional JavaScript for our validation using jQuery.
14
+
15
+ $jquery = '<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>';
16
+
17
+ $html .=$jquery;
18
+
19
+ $javaScript = "
20
+ <script type=\"text/javascript\">
21
+
22
+ jQuery.noConflict();
23
+
24
+ jQuery(document).ready(function() {
25
+ // Handler for .ready() called.
26
+
27
+ // Hide our validation block
28
+ jQuery('#row_connector_data_field_settings_customer_data_validator').hide();
29
+
30
+ // Add listener for changing select box
31
+ jQuery('#connector_data_field_settings_customer_data select').on('change', function() {
32
+
33
+ var currentSelection = jQuery(this).val();
34
+ var currentDropdownId = jQuery(this).attr('id');
35
+
36
+ // foreach of the select fields on our mapping page:
37
+ jQuery('select').each(function(){
38
+ var thisId = jQuery(this).attr('id');
39
+ if (thisId != currentDropdownId) {
40
+
41
+ var currentLabel = jQuery('label[for=\\'' + thisId + '\\']').text();
42
+ var thisVal = jQuery(this).val();
43
+
44
+ switch (thisVal) {
45
+ case '0':
46
+ // ignore DO NOT MAP fields
47
+ break;
48
+ case currentSelection:
49
+ // warning, that field is already mapped somewhere else - reset that value to 'Do not map''
50
+ alert('Warning! You have overwritten: '+currentLabel);
51
+ jQuery(this).val(0);
52
+ break;
53
+ default:
54
+ break;
55
+ break;
56
+ }
57
+
58
+ }
59
+
60
+ });
61
+
62
+ });
63
+
64
+ });
65
+
66
+
67
+ </script>";
68
+
69
+ $html .= $javaScript;
70
+ return $html;
71
+ }
72
+
73
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Waitingfield.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Waitingfield extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
7
+ {
8
+ // Get the default HTML for this option
9
+ $html = parent::_getElementHtml($element);
10
+
11
+ $html .= sprintf('<div id="loadingmask" style="position: fixed;">
12
+ <div class="loader" id="loading-mask-loader">
13
+ <img src="%sskin/adminhtml/default/default/images/ajax-loader-tr.gif" alt="%s"/>%s', preg_replace('/index.php\//', '', $this->getBaseUrl()), $this->__('Loading...'), $this->__('Loading...'))
14
+ . '<div id="loading-mask"></div></div>';
15
+
16
+ $jQuery = '<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js" ></script>';
17
+
18
+ $jQuery .='
19
+ <script type="text/javascript">
20
+ jQuery.noConflict();
21
+ jQuery(document).ready(function() {
22
+ //hide the load image field
23
+ jQuery("#row_connector_api_settings_api_credentials_validator .scope-label").hide();
24
+ var loadingmask = jQuery("#loadingmask");
25
+ loadingmask.hide();
26
+ loadingmask.css({top : "50\%", left: "50\%"})
27
+
28
+ jQuery("button").click(function(){
29
+
30
+ jQuery("body").css({"background-color": "black", "opacity": "0.4"});
31
+
32
+ loadingmask.show();
33
+ loadingmask.css({"display": "block", "opacity" : "1"});
34
+ })
35
+ });
36
+ </script>';
37
+
38
+ $html .= $jQuery;
39
+
40
+ return $html;
41
+ }
42
+
43
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Config/Wrapper.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Config_Wrapper extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
7
+ {
8
+ $element->setData('onchange', "apiValidation(this.form, this);");
9
+
10
+ $element->setData('after_element_html', "
11
+ <script>
12
+ document.observe('dom:loaded', function(){
13
+ apiValidation();
14
+
15
+ });
16
+ function apiValidation(form, element) {
17
+ var api_user = $('connector_api_settings_api_credentials_username');
18
+ var api_password = $('connector_api_settings_api_credentials_password');
19
+
20
+ var reloadurl = '{$this->getUrl('connector/debug/ajaxvalidation')}';
21
+
22
+ new Ajax.Request(reloadurl, {
23
+ method: 'post',
24
+ parameters: {'api_user' : api_user.value, 'api_password' : api_password.value},
25
+ onComplete: function(transport) {
26
+ Element.hide('loadingmask');
27
+ if(transport.responseText == '\"Valid\"'){
28
+ api_user.setStyle({
29
+ fontWeight: 'bold',
30
+ color: 'green' ,
31
+ background: 'transparent url(\"" . $this->getSkinUrl('images/success_msg_icon.gif') . "\") no-repeat right center'
32
+ })
33
+ }else{
34
+ api_user.setStyle({
35
+ fontWeight: 'bold',
36
+ color: 'red',
37
+ background: 'transparent url(\"" . $this->getSkinUrl('images/error_msg_icon.gif') . "\") no-repeat right center'
38
+ });
39
+
40
+ }
41
+ }
42
+ });
43
+
44
+ return false;
45
+ }
46
+
47
+ </script>
48
+ ");
49
+
50
+ return parent::_getElementHtml($element);
51
+
52
+ }
53
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Couponinfo.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Couponinfo extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
6
+ {
7
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
8
+ $code = Mage::helper('connector')->getPasscode();
9
+ if(!strlen($code))
10
+ $code = '[PLEASE SET UP A PASSCODE]';
11
+ $text = $baseUr . 'connector/email/coupon/id/[INSERT ID HERE]/code/'. $code;
12
+
13
+ $element->setData('value', $text);
14
+ $element->setData('disabled', 'disabled');
15
+ return parent::_getElementHtml($element);
16
+ }
17
+
18
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Crosssell.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Crosssell extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
6
+ {
7
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
8
+ $helper = Mage::helper('connector');
9
+ $code = $helper->getPasscode();
10
+ $order = $helper->getLastOrderNo();
11
+
12
+ if(!strlen($code) && !strlen($order)) $code = '[PLEASE SET UP A PASSCODE]';
13
+ if(!$order) $order = '[PLEASE MAP THE LAST ORDER NO]';
14
+
15
+ $text = $baseUr . 'connector/email/products/order/@' . $order . '@/code/' . $code . '/mode/crosssell';
16
+ $element->setData('value', $text);
17
+ $element->setData('disabled', 'disabled');
18
+ return parent::_getElementHtml($element);
19
+ }
20
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Lostbasket.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Lostbasket extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
7
+ {
8
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
9
+ $code = Mage::helper('connector')->getPasscode();
10
+ if(!strlen($code))
11
+ $code = '[PLEASE SET UP A PASSCODE]';
12
+ $text = $baseUr . 'connector/email/basket/email/@EMAIL@/code/'. $code;
13
+
14
+ $element->setData('value', $text);
15
+ $element->setData('disabled', 'disabled');
16
+ return parent::_getElementHtml($element);
17
+ }
18
+
19
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Mostviewed.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Mostviewed extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
6
+ {
7
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
8
+ $code = Mage::helper('connector')->getPasscode();
9
+ $order = Mage::helper('connector')->getLastOrderNo();
10
+ if(!strlen($code)) $code = '[PLEASE SET UP A PASSCODE]';
11
+ if(!$order) $order = '[PLEASE MAP THE LAST ORDER NO]';
12
+ $text = $baseUr . 'connector/email/products/order/@' . $order . '@/code/' . $code . '/mode/mostviewed';
13
+ $element->setData('value', $text);
14
+ $element->setData('disabled', 'disabled');
15
+ return parent::_getElementHtml($element);
16
+
17
+ }
18
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Productpush.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Productpush extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
6
+ {
7
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
8
+ $helper = Mage::helper('connector');
9
+ $code = $helper->getPasscode();
10
+ $order = $helper->getLastOrderNo();
11
+ if(!strlen($code)) $code = '[PLEASE SET UP A PASSCODE]';
12
+ if(!$order) $order = '[PLEASE MAP THE LAST ORDER NO]';
13
+ $text = $baseUr . 'connector/email/products/order/@' . $order . '@/code/' . $code . '/mode/productpush';
14
+ $element->setData('value', $text);
15
+ $element->setData('disabled', 'disabled');
16
+ return parent::_getElementHtml($element);
17
+
18
+ }
19
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Recentlyviewed.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Recentlyviewed extends Mage_Adminhtml_Block_System_Config_Form_Field
3
+ {
4
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
5
+ {
6
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
7
+ $helper = Mage::helper('connector');
8
+ $code = $helper->getPasscode();
9
+
10
+ $customerId = $helper->getMappedCustomerId();
11
+
12
+ if(!strlen($code)) $code = '[PLEASE SET UP A PASSCODE]';
13
+ if(!$customerId) $customerId = '[PLEASE MAP THE CUSTOMER ID]';
14
+ $text = $baseUr . 'connector/email/products/customer/@' . $customerId . '@/code/' . $code . '/mode/recentlyviewed';
15
+ $element->setData('value', $text);
16
+ $element->setData('disabled', 'disabled');
17
+ return parent::_getElementHtml($element);
18
+
19
+ }
20
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Related.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Related extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
6
+ {
7
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
8
+ $helper = Mage::helper('connector');
9
+ $code = $helper->getPasscode();
10
+ $order = $helper->getLastOrderNo();
11
+ if(!strlen($code)) $code = '[PLEASE SET UP A PASSCODE]';
12
+ if(!$order) $order = '[PLEASE MAP THE LAST ORDER NO]';
13
+ $text = $baseUr . 'connector/email/products/order/@' . $order . '@/code/' . $code . '/mode/related';
14
+ $element->setData('value', $text);
15
+
16
+ return parent::_getElementHtml($element);
17
+
18
+ }
19
+ }
app/code/local/Dotdigitalgroup/Email/Block/Adminhtml/System/Upsell.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Dotdigitalgroup_Email_Block_Adminhtml_System_Upsell extends Mage_Adminhtml_Block_System_Config_Form_Field
3
+ {
4
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
5
+ {
6
+ $baseUr = preg_replace('/index.php\//', '', Mage::getBaseUrl());
7
+ $helper = Mage::helper('connector');
8
+ $code = $helper->getPasscode();
9
+ $order = $helper->getLastOrderNo();
10
+
11
+ if(!strlen($code)) $code = '[PLEASE SET UP A PASSCODE]';
12
+ if(!$order) $order = '[PLEASE MAP THE LAST ORDER NO]';
13
+
14
+ $text = $baseUr . 'connector/email/products/order/@' . $order . '@/code/' . $code . '/mode/upsell';
15
+ $element->setData('value', $text);
16
+
17
+ return parent::_getElementHtml($element);
18
+ }
19
+ }
app/code/local/Dotdigitalgroup/Email/Block/Basket.php ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Basket extends Mage_Core_Block_Template
4
+ {
5
+ protected $_quote;
6
+
7
+ public function getBasketItems()
8
+ {
9
+ $params = $this->getRequest()->getParams();
10
+
11
+ if(!isset($params['email']) && !isset($params['code']))
12
+ exit();
13
+ Mage::helper('connector')->auth($params['code']);
14
+
15
+ $email = $params['email'];
16
+
17
+ $customer = Mage::getModel('customer/customer');
18
+ $customer->setWebsiteId(Mage::app()->getWebsite()->getId())->loadByEmail($email);
19
+
20
+ //last active guest basket
21
+ $quoteModel = Mage::getResourceModel('sales/quote_collection')
22
+ ->addFieldToFilter('is_active',1)
23
+ ->addFieldToFilter('items_count', array('gt' => 0))
24
+ ->addFieldToFilter('customer_email', $email)
25
+ ->setOrder('updated_at' , 'DESC')
26
+ ->setPageSize(1)
27
+ ;
28
+
29
+ $quoteModel = $quoteModel->getFirstItem();
30
+ $this->_quote = $quoteModel;
31
+
32
+ $store_id = $quoteModel->getStoreId();
33
+ Mage::app()->setCurrentStore($store_id);
34
+
35
+ return $quoteModel->getAllItems();;
36
+ }
37
+
38
+ public function getGrandTotal()
39
+ {
40
+ return $this->_quote->getGrandTotal();
41
+
42
+ }
43
+ }
app/code/local/Dotdigitalgroup/Email/Block/Coupon.php ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Coupon extends Mage_Core_Block_Template
4
+ {
5
+ public function generateCoupon()
6
+ {
7
+ $params = $this->getRequest()->getParams();
8
+ if(!isset($params['id']) || !isset($params['code']))
9
+ exit();
10
+ //coupon rule id
11
+ $couponCodeId = $params['id'];
12
+ $authCode = $params['code'];
13
+
14
+ //authenticate
15
+ Mage::helper('connector')->auth($authCode);
16
+
17
+ if($couponCodeId){
18
+
19
+ $rule = Mage::getModel('salesrule/rule')->load($couponCodeId);
20
+ $generator = Mage::getModel('salesrule/coupon_massgenerator');
21
+
22
+ $generator->setFormat( Mage_SalesRule_Helper_Coupon::COUPON_FORMAT_ALPHANUMERIC );
23
+ $generator->setRuleId($couponCodeId);
24
+ $generator->setUsesPerCoupon(1);
25
+ $generator->setDash( 3 );
26
+ $generator->setLength( 9);
27
+ $generator->setPrefix( '' );
28
+ $generator->setSuffix( '' );
29
+
30
+ //set the generation settings
31
+ $rule->setCouponCodeGenerator($generator);
32
+ $rule->setCouponType( Mage_SalesRule_Model_Rule::COUPON_TYPE_AUTO );
33
+
34
+ //generate the coupon
35
+ $coupon = $rule->acquireCoupon();
36
+ $couponCode = $coupon->getCode();
37
+
38
+ //save the type of coupon
39
+ $couponModel = Mage::getModel('salesrule/coupon')->loadByCode($couponCode);
40
+ $couponModel->setType(Mage_SalesRule_Model_Rule::COUPON_TYPE_NO_COUPON);
41
+ $couponModel->save();
42
+
43
+ return $couponCode;
44
+ }
45
+ return false;
46
+ }
47
+
48
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Countcontacts.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Countcontacts extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
7
+ $this->setElement($element);
8
+ return $this->_getAddRowButtonHtml($this->__('Check Customers Now'));
9
+ }
10
+
11
+ protected function _getAddRowButtonHtml($title) {
12
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/countcontacts");
13
+
14
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
15
+ ->setType('button')
16
+ ->setLabel($this->__($title))
17
+ ->setOnClick("window.location.href='" . $url . "'")
18
+ ->toHtml();
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Deletecontacts.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Deletecontacts extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
7
+ $this->setElement($element);
8
+ return $this->_getAddRowButtonHtml($this->__("Delete ID's Now"));
9
+ }
10
+
11
+ protected function _getAddRowButtonHtml($title) {
12
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/deletecontactsid");
13
+
14
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
15
+ ->setType('button')
16
+ ->setLabel($this->__($title))
17
+ ->setOnClick("window.location.href='" . $url . "'")
18
+ ->toHtml();
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Forcecustomersync.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Forcecustomersync extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
7
+ $this->setElement($element);
8
+ return $this->_getAddRowButtonHtml($this->__('Sync Customer Data Now'));
9
+ }
10
+
11
+ protected function _getAddRowButtonHtml($title) {
12
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/forcecustomersync");
13
+
14
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
15
+ ->setType('button')
16
+ ->setLabel($this->__($title))
17
+ ->setOnClick("window.location.href='" . $url . "'")
18
+ ->toHtml();
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Forcelostbasketsync.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Forcelostbasketsync extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
7
+ $this->setElement($element);
8
+ return $this->_getAddRowButtonHtml($this->__('Sync Lost Baskets Now'));
9
+ }
10
+
11
+ protected function _getAddRowButtonHtml($title) {
12
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/forcelostbasketsync");
13
+
14
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
15
+ ->setType('button')
16
+ ->setLabel($this->__($title))
17
+ ->setOnClick("window.location.href='" . $url . "'")
18
+ ->toHtml();
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Forcesuppressedsync.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Forcesuppressedsync extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
7
+ $this->setElement($element);
8
+ return $this->_getAddRowButtonHtml($this->__('Sync Suppressed Data Now'));
9
+ }
10
+
11
+ protected function _getAddRowButtonHtml($title) {
12
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/forcesuppressed");
13
+
14
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
15
+ ->setType('button')
16
+ ->setLabel($this->__($title))
17
+ ->setOnClick("window.location.href='" . $url . "'")
18
+ ->toHtml();
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Initialsync.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Initialsync extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
6
+ $this->setElement($element);
7
+ return $this->_getAddRowButtonHtml($this->__('Run Initialisation Synchronization'));
8
+ }
9
+
10
+ protected function _getAddRowButtonHtml($title) {
11
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/initialSync");
12
+
13
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
14
+ ->setType('button')
15
+ ->setLabel($this->__($title))
16
+ ->setOnClick("window.location.href='" . $url . "'")
17
+ ->toHtml();
18
+ }
19
+
20
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Rescuenow.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Rescuenow extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
7
+ $this->setElement($element);
8
+ return $this->_getAddRowButtonHtml($this->__('Send Lost Basket Campaigns Now'));
9
+ }
10
+
11
+ protected function _getAddRowButtonHtml($title) {
12
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/rescuenow");
13
+
14
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
15
+ ->setType('button')
16
+ ->setLabel($this->__($title))
17
+ ->setOnClick("window.location.href='" . $url . "'")
18
+ ->toHtml();
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Testcredentials.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Testcredentials extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
7
+ $this->setElement($element);
8
+ return $this->_getAddRowButtonHtml($this->__('Test Credentials'));
9
+ }
10
+
11
+ protected function _getAddRowButtonHtml($title) {
12
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/testcredentials");
13
+
14
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
15
+ ->setType('button')
16
+ ->setLabel($this->__($title))
17
+ ->setOnClick("window.location.href='" . $url . "'")
18
+ ->toHtml();
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Block/Debug/Transactionalsync.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Debug_Transactionalsync extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
6
+ $this->setElement($element);
7
+ return $this->_getAddRowButtonHtml($this->__('Run Baskets/Orders Synchronization'));
8
+ }
9
+
10
+ protected function _getAddRowButtonHtml($title) {
11
+ $url = Mage::helper('adminhtml')->getUrl("connector/debug/transactionalSync");
12
+
13
+ return $this->getLayout()->createBlock('adminhtml/widget_button')
14
+ ->setType('button')
15
+ ->setLabel($this->__($title))
16
+ ->setOnClick("window.location.href='" . $url . "'")
17
+ ->toHtml();
18
+ }
19
+
20
+ }
app/code/local/Dotdigitalgroup/Email/Block/Products.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Block_Products extends Mage_Core_Block_Template
4
+ {
5
+ /**
6
+ * get the products to display for table
7
+ */
8
+ public function getRecommendedProducts()
9
+ {
10
+ //get all params
11
+ $params = $this->getRequest()->getParams();
12
+ $productsToDisplay = array();
13
+
14
+ if(isset($params['customer'])){
15
+ $productRecommended = new Dotdigitalgroup_Email_Model_Dynamic_Recommended();
16
+ $productsToDisplay = $productRecommended->getProducts();
17
+ $orderId = false;
18
+
19
+ }else{
20
+
21
+ $orderId = $params['order'];
22
+ }
23
+
24
+
25
+
26
+ if($orderId){
27
+ $orderModel = Mage::getModel('sales/order')->load($orderId);
28
+ if($orderModel->getId()){
29
+ //order products
30
+ $productRecommended = new Dotdigitalgroup_Email_Model_Dynamic_Recommended($orderModel);
31
+
32
+ //get the order items recommendations
33
+ $productsToDisplay = $productRecommended->getProducts();
34
+ }
35
+ }
36
+
37
+ return $productsToDisplay;
38
+ }
39
+
40
+
41
+ public function getPriceHtml($product)
42
+ {
43
+ $this->setTemplate('connector/price.phtml');
44
+ $this->setProduct($product);
45
+ return $this->toHtml();
46
+ }
47
+
48
+ public function getMode()
49
+ {
50
+ return Mage::helper('connector/recommended')->getMode();
51
+
52
+ }
53
+ }
app/code/local/Dotdigitalgroup/Email/Helper/Api/DotNetExample.php ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * mag17.
4
+ *
5
+ * User: chrisroseuk
6
+ * Date: 19/04/2013
7
+ * Time: 17:10
8
+ *
9
+ */
10
+
11
+ /*
12
+ *
13
+ * using System;
14
+ using System.Collections.Generic;
15
+ using System.IO;
16
+ using System.Net;
17
+ using System.Text;
18
+ using System.Threading;
19
+ using Newtonsoft.Json;
20
+
21
+ namespace Email.ImportContacts
22
+ {
23
+ class Program
24
+ {
25
+ private const string UserName = "";
26
+ private const string Password = "";
27
+ private const int AddressBookId = 1188372; //Your address book here
28
+
29
+ static void Main(string[] args)
30
+ {
31
+ AppDomain.CurrentDomain.UnhandledException += PrintUnhandledException;
32
+
33
+ ApiContactImport contactImport = ImportContactsFromFile();
34
+ ApiContactImport contactImportResult = WaitUntilImportFinishes(contactImport);
35
+ PrintContactImport(contactImportResult);
36
+
37
+ Dictionary<String, String> contactImportReport = GetContactImportReport(contactImportResult.Id);
38
+ PrintContactImportReport(contactImportReport);
39
+
40
+ String csvReport = GetContactImportFaults(contactImportResult.Id);
41
+ PrintCsvReport(csvReport);
42
+ }
43
+
44
+ private static String GetContactImportFaults(Guid importId)
45
+ {
46
+ string url = String.Format("https://apiconnector.com/v2/contacts/import/{0}/report-faults", importId);
47
+ HttpWebRequest request = CreateRequest(url);
48
+ String result = ReadResultAsString(request);
49
+ return result;
50
+ }
51
+
52
+ private static void PrintCsvReport(string csvReport)
53
+ {
54
+ Console.WriteLine();
55
+ Console.WriteLine(csvReport);
56
+ }
57
+
58
+ private static Dictionary<string, string> GetContactImportReport(Guid importId)
59
+ {
60
+ string url = String.Format("https://apiconnector.com/v2/contacts/import/{0}/report", importId);
61
+ HttpWebRequest request = CreateRequest(url);
62
+ Dictionary<string, string> result = ReadResult<Dictionary<string, string>>(request);
63
+ return result;
64
+ }
65
+
66
+ private static ApiContactImport WaitUntilImportFinishes(ApiContactImport importResult)
67
+ {
68
+ ApiContactImport result = importResult;
69
+
70
+ while (result.Status == ApiContactImportStatuses.NotFinished)
71
+ {
72
+ Thread.Sleep(TimeSpan.FromSeconds(10));
73
+
74
+ HttpWebRequest request = CreateRequest("https://apiconnector.com/v2/contacts/import/" + importResult.Id);
75
+ result = ReadResult<ApiContactImport>(request);
76
+ }
77
+
78
+ return result;
79
+ }
80
+
81
+ private static ApiContactImport ImportContactsFromFile()
82
+ {
83
+ string url = String.Format("https://apiconnector.com/v2/address-books/{0}/contacts/import", AddressBookId);
84
+ HttpWebRequest request = CreateRequest(url);
85
+ request.Method = "POST";
86
+
87
+ AddContactsToRequest(request);
88
+
89
+ ApiContactImport result = ReadResult<ApiContactImport>(request);
90
+ return result;
91
+ }
92
+
93
+ private static void AddContactsToRequest(HttpWebRequest request)
94
+ {
95
+ String boundary = Guid.NewGuid().ToString("N");
96
+ request.ContentType = String.Format(@"multipart/form-data; boundary=""{0}""", boundary);
97
+
98
+ using (BinaryWriter writer = new BinaryWriter(request.GetRequestStream()))
99
+ {
100
+ writer.Write(Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"));
101
+
102
+ const string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\n\r\n";
103
+ string header = string.Format(headerTemplate, "Contacts", "Contacts.csv");
104
+
105
+ byte[] headerbytes = Encoding.UTF8.GetBytes(header);
106
+ writer.Write(headerbytes);
107
+
108
+ byte[] contacts = File.ReadAllBytes("Contacts.csv");
109
+ writer.Write(contacts);
110
+
111
+ writer.Write(Encoding.UTF8.GetBytes("\r\n--" + boundary + "--\r\n"));
112
+ }
113
+ }
114
+
115
+ private static HttpWebRequest CreateRequest(string url)
116
+ {
117
+ HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
118
+ String base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(UserName + ":" + Password));
119
+ request.Headers.Add("Authorization", "Basic " + base64);
120
+
121
+ return request;
122
+ }
123
+
124
+ private static void PrintContactImport(ApiContactImport importResult)
125
+ {
126
+ Console.WriteLine("Import Id = {0}", importResult.Id);
127
+ Console.WriteLine("Import Status = {0}", importResult.Status);
128
+ }
129
+
130
+ private static void PrintContactImportReport(Dictionary<String, String> contactImportReport)
131
+ {
132
+ Console.WriteLine();
133
+ foreach (KeyValuePair<string, string> pair in contactImportReport)
134
+ {
135
+ Console.WriteLine("{0,-20} = {1}", pair.Key, pair.Value);
136
+ }
137
+ }
138
+
139
+ private static String ReadResultAsString(WebRequest request)
140
+ {
141
+ String result;
142
+
143
+ using (WebResponse response = request.GetResponse())
144
+ {
145
+ using (StreamReader reader = new StreamReader(response.GetResponseStream()))
146
+ {
147
+ result = reader.ReadToEnd();
148
+ }
149
+ }
150
+
151
+ return result;
152
+ }
153
+
154
+ private static TResult ReadResult<TResult>(WebRequest request)
155
+ {
156
+ TResult result;
157
+
158
+ using (WebResponse response = request.GetResponse())
159
+ {
160
+ using (StreamReader reader = new StreamReader(response.GetResponseStream()))
161
+ {
162
+ JsonSerializer serializer = new JsonSerializer();
163
+ using (JsonTextReader jsonReader = new JsonTextReader(reader))
164
+ {
165
+ result = serializer.Deserialize<TResult>(jsonReader);
166
+ }
167
+ }
168
+ }
169
+
170
+ return result;
171
+ }
172
+
173
+ private static void PrintUnhandledException(object sender, UnhandledExceptionEventArgs e)
174
+ {
175
+ Console.WriteLine(e.ExceptionObject);
176
+ }
177
+ }
178
+ }
179
+ *
180
+ *
181
+ *
182
+ */
app/code/local/Dotdigitalgroup/Email/Helper/Api/Restrequest.php ADDED
@@ -0,0 +1,298 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Helper_Api_Restrequest extends Dotdigitalgroup_Email_Helper_Data
4
+ {
5
+ protected $url;
6
+ protected $verb;
7
+ protected $requestBody;
8
+ protected $requestLength;
9
+ protected $username;
10
+ protected $password;
11
+ protected $acceptType;
12
+ protected $responseBody;
13
+ protected $responseInfo;
14
+
15
+ public function __construct() // ($url = null, $verb = 'GET', $requestBody = null)
16
+ {
17
+ $this->url = null; //$url;
18
+ $this->verb = null; //$verb;
19
+ $this->requestBody = null; //$requestBody;
20
+ $this->requestLength = 0;
21
+ $this->username = Mage::getStoreConfig('connector_api_settings/api_credentials/username');
22
+ $this->password = Mage::getStoreConfig('connector_api_settings/api_credentials/password');
23
+ $this->acceptType = 'application/json';
24
+ $this->responseBody = null;
25
+ $this->responseInfo = null;
26
+
27
+ if ($this->requestBody !== null)
28
+ {
29
+ $this->buildPostBody();
30
+ }
31
+
32
+ //parent::__construct();
33
+ }
34
+
35
+ private function prettyPrint( $json )
36
+ {
37
+ $result = '';
38
+ $level = 0;
39
+ $prev_char = '';
40
+ $in_quotes = false;
41
+ $ends_line_level = NULL;
42
+ $json_length = strlen( $json );
43
+
44
+ for( $i = 0; $i < $json_length; $i++ ) {
45
+ $char = $json[$i];
46
+ $new_line_level = NULL;
47
+ $post = "";
48
+ if( $ends_line_level !== NULL ) {
49
+ $new_line_level = $ends_line_level;
50
+ $ends_line_level = NULL;
51
+ }
52
+ if( $char === '"' && $prev_char != '\\' ) {
53
+ $in_quotes = !$in_quotes;
54
+ } else if( ! $in_quotes ) {
55
+ switch( $char ) {
56
+ case '}': case ']':
57
+ $level--;
58
+ $ends_line_level = NULL;
59
+ $new_line_level = $level;
60
+ break;
61
+
62
+ case '{': case '[':
63
+ $level++;
64
+ case ',':
65
+ $ends_line_level = $level;
66
+ break;
67
+
68
+ case ':':
69
+ $post = " ";
70
+ break;
71
+
72
+ case " ": case "\t": case "\n": case "\r":
73
+ $char = "";
74
+ $ends_line_level = $new_line_level;
75
+ $new_line_level = NULL;
76
+ break;
77
+ }
78
+ }
79
+ if( $new_line_level !== NULL ) {
80
+ $result .= "\n".str_repeat( "\t", $new_line_level );
81
+ }
82
+ $result .= $char.$post;
83
+ $prev_char = $char;
84
+ }
85
+
86
+ return $result;
87
+ }
88
+
89
+ // returns the object as JSON
90
+ public function toJSON($pretty=false){
91
+
92
+ if (!$pretty) {
93
+ return json_encode($this->expose());
94
+ }
95
+ else {
96
+ return $this->prettyPrint(json_encode($this->expose()));
97
+ }
98
+ }
99
+
100
+ // exposes the class as an array of objects
101
+ public function expose() {
102
+
103
+ return get_object_vars($this);
104
+
105
+ }
106
+
107
+
108
+ public function flush ()
109
+ {
110
+ $this->requestBody = null;
111
+ $this->requestLength = 0;
112
+ $this->verb = 'GET';
113
+ $this->responseBody = null;
114
+ $this->responseInfo = null;
115
+ }
116
+
117
+ public function execute ()
118
+ {
119
+ $ch = curl_init();
120
+ $this->setAuth($ch);
121
+
122
+ try
123
+ {
124
+ switch (strtoupper($this->verb))
125
+ {
126
+ case 'GET':
127
+ $this->executeGet($ch);
128
+ break;
129
+ case 'POST':
130
+ $this->executePost($ch);
131
+ break;
132
+ case 'PUT':
133
+ $this->executePut($ch);
134
+ break;
135
+ case 'DELETE':
136
+ $this->executeDelete($ch);
137
+ break;
138
+ default:
139
+ throw new InvalidArgumentException('Current verb (' . $this->verb . ') is an invalid REST verb.');
140
+ }
141
+ }
142
+ catch (InvalidArgumentException $e)
143
+ {
144
+ curl_close($ch);
145
+ throw $e;
146
+ }
147
+ catch (Exception $e)
148
+ {
149
+ curl_close($ch);
150
+ throw $e;
151
+ }
152
+
153
+ }
154
+
155
+ public function buildPostBody($data = null)
156
+ {
157
+ $data = ($data !== null)? $data : $this->requestBody;
158
+
159
+ if (!is_array($data)){
160
+ throw new InvalidArgumentException('Invalid data input for postBody. Array expected');
161
+ }
162
+
163
+ $data = http_build_query($data, '', '&');
164
+ $this->requestBody = $data;
165
+ }
166
+
167
+ protected function executeGet ($ch)
168
+ {
169
+ $this->doExecute($ch);
170
+ }
171
+
172
+ protected function executePost ($ch)
173
+ {
174
+ if (!is_string($this->requestBody))
175
+ {
176
+ $this->buildPostBody();
177
+ }
178
+
179
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $this->requestBody);
180
+ curl_setopt($ch, CURLOPT_POST, 1);
181
+
182
+ $this->doExecute($ch);
183
+ }
184
+
185
+ protected function executePut($ch)
186
+ {
187
+ if (!is_string($this->requestBody)){
188
+ $this->buildPostBody();
189
+ }
190
+
191
+ $this->requestLength = strlen($this->requestBody);
192
+
193
+ $fh = fopen('php://memory', 'rw');
194
+ fwrite($fh, $this->requestBody);
195
+ rewind($fh);
196
+
197
+ curl_setopt($ch, CURLOPT_INFILE, $fh);
198
+ curl_setopt($ch, CURLOPT_INFILESIZE, $this->requestLength);
199
+ curl_setopt($ch, CURLOPT_PUT, true);
200
+
201
+ $this->doExecute($ch);
202
+
203
+ fclose($fh);
204
+ }
205
+
206
+ protected function executeDelete ($ch)
207
+ {
208
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');
209
+
210
+ $this->doExecute($ch);
211
+ }
212
+
213
+ protected function doExecute (&$curlHandle)
214
+ {
215
+ $this->setCurlOpts($curlHandle);
216
+ $this->responseBody = curl_exec($curlHandle);
217
+ $this->responseInfo = curl_getinfo($curlHandle);
218
+
219
+ curl_close($curlHandle);
220
+ }
221
+
222
+ protected function setCurlOpts (&$curlHandle)
223
+ {
224
+ curl_setopt($curlHandle, CURLOPT_TIMEOUT, 10);
225
+ curl_setopt($curlHandle, CURLOPT_URL, $this->url);
226
+ curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true);
227
+ curl_setopt($curlHandle, CURLOPT_HTTPHEADER, array ('Accept: ' . $this->acceptType ,'Content-Type: application/json'));
228
+ }
229
+
230
+ protected function setAuth (&$curlHandle)
231
+ {
232
+ if ($this->username !== null && $this->password !== null)
233
+ {
234
+ curl_setopt($curlHandle, CURLAUTH_BASIC, CURLAUTH_DIGEST);
235
+ curl_setopt($curlHandle, CURLOPT_USERPWD, $this->username . ':' . $this->password);
236
+ }
237
+ }
238
+
239
+ public function getAcceptType ()
240
+ {
241
+ return $this->acceptType;
242
+ }
243
+
244
+ public function setAcceptType ($acceptType)
245
+ {
246
+ $this->acceptType = $acceptType;
247
+ }
248
+
249
+ public function getPassword ()
250
+ {
251
+ return $this->password;
252
+ }
253
+
254
+ public function setPassword ($password)
255
+ {
256
+ $this->password = $password;
257
+ }
258
+
259
+ public function getResponseBody ()
260
+ {
261
+ return $this->responseBody;
262
+ }
263
+
264
+ public function getResponseInfo ()
265
+ {
266
+ return $this->responseInfo;
267
+ }
268
+
269
+ public function getUrl ()
270
+ {
271
+ return $this->url;
272
+ }
273
+
274
+ public function setUrl ($url)
275
+ {
276
+ $this->url = $url;
277
+ }
278
+
279
+ public function getUsername ()
280
+ {
281
+ return $this->username;
282
+ }
283
+
284
+ public function setUsername ($username)
285
+ {
286
+ $this->username = $username;
287
+ }
288
+
289
+ public function getVerb ()
290
+ {
291
+ return $this->verb;
292
+ }
293
+
294
+ public function setVerb ($verb)
295
+ {
296
+ $this->verb = $verb;
297
+ }
298
+ }
app/code/local/Dotdigitalgroup/Email/Helper/Data.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * empty helper to keep admin from breaking
4
+ */
5
+ class Dotdigitalgroup_Email_Helper_Data extends Mage_Core_Helper_Abstract
6
+ {
7
+ const XML_PATH_PASSCODE = 'connector_advanced_settings/external/passcode';
8
+ const XML_PATH_LAST_ORDER_NO = 'connector_data_field_settings/customer_data/last_order_no';
9
+ const XML_PATH_MAPPING_CUSTOMER_ID = 'connector_data_field_settings/customer_data/customer_id';
10
+ const XML_PATH_ENABLED_LOGS = 'connector_advanced_settings/admin/debug';
11
+
12
+
13
+ /**
14
+ * return the time scheldule for the cronjob
15
+ * @param $code
16
+ * @return mixed
17
+ */
18
+ public function getSchelduledAtCronjob($code)
19
+ {
20
+ /* @var $collection Mage_Cron_Model_Resource_Schedule_Collection */
21
+ $collection = Mage::getModel('cron/schedule')->getCollection();
22
+ $collection->addFieldToFilter('job_code', $code)
23
+ ->addFieldToFilter('status', Mage_Cron_Model_Schedule::STATUS_PENDING)
24
+ ->addOrder('scheduled_at', Varien_Data_Collection_Db::SORT_ORDER_DESC)
25
+ ->getSelect()->limit(1);
26
+ $schedule = $collection->getFirstItem();
27
+
28
+ $scheduleAt = $schedule->getData('scheduled_at');
29
+
30
+ return $scheduleAt;
31
+ }
32
+
33
+ public function auth($authRequest)
34
+ {
35
+ if($authRequest == Mage::getStoreConfig(self::XML_PATH_PASSCODE)){
36
+ return true;
37
+ }
38
+
39
+ if($this->isEnabledLogs())
40
+ $this->log('authenication failed : ' . $authRequest , null, 'auth.log');
41
+ exit();
42
+ }
43
+
44
+ public function getMappedCustomerId()
45
+ {
46
+ return Mage::getStoreConfig(self::XML_PATH_MAPPING_CUSTOMER_ID);
47
+ }
48
+
49
+ public function getPasscode()
50
+ {
51
+ return Mage::getStoreConfig(self::XML_PATH_PASSCODE);
52
+ }
53
+
54
+ public function getLastOrderNo()
55
+ {
56
+ return Mage::getStoreConfig(self::XML_PATH_LAST_ORDER_NO);
57
+
58
+ }
59
+
60
+ public function log($data, $level = Zend_Log::DEBUG, $filename = 'api.log')
61
+ {
62
+ if($this->isEnabledLogs()){
63
+ $filename = 'connector_' . $filename;
64
+
65
+ Mage::log($data, $level, $filename, $force = true);
66
+ }
67
+ }
68
+
69
+ public function isEnabledLogs()
70
+ {
71
+ return (bool) Mage::getStoreConfig(self::XML_PATH_ENABLED_LOGS);
72
+ }
73
+
74
+ public function isOrderTransactionalEnabled()
75
+ {
76
+ return (bool) Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Order::XML_PATH_TRANSACTIONAL_DATA_ENABLED);
77
+ }
78
+
79
+ public function isCustomerSyncEnabled()
80
+ {
81
+ return (bool) Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CUSTOMER_SYNC_ENABLE);
82
+ }
83
+
84
+ public function getConnectorVersion()
85
+ {
86
+
87
+ $modules = (array) Mage::getConfig()->getNode('modules')->children();
88
+
89
+ if(isset($modules['Dotdigitalgroup_Email'])){
90
+
91
+ $moduleName = $modules['Dotdigitalgroup_Email'];
92
+ return $moduleName->version;
93
+ }
94
+ return '';
95
+ }
96
+ }
app/code/local/Dotdigitalgroup/Email/Helper/File.php ADDED
@@ -0,0 +1,159 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ empty helper to keep admin from breaking
4
+ */
5
+ class Dotdigitalgroup_Email_Helper_File extends Dotdigitalgroup_Email_Helper_Data
6
+ {
7
+
8
+ /**
9
+ * Location of files we are building
10
+ */
11
+
12
+ private $_output_folder; // set in _construct
13
+ private $_output_archive_folder; // set in _construct
14
+
15
+ private $delimiter; // set in _construct
16
+ private $enclosure; // set in _construct
17
+
18
+ public function __construct() {
19
+
20
+ $this->_output_folder = Mage::getBaseDir('var') . DS . 'export' . DS . 'email';
21
+ $this->_output_archive_folder = $this->_output_folder . DS . 'archive';
22
+
23
+ $this->delimiter = ','; // tab character
24
+ $this->enclosure = '"';
25
+ } // end
26
+
27
+
28
+ public function getOutputFolder() {
29
+ $this->pathExists($this->_output_folder);
30
+ return $this->_output_folder;
31
+ } // end
32
+
33
+ public function getArchiveFolder() {
34
+ $this->pathExists($this->_output_archive_folder);
35
+ return $this->_output_archive_folder;
36
+ } // end
37
+
38
+ /* Return the full filepath */
39
+ public function getFilePath($filename) {
40
+ return $this->getOutputFolder() . DS . $filename;
41
+ }
42
+
43
+ public function archiveCSV($filename) {
44
+
45
+ $this->moveFile($this->getOutputFolder(), $this->getArchiveFolder(), $filename);
46
+ }
47
+
48
+ /**
49
+ * Moves the output file from one folder to the next
50
+ *
51
+ * @param string $source_folder
52
+ * @param string $dest_folder
53
+ */
54
+ public function moveFile($source_folder, $dest_folder, $filename ){
55
+
56
+ // generate the full file paths
57
+ $source_filepath = $source_folder . DS . $filename;
58
+ $dest_filepath = $dest_folder . DS . $filename;
59
+
60
+ // rename the file
61
+ rename($source_filepath, $dest_filepath);
62
+
63
+ } // end
64
+
65
+
66
+ /**
67
+ * Output an array to the output file FORCING Quotes around all fields
68
+ * @param $filepath
69
+ * @param $csv
70
+ */
71
+ public function outputForceQuotesCSV($filepath, $csv) {
72
+
73
+ $fqCsv = $this->arrayToCsv($csv,chr(9),'"',true,false);
74
+ // Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
75
+ $fp = fopen($filepath, "a");
76
+
77
+ // for some reason passing the preset delimiter/enclosure variables results in error
78
+ if (fwrite($fp, $fqCsv) == 0 ) //$this->delimiter $this->enclosure
79
+ {
80
+ Mage::throwException('Problem writing CSV file');
81
+ }
82
+ fclose($fp);
83
+
84
+ } // end
85
+
86
+
87
+ /**
88
+ * Output an array to the output file
89
+ * @param $filepath
90
+ * @param $csv
91
+ */
92
+ public function outputCSV($filepath, $csv) {
93
+
94
+ // Open for writing only; place the file pointer at the end of the file. If the file does not exist, attempt to create it.
95
+ $handle = fopen($filepath, "a");
96
+
97
+ // for some reason passing the preset delimiter/enclosure variables results in error
98
+ if (fputcsv($handle, $csv, ',', '"') == 0 ) //$this->delimiter $this->enclosure
99
+ {
100
+ Mage::throwException('Problem writing CSV file');
101
+ }
102
+
103
+ fclose($handle);
104
+
105
+ } // end
106
+
107
+
108
+ /**
109
+ * If the path does not exist then create it
110
+ * @param string $path
111
+ */
112
+ public function pathExists($path) {
113
+ if (!is_dir( $path ) ) {
114
+ mkdir($path, 0777, true);
115
+ } // end
116
+
117
+ return;
118
+
119
+ } // end
120
+
121
+
122
+ protected function arrayToCsv( array &$fields, $delimiter, $enclosure, $encloseAll = false, $nullToMysqlNull = false ) {
123
+ $delimiter_esc = preg_quote($delimiter, '/');
124
+ $enclosure_esc = preg_quote($enclosure, '/');
125
+
126
+ $output = array();
127
+ foreach ( $fields as $field ) {
128
+ if ($field === null && $nullToMysqlNull) {
129
+ $output[] = 'NULL';
130
+ continue;
131
+ }
132
+
133
+ // Enclose fields containing $delimiter, $enclosure or whitespace
134
+ if ( $encloseAll || preg_match( "/(?:${delimiter_esc}|${enclosure_esc}|\s)/", $field ) ) {
135
+ $output[] = $enclosure . str_replace($enclosure, $enclosure . $enclosure, $field) . $enclosure;
136
+ }
137
+ else {
138
+ $output[] = $field;
139
+ }
140
+ }
141
+
142
+ return implode( $delimiter, $output )."\n";
143
+ }
144
+
145
+ /**
146
+ * Delete file or directory
147
+ * @param $path
148
+ * @return bool
149
+ */
150
+ public function deleteDir($path)
151
+ {
152
+ $class_func = array(__CLASS__, __FUNCTION__);
153
+ return is_file($path) ?
154
+ @unlink($path) :
155
+ array_map($class_func, glob($path.'/*')) == @rmdir($path);
156
+ }
157
+
158
+
159
+ }
app/code/local/Dotdigitalgroup/Email/Helper/Recommended.php ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Helper_Recommended extends Mage_Core_Helper_Abstract
4
+ {
5
+ const XML_PATH_RELATED_PRODUCTS_TYPE = 'dynamic_content/products/related_display_type';
6
+ const XML_PATH_UPSELL_PRODUCTS_TYPE = 'dynamic_content/products/upsell_display_type';
7
+ const XML_PATH_CROSSSELL_PRODUCTS_TYPE = 'dynamic_content/products/crosssell_display_type';
8
+ const XML_PATH_BESTSELLER_PRODUCT_TYPE = 'dynamic_content/products/best_display_type';
9
+ const XML_PATH_MOSTVIEWED_PRODUCT_TYPE = 'dynamic_content/products/most_viewed_display_type';
10
+ const XML_PATH_RECENTLYVIEWED_PRODUCT_TYPE = 'dynamic_content/products/recently_viewed_display_type';
11
+ const XML_PATH_PRODUCTPUSH_TYPE = 'dynamic_content/manual_product_search/display_type';
12
+
13
+
14
+ const XML_PATH_RELATED_PRODUCTS_ITEMS = 'dynamic_content/products/related_items_to_display';
15
+ const XML_PATH_UPSELL_PRODUCTS_ITEMS = 'dynamic_content/products/upsell_items_to_display';
16
+ const XML_PATH_CROSSSELL_PRODUCTS_ITEMS = 'dynamic_content/products/crosssell_items_to_display';
17
+ const XML_PATH_BESTSELLER_PRODUCT_ITEMS = 'dynamic_content/products/best_items_to_display';
18
+ const XML_PATH_MOSTVIEWED_PRODUCT_ITEMS = 'dynamic_content/products/most_viewed_items_to_display';
19
+ const XML_PATH_RECENTLYVIEWED_PRODUCT_ITEMS = 'dynamic_content/products/recently_viewed_items_to_display';
20
+ const XML_PATH_PRODUCTPUSH_DISPLAY_ITEMS = 'dynamic_content/manual_product_search/items_to_display';
21
+
22
+
23
+ const XML_PATH_BESTSELLER_TIME_PERIOD = 'dynamic_content/products/best_time_period';
24
+ const XML_PATH_MOSTVIEWED_TIME_PERIOD = 'dynamic_content/products/most_viewed_time_period';
25
+
26
+ const XML_PATH_FALLBACK_PRODUCTS_ITEMS = 'dynamic_content/fallback_products/product_list';
27
+
28
+ const XML_PATH_PRODUCTPUSH_ITEMS = 'dynamic_content/manual_product_search/products_push_list';
29
+
30
+ public $periods = array('week', 'month', 'year');
31
+
32
+
33
+ /**
34
+ * product recommendation type
35
+ * @var string
36
+ */
37
+
38
+
39
+ /**
40
+ * Dispay mode
41
+ * @return mixed|string grid:list
42
+ */
43
+ public function getMode()
44
+ {
45
+ $mode = Mage::app()->getRequest()->getParam('mode');
46
+ $type = '';
47
+ if($mode){
48
+ switch($mode){
49
+ case 'related':
50
+ $type = $this->getRelatedProductsType();
51
+ break;
52
+ case 'upsell':
53
+ $type = $this->getUpsellProductsType();
54
+ break;
55
+ case 'crosssell':
56
+ $type = $this->getCrosssellProductsType();
57
+ break;
58
+ case 'bestsellers':
59
+ $type = $this->getBestSellerProductsType();
60
+ break;
61
+ case 'mostviewed':
62
+ $type = $this->getMostViewedProductsType();
63
+ break;
64
+ case 'recentlyviewed':
65
+ $type = $this->getRecentlyviewedProductsType();
66
+ break;
67
+ case 'productpush':
68
+ $type = $this->getProductpushProductsType();
69
+ }
70
+ }
71
+
72
+ return $type;
73
+ }
74
+
75
+ public function getRelatedProductsType($storeId = 0)
76
+ {
77
+ return Mage::getStoreConfig(self::XML_PATH_RELATED_PRODUCTS_TYPE, $storeId);
78
+ }
79
+
80
+ public function getUpsellProductsType($storeId = 0)
81
+ {
82
+ return Mage::getStoreConfig(self::XML_PATH_UPSELL_PRODUCTS_TYPE, $storeId);
83
+
84
+ }
85
+
86
+ public function getCrosssellProductsType($storeId = 0)
87
+ {
88
+ return Mage::getStoreConfig(self::XML_PATH_CROSSSELL_PRODUCTS_TYPE, $storeId);
89
+ }
90
+
91
+ public function getBestSellerProductsType($storeId = 0)
92
+ {
93
+ return Mage::getStoreConfig(self::XML_PATH_BESTSELLER_PRODUCT_TYPE, $storeId);
94
+ }
95
+
96
+ public function getMostViewedProductsType($storeId = 0)
97
+ {
98
+ return Mage::getStoreConfig(self::XML_PATH_MOSTVIEWED_PRODUCT_TYPE, $storeId);
99
+ }
100
+
101
+ public function getRecentlyviewedProductsType($storeId = 0)
102
+ {
103
+ return Mage::getStoreConfig(self::XML_PATH_RECENTLYVIEWED_PRODUCT_TYPE, $storeId);
104
+ }
105
+
106
+ public function getProductpushProductsType($storeId = 0)
107
+ {
108
+ return Mage::getStoreConfig(self::XML_PATH_PRODUCTPUSH_TYPE, $storeId);
109
+ }
110
+
111
+
112
+
113
+ /**
114
+ * Limit of products displayed
115
+ * @return int|mixed
116
+ */
117
+ public function getLimit()
118
+ {
119
+ $mode = Mage::registry('mode');
120
+ $limit = 0;
121
+ if($mode){
122
+ switch($mode){
123
+ case 'related':
124
+ $limit = Mage::getStoreConfig(self::XML_PATH_RELATED_PRODUCTS_ITEMS);
125
+ break;
126
+ case 'upsell':
127
+ $limit = Mage::getStoreConfig(self::XML_PATH_UPSELL_PRODUCTS_ITEMS);
128
+ break;
129
+ case 'crosssell':
130
+ $limit = Mage::getStoreConfig(self::XML_PATH_CROSSSELL_PRODUCTS_ITEMS);
131
+ break;
132
+ case 'bestsellers':
133
+ $limit = Mage::getStoreConfig(self::XML_PATH_BESTSELLER_PRODUCT_ITEMS);
134
+ break;
135
+ case 'mostviewed':
136
+ $limit = Mage::getStoreConfig(self::XML_PATH_MOSTVIEWED_PRODUCT_ITEMS);
137
+ break;
138
+ case 'recentlyviewed':
139
+ $limit = Mage::getStoreConfig(self::XML_PATH_RECENTLYVIEWED_PRODUCT_ITEMS);
140
+ break;
141
+ case 'productpush':
142
+ $limit = Mage::getStoreConfig(self::XML_PATH_PRODUCTPUSH_DISPLAY_ITEMS);
143
+ }
144
+ }
145
+
146
+ return $limit;
147
+ }
148
+
149
+ public function getFallbackIds(){
150
+ $fallbackIds = Mage::getStoreConfig(self::XML_PATH_FALLBACK_PRODUCTS_ITEMS);
151
+ if($fallbackIds)
152
+ return explode(',', Mage::getStoreConfig(self::XML_PATH_FALLBACK_PRODUCTS_ITEMS));
153
+ return array();
154
+ }
155
+
156
+ public function getTimeFromConfig($config)
157
+ {
158
+ $now = new Zend_Date();
159
+ $period = '';
160
+ if($config == 'mostviewed')
161
+ $period = Mage::getStoreConfig(self::XML_PATH_MOSTVIEWED_TIME_PERIOD);
162
+ elseif($config == 'bestsellers')
163
+ $period = Mage::getStoreConfig(self::XML_PATH_BESTSELLER_TIME_PERIOD);
164
+ elseif($config == 'recentlyviewed')
165
+ $period = Mage::getStoreConfig(self::XML_PATH_MOSTVIEWED_TIME_PERIOD);
166
+
167
+ if($period == 'week'){
168
+ $sub = Zend_Date::WEEK;
169
+ }elseif($period == 'month'){
170
+ $sub = Zend_Date::MONTH;
171
+ }elseif($period == 'year'){
172
+ $sub = Zend_Date::YEAR;
173
+ }
174
+
175
+ if(isset($sub)){
176
+ $period = $now->sub(1, $sub);
177
+
178
+ return $period->tostring(Zend_Date::ISO_8601);
179
+ }
180
+ }
181
+
182
+ public function getProductPushIds($storeId = 0)
183
+ {
184
+ $productIds = Mage::getStoreConfig(self::XML_PATH_PRODUCTPUSH_ITEMS, $storeId);
185
+
186
+ return explode(',', $productIds);
187
+
188
+ }
189
+
190
+
191
+ }
app/code/local/Dotdigitalgroup/Email/Model/Account/Test.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Account_Test extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+ const TEST_API_USERNAME = 'apiuser-2c692ba1bbd2@apiconnector.com';
6
+ const TEST_API_PASSWORD = 'Magento2013';
7
+ const TEST_API_CAMPAIGN = '2643928';
8
+ const TEST_CONTACT_ID = '13';
9
+ const TEST_CONTACT_EMAIL = 'ben.staveley@dotmailer.co.uk';
10
+
11
+ public function test($api_user = null, $api_password = null)
12
+ {
13
+ if($api_user && $api_password){
14
+ $this->_api_user = $api_user;
15
+ $this->_api_password = $api_password;
16
+ }
17
+ $response = array('errors' => 0, 'message' => '');
18
+ $result = $this->testAccount();
19
+ if(!$result){
20
+ $response['errors'] = true;
21
+ $response['message'] = 'Invalid API Credentials.';
22
+ }
23
+ $this->sendInstallConfirmation();
24
+
25
+ return $response;
26
+ }
27
+
28
+ public function sendInstallConfirmation()
29
+ {
30
+ $this->_api_user = self::TEST_API_USERNAME;
31
+ $this->_api_password = self::TEST_API_PASSWORD;
32
+ $testEmail = self::TEST_CONTACT_EMAIL;
33
+ $contactId = self::TEST_CONTACT_ID;
34
+ $campaignId = self::TEST_API_CAMPAIGN;
35
+
36
+ // send initial info
37
+ $this->sendIntallInfo($testEmail, $contactId, $campaignId);
38
+
39
+ }
40
+ }
app/code/local/Dotdigitalgroup/Email/Model/Api/Rest.php ADDED
@@ -0,0 +1,729 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Api_Rest extends Mage_Core_Model_Abstract
4
+ {
5
+ const REST_WAIT_UPLOAD_TIME = 5;
6
+ //rest api data
7
+ const REST_ACCOUNT_INFO = 'https://apiconnector.com/v2/account-info';
8
+ const REST_CONTACTS = 'https://apiconnector.com/v2/contacts/';
9
+ const REST_CONTACTS_IMPORT = 'https://apiconnector.com/v2/contacts/import/';
10
+ const REST_ADDRESS_BOOKS = 'https://apiconnector.com/v2/address-books';
11
+ const REST_DATA_FILEDS = 'https://apiconnector.com/v2/data-fields';
12
+ const REST_TRANSACTIONAL_DATA_IMPORT = 'https://apiconnector.com/v2/contacts/transactional-data/import/';
13
+ const REST_SINGLE_TRANSACTIONAL_DATA_IMPORT = 'https://apiconnector.com/v2/contacts/transactional-data/';
14
+ const REST_CAMPAIGN_SEND = 'https://apiconnector.com/v2/campaigns/send';
15
+ const REST_CONTACTS_SUPPRESSED_SINCE = 'https://apiconnector.com/v2/contacts/suppressed-since/';
16
+ const REST_DATA_FIELDS_CAMPAIGNS = 'https://apiconnector.com/v2/campaigns';
17
+ const REST_SMS_MESSAGE_SEND_TO = 'https://apiconnector.com/v2/sms-messages/send-to/';
18
+ //rest error responces
19
+ const REST_CONTACT_NOT_FOUND = 'Error: ERROR_CONTACT_NOT_FOUND';
20
+ const REST_STATUS_IMPORT_REPORT_NOT_FOUND = 'Import is not processed yet or completed with error. ERROR_IMPORT_REPORT_NOT_FOUND';
21
+ const REST_STATUS_REPORT_NOTFINISHED = 'NotFinished';
22
+ const REST_TRANSACTIONAL_DATA_NOT_EXISTS = 'Error: ERROR_TRANSACTIONAL_DATA_DOES_NOT_EXIST';
23
+ const REST_API_USAGE_EXCEEDED = 'Your account has generated excess API activity and is being temporarily capped. Please contact support. ERROR_APIUSAGE_EXCEEDED';
24
+
25
+ protected $_api_user;
26
+ protected $_api_password;
27
+ protected $_customers_file_slug = 'customer_sync';
28
+ protected $_subscribers_file_slug = 'subscriber_sync';
29
+ protected $_api_helper;
30
+ protected $_subscribers_address_book_id;
31
+ protected $_customers_address_book_id;
32
+ protected $_filename;
33
+ protected $_subscribers_filename;
34
+ protected $_customers_filename;
35
+ protected $_limit = 10;
36
+ protected $_address_book_id;
37
+ public $fileHelper; /** @var Dotdigitalgroup_Email_Helper_File */
38
+ protected $_helper;
39
+ public $result = array('error' => false, 'message' => '');
40
+ protected $_log_filename = 'api.log';
41
+
42
+ public function __construct()
43
+ {
44
+ // connect to default
45
+ $this->_api_user = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
46
+ $this->_api_password = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD);
47
+ $this->_helper = Mage::helper('connector');
48
+ }
49
+
50
+ /**
51
+ * Deletes all contacts from a given address book.
52
+ * @param $addressBooks
53
+ * @return mixed
54
+ */
55
+ protected function deleteAddressBookContacts($addressBooks) {
56
+
57
+ foreach ($addressBooks as $addressBookId) {
58
+
59
+ // skip if contact Id is null otherwise the API will delete ALL contacts from the address book!!!
60
+ if ($addressBookId==null) continue;
61
+ $ch = curl_init("https://apiconnector.com/v2/address-books/{$addressBookId}/contacts/");
62
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
63
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
64
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
65
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
66
+
67
+ // delete the contact from the address book
68
+ $result = curl_exec($ch);
69
+ $result = json_decode($result);
70
+ }
71
+ }
72
+
73
+
74
+ /**
75
+ * Bulk creates, or bulk updates, contacts. Import format can either be CSV or Excel.
76
+ * Must include one column called "Email". Any other columns will attempt to map to your custom data fields.
77
+ * The ID of returned object can be used to query import progress.
78
+ * @param $filename
79
+ * @param $addressBookId
80
+ * @return mixed
81
+ */
82
+ protected function postAddressBookContactsImport($filename, $addressBookId)
83
+ {
84
+ // ...the API request
85
+ $uploadUrl = "https://apiconnector.com/v2/address-books/{$addressBookId}/contacts/import";
86
+ $ch = curl_init($uploadUrl);
87
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
88
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
89
+ curl_setopt($ch, CURLOPT_POSTFIELDS, array (
90
+ 'file' => '@'.$this->fileHelper->getFilePath($filename)
91
+ ));
92
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
93
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
94
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
95
+ 'Content-Type: multipart/form-data')
96
+ );
97
+ // send contacts to address book
98
+ $result = curl_exec($ch);
99
+ $result = json_decode($result);
100
+
101
+ return $result;
102
+ }
103
+
104
+ /**
105
+ * Adds a contact to a given address book.
106
+ * @param $addressBookId
107
+ * @param $contactAPI
108
+ * @return mixed
109
+ */
110
+ public function postAddressBookContacts($addressBookId, $contactAPI)
111
+ {
112
+ $data_string = json_encode($contactAPI);
113
+ $url = self::REST_ADDRESS_BOOKS . '/' . $addressBookId . '/contacts';
114
+ $ch = curl_init($url);
115
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
116
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
117
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
118
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
119
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
120
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
121
+ 'Content-Type: application/json',
122
+ 'Content-Length: ' . strlen($data_string))
123
+ );
124
+
125
+ // send campaign
126
+ $result = curl_exec($ch);
127
+ $result = json_decode($result);
128
+
129
+ return $result;
130
+ }
131
+
132
+ /**
133
+ * Deletes all contacts from a given address book.
134
+ * @param $addressBookId
135
+ * @param $contactId
136
+ */
137
+ public function deleteAddressBookContact($addressBookId, $contactId)
138
+ {
139
+ $url = self::REST_ADDRESS_BOOKS . '/' . $addressBookId . '/contacts/' . $contactId;
140
+ $ch = curl_init($url);
141
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
142
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
143
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
144
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
145
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
146
+ 'Content-Type: application/json'
147
+ ));
148
+ $result = curl_exec($ch);
149
+ }
150
+
151
+ /**
152
+ * Gets a report with statistics about what was successfully imported, and what was unable to be imported.
153
+ * @param $importId
154
+ * @return mixed
155
+ */
156
+ public function getContactsImportReport($importId)
157
+ {
158
+ $reportUrl = self::REST_CONTACTS_IMPORT . "{$importId}/report";
159
+ $ch = curl_init($reportUrl);
160
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
161
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
162
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
163
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
164
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
165
+ 'Content-Type: application/json')
166
+ );
167
+ // get the report
168
+ $result = curl_exec($ch);
169
+ $result = json_decode($result);
170
+ return $result;
171
+ }
172
+
173
+ public function getContacts($skip = 0, $limit = 1000)
174
+ {
175
+ $allContactsUrl = self::REST_CONTACTS . '?select=' . $limit . '&skip=' . $skip;
176
+ $ch = curl_init($allContactsUrl);
177
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
178
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
179
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
180
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
181
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
182
+ 'Content-Type: application/json'
183
+ ));
184
+ $data = curl_exec($ch);
185
+ $result = json_decode($data);
186
+
187
+ return $result;
188
+ }
189
+
190
+ public function getContactByEmail($email)
191
+ {
192
+ $contactInfoUrl = self::REST_CONTACTS . $email;
193
+ $ch = curl_init($contactInfoUrl);
194
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
195
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
196
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
197
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
198
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
199
+ 'Content-Type: application/json'
200
+ ));
201
+
202
+ $data = curl_exec($ch);
203
+ $result = json_decode($data);
204
+
205
+ return $result;
206
+ }
207
+ public function getContactById($contactId)
208
+ {
209
+ $contactInfoUrl = self::REST_CONTACTS . $contactId;
210
+ $ch = curl_init($contactInfoUrl);
211
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
212
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
213
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
214
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
215
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
216
+ 'Content-Type: application/json'
217
+ ));
218
+
219
+ $data = curl_exec($ch);
220
+ $result = json_decode($data);
221
+
222
+ return $result;
223
+ }
224
+
225
+ /**
226
+ * Creates an address book.
227
+ * @return mixed
228
+ */
229
+ public function postAddressBooks()
230
+ {
231
+ $contactInfoUrl = self::REST_ADDRESS_BOOKS;
232
+ $ch = curl_init($contactInfoUrl);
233
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
234
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
235
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
236
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
237
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
238
+ 'Content-Type: application/json'
239
+ ));
240
+ $data = curl_exec($ch);
241
+ $result = json_decode($data);
242
+ return $result;
243
+ }
244
+
245
+ /**
246
+ * Creates a campaign.
247
+ * @return mixed
248
+ */
249
+ protected function postCampaigns(){
250
+ $contactInfoUrl = self::REST_DATA_FIELDS_CAMPAIGNS;
251
+ $ch = curl_init($contactInfoUrl);
252
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
253
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
254
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
255
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
256
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
257
+ 'Content-Type: application/json'
258
+ ));
259
+ $data = curl_exec($ch);
260
+ $result = json_decode($data);
261
+ return $result;
262
+ }
263
+
264
+ /**
265
+ * Creates a data field within the account.
266
+ * @return mixed
267
+ */
268
+ protected function postDataFields() {
269
+ $contactInfoUrl = self::REST_DATA_FILEDS;
270
+ $ch_contact = curl_init($contactInfoUrl);
271
+ curl_setopt($ch_contact, CURLOPT_CUSTOMREQUEST, 'GET');
272
+ curl_setopt($ch_contact, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
273
+ curl_setopt($ch_contact, CURLOPT_RETURNTRANSFER, true);
274
+ curl_setopt($ch_contact, CURLOPT_SSL_VERIFYPEER, false);
275
+ curl_setopt($ch_contact, CURLOPT_HTTPHEADER, array(
276
+ 'Content-Type: application/json'
277
+ ));
278
+ $data = curl_exec($ch_contact);
279
+ $result = json_decode($data);
280
+ return $result;
281
+ }
282
+
283
+ /**
284
+ * Bulk creates, or bulk updates, contacts. Import format can either be CSV or Excel.
285
+ * Must include one column called "Email". Any other columns will attempt to map to your custom data fields.
286
+ * The ID of returned object can be used to query import progress.
287
+ * @param bool $waitFinished
288
+ * @return mixed
289
+ */
290
+ private function postContactsImport($waitFinished = false){
291
+ $importUrl = self::REST_CONTACTS_IMPORT;
292
+ $ch = curl_init($importUrl);
293
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
294
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
295
+ curl_setopt($ch, CURLOPT_POSTFIELDS, array (
296
+ 'file' => '@'.$this->getFilePath($this->_filename)
297
+ ));
298
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
299
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
300
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
301
+ 'Content-Type: multipart/form-data')
302
+ );
303
+ $result = curl_exec($ch);
304
+ $result = json_decode($result);
305
+
306
+ if($waitFinished)
307
+ $this->waitFinishedImport($result->id);
308
+ return $result;
309
+ }
310
+ public function updateContact($contactId, $data)
311
+ {
312
+ $data_string = json_encode($data);
313
+ $contactInfoUrl = self::REST_CONTACTS . $contactId;
314
+ $ch = curl_init($contactInfoUrl);
315
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
316
+ curl_setopt($ch, CURLOPT_POST, true);
317
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
318
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
319
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
320
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
321
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
322
+ 'Content-Type: application/json',
323
+ 'Content-Length: ' . strlen($data_string))
324
+ );
325
+ $data = curl_exec($ch);
326
+ $result = json_decode($data);
327
+ return $result;
328
+ }
329
+
330
+ /**
331
+ * Send connector campaings
332
+ * @param $campaignId
333
+ * @param $contacts
334
+ * @return mixed
335
+ */
336
+ public function sendCampaign($campaignId, $contacts)
337
+ {
338
+ $data = array(
339
+ 'username' => $this->_api_user,
340
+ 'password' => $this->_api_password,
341
+ "campaignId" => $campaignId,
342
+ "ContactIds" => $contacts
343
+ );
344
+
345
+ $this->_helper->log($data, null, $this->_log_filename);
346
+ $data_string = json_encode($data);
347
+ $campaignUrl = self::REST_CAMPAIGN_SEND;
348
+ $ch = curl_init($campaignUrl);
349
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
350
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
351
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
352
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
353
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
354
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
355
+ 'Content-Type: application/json',
356
+ 'Content-Length: ' . strlen($data_string))
357
+ );
358
+
359
+ // send campaign
360
+ $result = curl_exec($ch);
361
+ $result = json_decode($result);
362
+ $this->_helper->log($result, null, $this->_log_filename);
363
+
364
+ return $result;
365
+ }
366
+ private function waitFinishedImport($importId){
367
+
368
+ do{
369
+ // wait until do the report status call
370
+ sleep(self::REST_WAIT_UPLOAD_TIME);
371
+ // ...the API request
372
+ // Create a GET request
373
+
374
+ $reportUrl = self::REST_CONTACTS_IMPORT . "{$importId}/report";
375
+ $ch = curl_init($reportUrl);
376
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
377
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
378
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
379
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
380
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
381
+ 'Content-Type: application/json')
382
+ );
383
+
384
+ // get the report
385
+ $result = curl_exec($ch);
386
+ $result = json_decode($result);
387
+
388
+ }while(isset($result->message) && $result->message == self::REST_STATUS_REPORT_NOTFINISHED);
389
+
390
+ }
391
+
392
+ /**
393
+ * create new connector contact
394
+ * @param $email
395
+ * @return mixed
396
+ */
397
+ public function createNewContact($email)
398
+ {
399
+ $data = array(
400
+ 'Email' => $email,
401
+ 'EmailType' => 'Html'
402
+ );
403
+ $data_string = json_encode($data);
404
+ $ch = curl_init(self::REST_CONTACTS);
405
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
406
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
407
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
408
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
409
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
410
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
411
+ 'Content-Type: application/json',
412
+ 'Content-Length: ' . strlen($data_string))
413
+ );
414
+ $result = curl_exec($ch);
415
+ $result = json_decode($result);
416
+
417
+ return $result;
418
+ }
419
+
420
+ public function sendIntallInfo($testEmail, $contactId, $campaignId)
421
+ {
422
+ $numProducts = Mage::getModel('catalog/product')->getCollection()->getSize();
423
+ $numCustomers = Mage::getModel('customer/customer')->getCollection()->getSize();
424
+
425
+ $data = array(
426
+ 'Email' => $testEmail,
427
+ 'EmailType' => 'Html',
428
+ 'DataFields' => array(
429
+ array(
430
+ 'Key' => 'INSTALLCUSTOMERS',
431
+ 'Value' => (string)$numCustomers),
432
+ array(
433
+ 'Key' => 'INSTALLPRODUCTS',
434
+ 'Value' => (string)$numProducts),
435
+ array(
436
+ 'Key' => 'INSTALLURL',
437
+ 'Value' => Mage::getBaseUrl()),
438
+ array(
439
+ 'Key' => 'INSTALLAPI',
440
+ 'Value' => implode(',' , $this->getWebsiteAccounts())),
441
+ array(
442
+ 'Key' => 'PHPMEMORY',
443
+ 'Value' => ini_get('memory_limit') . ', V=' . Mage::helper('connector')->getConnectorVersion()
444
+ )
445
+ )
446
+ );
447
+
448
+ $this->updateContact($contactId, $data);
449
+ $this->sendCampaign($campaignId, array($contactId));
450
+
451
+ return ;
452
+ }
453
+ private function getWebsiteAccounts()
454
+ {
455
+ $accounts = array();
456
+ $websites = Mage::app()->getWebsites();
457
+ foreach ($websites as $website) {
458
+ $websiteId = $website->getWebsiteId();
459
+ $websiteModel = Mage::app()->getWebsite($websiteId);
460
+ $apiUsername = $websiteModel->getConfig('connector_api_settings/api_credentials/username');
461
+ if(! in_array($apiUsername, $accounts))
462
+ $accounts[] = $apiUsername;
463
+ }
464
+ return $accounts;
465
+ }
466
+
467
+ protected function getSuppressedSince($dateString)
468
+ {
469
+ $suppressedUrl = self::REST_CONTACTS_SUPPRESSED_SINCE . $dateString;
470
+ $ch = curl_init($suppressedUrl);
471
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
472
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
473
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
474
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
475
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
476
+ 'Content-Type: application/json'
477
+ ));
478
+
479
+ // get the list of suppressed contacts
480
+ $data = curl_exec($ch);
481
+ $data = json_decode($data);
482
+
483
+ return $data;
484
+
485
+ }
486
+ public function sendMultiTransactionalData($ordersData, $collectionName = 'Order')
487
+ {
488
+ $orders = array();
489
+ foreach ($ordersData as $order) {
490
+ if(isset($order->connector_id)){
491
+ $orders[] = array(
492
+ 'Key' => $order->id,
493
+ 'ContactIdentifier' => $order->connector_id,
494
+ 'Json' => json_encode($order->expose())
495
+ );
496
+ }
497
+ }
498
+
499
+ $data_string = json_encode($orders);
500
+ $transactionalUrl = self::REST_TRANSACTIONAL_DATA_IMPORT . $collectionName;
501
+
502
+ $ch = curl_init($transactionalUrl);
503
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
504
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
505
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
506
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
507
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
508
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
509
+ 'Content-Type: application/json',
510
+ 'Content-Length: ' . strlen($data_string))
511
+ );
512
+
513
+ // send contacts to connector
514
+ $result = curl_exec($ch);
515
+ $result = json_decode($result);
516
+
517
+ return $result;
518
+ }
519
+ protected function sendTransactionalData($quoteData, $collectionName = 'Basket')
520
+ {
521
+ // check if the transactional data is already set
522
+ $transactionalUrl = self::REST_SINGLE_TRANSACTIONAL_DATA_IMPORT . $collectionName . '/' . $quoteData->id ;
523
+ $ch = curl_init($transactionalUrl);
524
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
525
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
526
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
527
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
528
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
529
+ 'Content-Type: application/json'
530
+ ));
531
+ $result = curl_exec($ch);
532
+ $result = json_decode($result);
533
+
534
+ if(isset($result->message) && $result->message == self::REST_TRANSACTIONAL_DATA_NOT_EXISTS)
535
+ $transactionalUrl = self::REST_SINGLE_TRANSACTIONAL_DATA_IMPORT . $collectionName ;
536
+ else
537
+ $transactionalUrl = self::REST_SINGLE_TRANSACTIONAL_DATA_IMPORT . $collectionName . '/' . $result->key ;
538
+
539
+
540
+ $data = array(
541
+ 'Key' => $quoteData->id,
542
+ 'ContactIdentifier' => $quoteData->connector_id,
543
+ 'Json' => json_encode($quoteData->expose())
544
+ );
545
+
546
+
547
+ $data_string = json_encode($data);
548
+
549
+ $ch = curl_init($transactionalUrl);
550
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
551
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
552
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
553
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
554
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
555
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
556
+ 'Content-Type: application/json',
557
+ 'Content-Length: ' . strlen($data_string))
558
+ );
559
+
560
+ // send contacts to connector
561
+ $result = curl_exec($ch);
562
+ $result = json_decode($result);
563
+
564
+ return $result;
565
+ }
566
+
567
+ public function sendOrderTransactionalData($order, $collectionName = 'Order', $key = '')
568
+ {
569
+ $data = array(
570
+ 'Key' => $order->id,
571
+ 'ContactIdentifier' => $order->connector_id,
572
+ 'Json' => json_encode($order->expose())
573
+ );
574
+
575
+
576
+ $data_string = json_encode($data);
577
+
578
+ $transactionalUrl = self::REST_SINGLE_TRANSACTIONAL_DATA_IMPORT . $collectionName . '/' . $key;
579
+
580
+ $ch = curl_init($transactionalUrl);
581
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
582
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
583
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
584
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
585
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
586
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
587
+ 'Content-Type: application/json',
588
+ 'Content-Length: ' . strlen($data_string))
589
+ );
590
+
591
+ // send contacts to connector
592
+ $result = curl_exec($ch);
593
+ $result = json_decode($result);
594
+
595
+ if(! isset($result->message)){
596
+ $this->removeTransactionalData($order->connector_id, 'Basket');
597
+ }
598
+
599
+ return $result;
600
+ }
601
+ public function deleteContactsTransactionalData($collectionName = 'Order', $key = '')
602
+ {
603
+
604
+ $transactionalUrl = self::REST_SINGLE_TRANSACTIONAL_DATA_IMPORT . $collectionName . '/' . $key;
605
+
606
+ $ch = curl_init($transactionalUrl);
607
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
608
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
609
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
610
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
611
+
612
+ // send contacts to connector
613
+ $result = curl_exec($ch);
614
+ $result = json_decode($result);
615
+
616
+
617
+ return $result;
618
+ }
619
+
620
+ public function removeTransactionalData($contactId, $collectionName)
621
+ {
622
+ $transactionalUrl = 'https://apiconnector.com/v2/contacts/' . $contactId . '/transactional-data/' . $collectionName ;
623
+ $ch = curl_init($transactionalUrl);
624
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
625
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
626
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
627
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
628
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
629
+ 'Content-Type: application/json'
630
+ ));
631
+ $result = curl_exec($ch);
632
+
633
+ }
634
+
635
+ public function testAccount()
636
+ {
637
+ $url = self::REST_ACCOUNT_INFO;
638
+ $ch = curl_init($url);
639
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
640
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
641
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
642
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
643
+ $result = curl_exec($ch);
644
+ $result = json_decode($result);
645
+ if(isset($result->message)){
646
+ return false;
647
+ }
648
+
649
+ return true;
650
+ }
651
+
652
+ public function getAddressBookContacts($bookId, $skip = 0)
653
+ {
654
+ /**
655
+ * https://apiconnector.com/v2/address-books/{addressBookId}/contacts?withFullData={withFullData}&select={select}&skip={skip}
656
+ */
657
+ $url = self::REST_ADDRESS_BOOKS . '/' . $bookId . '/contacts' . '?skip=' . $skip;
658
+
659
+ $ch = curl_init($url);
660
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
661
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
662
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
663
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
664
+ $result = curl_exec($ch);
665
+ $result = json_decode($result);
666
+ return $result;
667
+
668
+ }
669
+
670
+ /**
671
+ * Send a single SMS message.
672
+ * @param $number
673
+ * @param $message
674
+ * @return mixed
675
+ */
676
+ public function postSmsMessagesSendTo($telephoneNumber, $message)
677
+ {
678
+ $data = array('Message' => $message);
679
+ $data_string = json_encode($data);
680
+ $ch = curl_init(self::REST_SMS_MESSAGE_SEND_TO . $telephoneNumber);
681
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
682
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
683
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
684
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
685
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
686
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
687
+ 'Content-Type: application/json',
688
+ 'Content-Length: ' . strlen($data_string))
689
+ );
690
+ $result = curl_exec($ch);
691
+ $result = json_decode($result);
692
+ return $result;
693
+ }
694
+
695
+ public function postContactsTransactionalDataImport($collectionName, $data = array())
696
+ {
697
+ $import = array();
698
+
699
+ foreach ($data as $one) {
700
+
701
+ $import[] = array(
702
+ 'Key' => $one->getId(),
703
+ 'ContactIdentifier' => $one->getCustomerId(),
704
+ 'Json' => json_encode($one->expose())
705
+ );
706
+ }
707
+
708
+ $data_string = json_encode($import);
709
+
710
+ $transactionalUrl = self::REST_TRANSACTIONAL_DATA_IMPORT . $collectionName;
711
+
712
+ $ch = curl_init($transactionalUrl);
713
+ curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
714
+ curl_setopt($ch, CURLOPT_USERPWD, $this->_api_user . ':' . $this->_api_password);
715
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
716
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
717
+ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
718
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
719
+ 'Content-Type: application/json',
720
+ 'Content-Length: ' . strlen($data_string))
721
+ );
722
+
723
+ // send contacts to connector
724
+ $result = curl_exec($ch);
725
+ $result = json_decode($result);
726
+
727
+ return $result;
728
+ }
729
+ }
app/code/local/Dotdigitalgroup/Email/Model/Connector/Account.php ADDED
@@ -0,0 +1,218 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Connector_Account
4
+ {
5
+ private $_api_username;
6
+ private $_api_password;
7
+ private $_limit;
8
+ private $_contactBookId;
9
+ private $_subscriberBookId;
10
+ private $_websites = array();
11
+ private $_csv_headers;
12
+ private $_customers_filename;
13
+ private $_subscribers_filename;
14
+ private $_mapping_hash;
15
+ private $_contacts = array();
16
+ private $_orders = array();
17
+
18
+ /**
19
+ * @param mixed $api_password
20
+ */
21
+ public function setApiPassword($api_password)
22
+ {
23
+ $this->_api_password = $api_password;
24
+ }
25
+
26
+ /**
27
+ * @return mixed
28
+ */
29
+ public function getApiPassword()
30
+ {
31
+ return $this->_api_password;
32
+ }
33
+
34
+ /**
35
+ * @param mixed $api_username
36
+ */
37
+ public function setApiUsername($api_username)
38
+ {
39
+ $this->_api_username = $api_username;
40
+ }
41
+
42
+ /**
43
+ * @return mixed
44
+ */
45
+ public function getApiUsername()
46
+ {
47
+ return $this->_api_username;
48
+ }
49
+
50
+ /**
51
+ * @param string $contactBookId
52
+ */
53
+ public function setContactBookId($contactBookId)
54
+ {
55
+ $this->_contactBookId[$contactBookId] = $contactBookId;
56
+ }
57
+
58
+ /**
59
+ * @return array
60
+ */
61
+ public function getContactBookIds()
62
+ {
63
+ return $this->_contactBookId;
64
+ }
65
+
66
+ /**
67
+ * @param array $contacts
68
+ */
69
+ public function setContacts($contacts)
70
+ {
71
+ // if(!empty($this->_contacts)){
72
+ // $this->_contacts += $contacts;
73
+ // }else{
74
+
75
+ $this->_contacts[] = $contacts;
76
+ //}
77
+ }
78
+
79
+ /**
80
+ * @return array
81
+ */
82
+ public function getContacts()
83
+ {
84
+ return $this->_contacts;
85
+ }
86
+
87
+ /**
88
+ * @param mixed $customers_filename
89
+ */
90
+ public function setCustomersFilename($customers_filename)
91
+ {
92
+ $this->_customers_filename = $customers_filename;
93
+ }
94
+
95
+ /**
96
+ * @return mixed
97
+ */
98
+ public function getCustomersFilename()
99
+ {
100
+ return $this->_customers_filename;
101
+ }
102
+
103
+ /**
104
+ * @param mixed $limit
105
+ */
106
+ public function setLimit($limit)
107
+ {
108
+ $this->_limit = $limit;
109
+ }
110
+
111
+ /**
112
+ * @return mixed
113
+ */
114
+ public function getLimit()
115
+ {
116
+ return $this->_limit;
117
+ }
118
+
119
+ /**
120
+ * @param mixed $mapping_hash
121
+ */
122
+ public function setMappingHash($mapping_hash)
123
+ {
124
+ $this->_mapping_hash = $mapping_hash;
125
+ }
126
+
127
+ /**
128
+ * @return mixed
129
+ */
130
+ public function getMappingHash()
131
+ {
132
+ return $this->_mapping_hash;
133
+ }
134
+
135
+ /**
136
+ * @param array $orders
137
+ */
138
+ public function setOrders($orders)
139
+ {
140
+ foreach ($orders as $order) {
141
+
142
+ $this->_orders[$order->id] = $order;
143
+ }
144
+ }
145
+
146
+ /**
147
+ * @return array
148
+ */
149
+ public function getOrders()
150
+ {
151
+ return $this->_orders;
152
+ }
153
+
154
+ /**
155
+ * @param string $subscriberBookId
156
+ */
157
+ public function setSubscriberBookId($subscriberBookId)
158
+ {
159
+ $this->_subscriberBookId[$subscriberBookId] = $subscriberBookId;
160
+ }
161
+
162
+ /**
163
+ * @return array
164
+ */
165
+ public function getSubscriberBookIds()
166
+ {
167
+ return $this->_subscriberBookId;
168
+ }
169
+
170
+ /**
171
+ * @param mixed $subscribers_filename
172
+ */
173
+ public function setSubscribersFilename($subscribers_filename)
174
+ {
175
+ $this->_subscribers_filename = $subscribers_filename;
176
+ }
177
+
178
+ /**
179
+ * @return mixed
180
+ */
181
+ public function getSubscribersFilename()
182
+ {
183
+ return $this->_subscribers_filename;
184
+ }
185
+
186
+ /**
187
+ * @param mixed $csv_headers
188
+ */
189
+ public function setCsvHeaders($csv_headers)
190
+ {
191
+ $this->_csv_headers = $csv_headers;
192
+ }
193
+
194
+ /**
195
+ * @return mixed
196
+ */
197
+ public function getCsvHeaders()
198
+ {
199
+ return $this->_csv_headers;
200
+ }
201
+ /**
202
+ * @param mixed $websites
203
+ */
204
+ public function setWebsites($websites)
205
+ {
206
+ $this->_websites[] = $websites;
207
+ }
208
+
209
+ /**
210
+ * @return mixed
211
+ */
212
+ public function getWebsites()
213
+ {
214
+ return $this->_websites;
215
+ }
216
+
217
+
218
+ }
app/code/local/Dotdigitalgroup/Email/Model/Connector/Customer.php ADDED
@@ -0,0 +1,286 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Connector_Customer{
4
+
5
+ // Unique identifier for Dotmail: Email
6
+ private $_email;
7
+
8
+ // Customer Info Data
9
+ private $_firstname;
10
+ private $_lastname;
11
+ private $_dob;
12
+ private $_gender;
13
+ private $_title;
14
+ private $_website_created_on;
15
+ private $_store_created_on;
16
+ private $_account_created;
17
+ private $_last_logged_in;
18
+ private $_customer_group;
19
+ // Customer Address Data
20
+ private $_billing_address_1;
21
+ private $_billing_address_2;
22
+ private $_billing_city;
23
+ private $_billing_country;
24
+ private $_billing_postcode;
25
+ private $_billing_telephone;
26
+ private $_delivery_address_1;
27
+ private $_delivery_address_2;
28
+ private $_delivery_city;
29
+ private $_delivery_country;
30
+ private $_delivery_postcode;
31
+ private $_delivery_telephone;
32
+ // Customer Sales Data
33
+ private $_total_orders;
34
+ private $_average_order_value;
35
+ private $_total_spend;
36
+ private $_last_order;
37
+ private $_last_order_no;
38
+ // Newletter subscriber?
39
+ private $_is_subscribed_to_newsletter;
40
+ private $_dotmailer_contact_id;
41
+ private $_customer_id;
42
+
43
+ /**
44
+ 'firstname',
45
+ 'lastname',
46
+ 'dob',
47
+ 'gender',
48
+ 'title',
49
+ 'website_created_on',
50
+ 'store_created_on',
51
+ 'account_created',
52
+ 'last_logged_in',
53
+ 'customer_group',
54
+ 'billing_address_1',
55
+ 'billing_address_2',
56
+ 'billing_city',
57
+ 'billing_country',
58
+ 'billing_postcode',
59
+ 'billing_telephone',
60
+ 'delivery_address_1',
61
+ 'delivery_address_2',
62
+ 'delivery_city',
63
+ 'delivery_country',
64
+ 'delivery_postcode',
65
+ 'delivery_telephone',
66
+ 'total_orders',
67
+ 'average_order_value',
68
+ 'total_spend',
69
+ 'last_order',
70
+ 'last_order_no'
71
+ *
72
+ */
73
+
74
+ public function getEmail()
75
+ {
76
+ return $this->_email;
77
+ }
78
+
79
+
80
+ public function setDotmailerContactId($dotmailer_contact_id)
81
+ {
82
+ $this->_dotmailer_contact_id = $dotmailer_contact_id;
83
+ }
84
+
85
+ public function getDotmailerContactId()
86
+ {
87
+ return $this->_dotmailer_contact_id;
88
+ }
89
+
90
+ public function isSubscribed()
91
+ {
92
+ return $this->_is_subscribed_to_newsletter;
93
+ }
94
+
95
+ private $_mapping_hash;
96
+
97
+
98
+ // class constructor - takes
99
+ public function __construct(Mage_Customer_Model_Customer $customer, $mapping_hash){
100
+
101
+ $this->_mapping_hash = $mapping_hash;
102
+
103
+ // map each attribute from the $customer parameter (collection item) to the corresponding scoped variable in this class
104
+ $this->id = $customer->getId();
105
+ $this->_email = $customer->getEmail();
106
+ $this->_firstname = $customer->getFirstname();
107
+ $this->_lastname = $customer->getLastname();
108
+ $this->_dob = $customer->getDob();
109
+ $this->_gender = $this->getCustomerGender($customer->getGender());
110
+ $this->_title = $customer->getPrefix();
111
+
112
+ $this->_website_created_on = $this->getWebsiteName($customer->getWebsiteId());
113
+ $this->_store_created_on = $this->getStoreName($customer->getStoreId());
114
+ $this->_account_created = $customer->getCreatedAt();
115
+ $this->_last_logged_in = $customer->getLastLoggedIn();
116
+ $this->_customer_group = $this->getCustomerGroup($customer->getGroupId());
117
+ $this->_billing_address_1 = $this->getStreet($customer->getBillingStreet(), 1);
118
+ $this->_billing_address_2 = $this->getStreet($customer->getBillingStreet(), 2);
119
+
120
+ $this->_billing_city = $customer->getBillingCity();
121
+ $this->_billing_country = $customer->getBillingCountryCode();
122
+ $this->_billing_postcode = $customer->getBillingPostcode();
123
+ $this->_billing_telephone = $customer->getBillingTelephone();
124
+
125
+ $this->_delivery_address_1 = $this->getStreet($customer->getShippingStreet(), 1);
126
+ $this->_delivery_address_2 = $this->getStreet($customer->getShippingStreet(), 2);
127
+
128
+ $this->_delivery_city = $customer->getShippingCity();
129
+ $this->_delivery_country = $customer->getShippingCountryCode();
130
+ $this->_delivery_postcode = $customer->getShippingPostcode();
131
+ $this->_delivery_telephone = $customer->getShippingTelephone();
132
+
133
+ $this->_total_orders = $customer->getTotalOrders();
134
+ $this->_average_order_value = $customer->getAverageOrderValue();
135
+ $this->_total_spend = $customer->getTotalSpend();
136
+
137
+ $lastOrder = new Zend_Date($customer->getLastPurchase());
138
+ //$this->_last_order = $lastOrder->toString(Zend_Date::ISO_8601);
139
+ $this->_last_order = $customer->getLastPurchase();
140
+ $this->_last_order_no = $customer->getLastOrderNo();
141
+
142
+ $this->_is_subscribed_to_newsletter = ($customer->getSubscriberStatus() == Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED)? true : false;
143
+ $this->_dotmailer_contact_id = $customer->getDotmailerContactId();
144
+ $this->_customer_id = $customer->getId();
145
+ }
146
+
147
+ public function toCSVArray() {
148
+
149
+ // no iterating, just create an array()
150
+
151
+ $result = array();
152
+
153
+ // Email is the only required field in the CSV upload
154
+ $result[] = $this->_email;
155
+
156
+ if ($this->_mapping_hash[0]!="0") $result[] = $this->_firstname;
157
+ if ($this->_mapping_hash[1]!="0") $result[] = $this->_lastname;
158
+ if ($this->_mapping_hash[2]!="0") $result[] = $this->_dob;
159
+ if ($this->_mapping_hash[3]!="0") $result[] = $this->_gender;
160
+ if ($this->_mapping_hash[4]!="0") $result[] = $this->_title;
161
+
162
+ if ($this->_mapping_hash[5]!="0") $result[] = $this->_website_created_on;
163
+ if ($this->_mapping_hash[6]!="0") $result[] = $this->_store_created_on;
164
+ if ($this->_mapping_hash[7]!="0") $result[] = $this->_account_created;
165
+ if ($this->_mapping_hash[8]!="0") $result[] = $this->_last_logged_in;
166
+ if ($this->_mapping_hash[9]!="0") $result[] = $this->_customer_group;
167
+
168
+ if ($this->_mapping_hash[10]!="0") $result[] = $this->_billing_address_1;
169
+ if ($this->_mapping_hash[11]!="0") $result[] = $this->_billing_address_2;
170
+ if ($this->_mapping_hash[12]!="0") $result[] = $this->_billing_city;
171
+ if ($this->_mapping_hash[13]!="0") $result[] = $this->_billing_country;
172
+ if ($this->_mapping_hash[14]!="0") $result[] = $this->_billing_postcode;
173
+ if ($this->_mapping_hash[15]!="0") $result[] = $this->_billing_telephone;
174
+
175
+ if ($this->_mapping_hash[16]!="0") $result[] = $this->_delivery_address_1;
176
+ if ($this->_mapping_hash[17]!="0") $result[] = $this->_delivery_address_2;
177
+ if ($this->_mapping_hash[18]!="0") $result[] = $this->_delivery_city;
178
+ if ($this->_mapping_hash[19]!="0") $result[] = $this->_delivery_country;
179
+ if ($this->_mapping_hash[20]!="0") $result[] = $this->_delivery_postcode;
180
+ if ($this->_mapping_hash[21]!="0") $result[] = $this->_delivery_telephone;
181
+
182
+ if ($this->_mapping_hash[22]!="0") $result[] = $this->_total_orders;
183
+ if ($this->_mapping_hash[23]!="0") $result[] = $this->_average_order_value;
184
+ if ($this->_mapping_hash[24]!="0") $result[] = $this->_total_spend;
185
+ if ($this->_mapping_hash[25]!="0") $result[] = $this->_last_order;
186
+ if ($this->_mapping_hash[26]!="0") $result[] = $this->_last_order_no;
187
+ if ($this->_mapping_hash[27]!="0") $result[] = $this->_customer_id;
188
+
189
+ $result[] = 'Html';
190
+
191
+ return $result;
192
+
193
+ }
194
+
195
+ // returns the object as JSON
196
+ public function toJSON(){
197
+
198
+ return json_encode($this->expose());
199
+
200
+ }
201
+
202
+ // exposes the class as an array of objects
203
+ public function expose() {
204
+
205
+ return get_object_vars($this);
206
+
207
+ }
208
+
209
+ /**
210
+ * return the gender text label
211
+ * @param $genderId customer option id
212
+ * @return string
213
+ */
214
+ public function getCustomerGender($genderId)
215
+ {
216
+ if(is_numeric($genderId)){
217
+ $gender = Mage::getResourceModel('customer/customer')
218
+ ->getAttribute('gender')
219
+ ->getSource()
220
+ ->getOptionText($genderId)
221
+ ;
222
+ return $gender;
223
+ }
224
+
225
+ return '';
226
+ }
227
+
228
+ /**
229
+ * get the street name by line number
230
+ * @param $street
231
+ * @param $line
232
+ * @return string
233
+ */
234
+ public function getStreet($street, $line)
235
+ {
236
+ $street = explode("\n", $street);
237
+ if($line == 1){
238
+ return $street[0];
239
+ }
240
+ if(isset($street[$line -1])){
241
+
242
+ return $street[$line - 1];
243
+ }else{
244
+
245
+ return '';
246
+ }
247
+ }
248
+
249
+ /**
250
+ * get website name
251
+ * @param $websiteId
252
+ * @return null|string
253
+ */
254
+ public function getWebsiteName($websiteId)
255
+ {
256
+ $website = Mage::app()->getWebsite($websiteId);
257
+ if($website)
258
+ return $website->getName();
259
+
260
+ return '';
261
+ }
262
+
263
+ public function getStoreName($storeId)
264
+ {
265
+ $store = Mage::app()->getStore($storeId);
266
+ if($store)
267
+ return $store->getName();
268
+
269
+ return '';
270
+ }
271
+
272
+ /**
273
+ * get the group name
274
+ * @param $groupId
275
+ * @return string
276
+ */
277
+ public function getCustomerGroup($groupId)
278
+ {
279
+ $group = Mage::getModel('customer/group')->load($groupId);
280
+ if($group){
281
+ return $group->getCode();
282
+ }
283
+ return '';
284
+ }
285
+
286
+ }
app/code/local/Dotdigitalgroup/Email/Model/Connector/Order.php ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Connector_Order
4
+ {
5
+ public $id;
6
+ public $connector_id;
7
+ public $customer_id;
8
+ protected $store_name;
9
+ protected $purchase_date;
10
+ protected $delivery_address;
11
+ protected $billing_address;
12
+ protected $products = array();
13
+ protected $order_subtotal;
14
+ protected $discount_ammount;
15
+ protected $order_total;
16
+ public $quote_id;
17
+
18
+ /**
19
+ * set the order information
20
+ * @param Mage_Sales_Model_Order $orderData
21
+ */
22
+ public function __construct(Mage_Sales_Model_Order $orderData)
23
+ {
24
+ $this->id = $orderData->getIncrementId();
25
+ $this->store_name = $orderData->getStoreName();
26
+
27
+ $created_at = new Zend_Date($orderData->getCreatedAt(), Zend_Date::ISO_8601);
28
+ $this->purchase_date = $created_at->toString(Zend_Date::ISO_8601);
29
+ $this->customer_id = $orderData->getCustomerId();
30
+
31
+ $customerModel = Mage::getModel('customer/customer')->load($this->customer_id);
32
+ if(!$customerModel->getDotmailerContactId()){
33
+ Mage::helper('connector')->log('dotmailer id not found : ' . $customerModel->getDotmailerContactId() . ' ' . $this->customer_id . ' ' . $this->id);
34
+ }
35
+
36
+
37
+
38
+ $this->connector_id = $customerModel->getDotmailerContactId();
39
+ $this->quote_id = $orderData->getQuoteId();
40
+
41
+ /**
42
+ * billing and shipping address
43
+ */
44
+ $deliveryData = $orderData->getShippingAddress()->getData();
45
+ $this->delivery_address = array(
46
+ 'delivery_address_1' => $this->getStreet($deliveryData['street'], 1),
47
+ 'delivery_address_2' => $this->getStreet($deliveryData['street'], 2),
48
+ 'delivery_city' => $deliveryData['city'],
49
+ 'delivery_country' => $deliveryData['country_id'],
50
+ 'delivery_postcode' => $deliveryData['postcode']
51
+ );
52
+ $billingData = $orderData->getBillingAddress()->getData();
53
+ $this->billing_address = array(
54
+ 'billing_address_1' => $this->getStreet($billingData['street'], 1),
55
+ 'billing_address_2' => $this->getStreet($billingData['street'], 2),
56
+ 'billing_city' => $billingData['city'],
57
+ 'billing_country' => $billingData['country_id'],
58
+ 'billing_postcode' => $billingData['postcode'],
59
+ );
60
+ //order products information
61
+ $products = $orderData->getAllItems();
62
+ $categories = array();
63
+ foreach ($products as $productItem) {
64
+ // product model
65
+ $product = $productItem->getProduct();
66
+ if($product){
67
+ // category names
68
+ $categoryCollection = $product->getCategoryCollection()
69
+ ->addAttributeToSelect('name');
70
+
71
+ foreach ($categoryCollection as $cat) {
72
+ $categories[] = $cat->getName();
73
+ }
74
+ $categoryNames = implode(',', $categories);
75
+ }
76
+
77
+ $this->products[] = array(
78
+ 'name' => $productItem->getName(),
79
+ 'sku' => $productItem->getSku(),
80
+ 'category' => $categoryNames,
81
+ 'qty' => (int)number_format($productItem->getData('qty_ordered'), 2),
82
+ 'price' => (float)number_format($productItem->getPrice(), 2),
83
+ );
84
+ }
85
+ $this->order_subtotal = (float)number_format($orderData->getData('subtotal'), 2);
86
+ $this->discount_ammount = (float)number_format($orderData->getData('discount_amount'), 2);
87
+ $orderTotal = abs($orderData->getData('grand_total') - $orderData->getTotalRefunded());
88
+ $this->order_total = (float)number_format($orderTotal, 2);
89
+
90
+ }
91
+ /**
92
+ * get the street name by line number
93
+ * @param $street
94
+ * @param $line
95
+ * @return string
96
+ */
97
+ private function getStreet($street, $line)
98
+ {
99
+ $street = explode("\n", $street);
100
+ if($line == 1){
101
+ return $street[0];
102
+ }
103
+ if(isset($street[$line -1])){
104
+
105
+ return $street[$line - 1];
106
+ }else{
107
+
108
+ return '';
109
+ }
110
+ }
111
+ // exposes the class as an array of objects
112
+ public function expose() {
113
+
114
+ return get_object_vars($this);
115
+
116
+ }
117
+
118
+ }
app/code/local/Dotdigitalgroup/Email/Model/Connector/Quote.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Connector_Quote
4
+ {
5
+
6
+ public $id;
7
+ public $connector_id;
8
+ public $customer_id;
9
+ protected $store_name;
10
+ protected $create_date;
11
+ protected $update_date;
12
+ protected $delivery_address;
13
+ protected $billing_address;
14
+ protected $products = array();
15
+ protected $order_subtotal;
16
+ protected $order_total;
17
+
18
+ /**
19
+ * set the quote information
20
+ * @param Mage_Sales_Model_Quote $quote
21
+ */
22
+ public function __construct(Mage_Sales_Model_Quote $quote)
23
+ {
24
+ $this->id = $quote->getId();
25
+ $this->customer_id = $quote->getCustomerId();
26
+ $customerModel = Mage::getModel('customer/customer')->load($this->customer_id);
27
+ $this->connector_id = $customerModel->getData('dotmailer_contact_id');
28
+
29
+ $this->store_name = $this->getStoreName($quote->getStoreId());
30
+ $this->order_subtotal = (float)number_format($quote->getSubtotal(), 2);
31
+ $this->order_total = (float)number_format($quote->getGrandTotal(), 2);
32
+
33
+ $created_at = new Zend_Date($quote->getCreatedAt(), Zend_Date::ISO_8601);
34
+ $updated_at = new Zend_Date($quote->getUpdatedAt(), Zend_Date::ISO_8601);
35
+ $this->create_date = $created_at->toString(Zend_Date::ISO_8601);
36
+ $this->update_date = $updated_at->toString(Zend_Date::ISO_8601);
37
+
38
+ $items = $quote->getAllVisibleItems();
39
+ foreach ($items as $product) {
40
+ $this->products[] = array(
41
+ 'name' => $product->getName(),
42
+ 'sku' => $product->getSku(),
43
+ 'category' => $this->getCategory($product),
44
+ 'qty' => (float)number_format($product->getQty(), 2),
45
+ 'price' => (float)number_format($product->getPrice(), 2)
46
+ );
47
+ }
48
+ }
49
+ private function getStoreName($storeId)
50
+ {
51
+ $storeModel = Mage::getModel('core/store')->load($storeId);
52
+ return $storeModel->getName();
53
+ }
54
+ private function getCategory($product)
55
+ {
56
+ $product = Mage::getModel('catalog/product')->load($product->getProductId());
57
+ $categories = $product->getCategoryCollection()
58
+ ->addAttributeToSelect('name');
59
+ $categoryNames = array();
60
+ foreach ($categories as $cat) {
61
+ $categoryNames[] = $cat->getName();
62
+ }
63
+
64
+ $categoryNames = implode(',', $categoryNames);
65
+ return $categoryNames;
66
+
67
+ }
68
+ // exposes the class as an array of objects
69
+ public function expose() {
70
+
71
+ return get_object_vars($this);
72
+
73
+ }
74
+
75
+ }
app/code/local/Dotdigitalgroup/Email/Model/Connector/Wishlist.php ADDED
@@ -0,0 +1,86 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Connector_Wishlist
4
+ {
5
+ protected $id;
6
+ protected $customer_id;
7
+ protected $connector_id;
8
+
9
+ public $name;
10
+
11
+ public $items = array();
12
+
13
+ protected $total_wishlist_value;
14
+
15
+ public function __construct($customer){
16
+
17
+ $this->setConnectorId($customer->getDotmailerContactId());
18
+ $this->setCustomerId($customer->id);
19
+ }
20
+
21
+ /**
22
+ * @param mixed $connector_id
23
+ */
24
+ public function setConnectorId($connector_id)
25
+ {
26
+ $this->connector_id = $connector_id;
27
+ }
28
+
29
+ /**
30
+ * @return mixed
31
+ */
32
+ public function getConnectorId()
33
+ {
34
+ return $this->connector_id;
35
+ }
36
+
37
+
38
+ /**
39
+ * @param mixed $customer_id
40
+ */
41
+ public function setCustomerId($customer_id)
42
+ {
43
+ $this->customer_id = $customer_id;
44
+ }
45
+
46
+
47
+ /**
48
+ * @return mixed
49
+ */
50
+ public function getCustomerId()
51
+ {
52
+ return $this->customer_id;
53
+ }
54
+
55
+ /**
56
+ * @param mixed $id
57
+ */
58
+ public function setId($id)
59
+ {
60
+ $this->id = $id;
61
+ }
62
+
63
+ /**
64
+ * @return mixed
65
+ */
66
+ public function getId()
67
+ {
68
+ return $this->id;
69
+ }
70
+
71
+ public function setItem($item)
72
+ {
73
+ $this->items[] = $item->expose();
74
+
75
+ $this->total_wishlist_value += $item->getTotalValueOfProduct();
76
+ }
77
+
78
+ public function expose() {
79
+
80
+ return get_object_vars($this);
81
+
82
+ }
83
+
84
+
85
+
86
+ }
app/code/local/Dotdigitalgroup/Email/Model/Cron.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Dotdigitalgroup_Email_Model_Cron
3
+ {
4
+ /**
5
+ * CRON FOR CUSTOMER SYNC
6
+ */
7
+ public function customersync()
8
+ {
9
+ if(Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CUSTOMER_SYNC_ENABLE))
10
+ Mage::getModel('connector/customer_customer')->sync();
11
+ return;
12
+ }
13
+
14
+ /**
15
+ * CRON FOR LOST BASKET
16
+ */
17
+ public function lostbasketssync()
18
+ {
19
+ //look for lost baskets
20
+ Mage::getModel('connector/sales_quote')->proccessCampaigns();
21
+ $helper = Mage::helper('connector');
22
+ if($helper->isOrderTransactionalEnabled()){
23
+ //send transactional data and mark as imported
24
+ Mage::getModel('connector/sales_order')->sync();
25
+ }
26
+ if($helper->isCustomerSyncEnabled()){
27
+ //check for customer that have no connector id
28
+ $numUpdated = Mage::getModel('connector/customer_customer')->syncContacts();
29
+ Mage::helper('connector')->log('SYNC CONTACTS : '. $numUpdated);
30
+ }
31
+ }
32
+
33
+ /**
34
+ * CRON FOR SUPRESSED CONTACTS
35
+ */
36
+ public function suppressedsync()
37
+ {
38
+ if(Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CUSTOMER_SUPPRESSED_ENABLE)){
39
+ //check suppressed contacts from connector
40
+ Mage::getModel('connector/customer_suppressed')->unsubscribe();
41
+ }
42
+
43
+ }
44
+
45
+ /**
46
+ * CLEAN ARHIVED FOLDERS
47
+ */
48
+
49
+ public function cleaning()
50
+ {
51
+ $helper = Mage::helper('connector/file');
52
+ $archivedFolder = $helper->getArchiveFolder();
53
+ $result = $helper->deleteDir($archivedFolder);
54
+ Mage::helper('connector')->log('Cleaning cronjob result : ' . $result, null, 'api.log');
55
+ return $result;
56
+ }
57
+
58
+ }
app/code/local/Dotdigitalgroup/Email/Model/Customer/Customer.php ADDED
@@ -0,0 +1,480 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Customer_Customer extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+ // xml configuration
6
+ const XML_PATH_CONNECTOR_API_USERNAME = 'connector_api_settings/api_credentials/username';
7
+ const XML_PATH_CONNECTOR_API_PASSWORD = 'connector_api_settings/api_credentials/password';
8
+ const XML_PATH_CUSTOMER_SYNC_ENABLE = 'connector_sync_settings/sync_customer_schedule/enabled';
9
+ const XML_PATH_CUSTOMER_SYNC_LIMIT = 'connector_advanced_settings/sync_limits/contact';
10
+ const XML_PATH_CUSTOMER_SUPPRESSED_ENABLE = 'connector_sync_settings/sync_suppressed_schedule/enabled';
11
+ const XML_PATH_CUSTOMERS_ADDRESS_BOOK_ID = 'connector_data_field_settings/address_book/customers';
12
+ const XML_PATH_CUSTOMERS_SUPPRESSED_INTERVAL = 'connector_sync_settings/sync_suppressed_schedule/frequency';
13
+ const XML_PATH_GUEST_ADDRESS_BOOK_ID = 'connector_data_field_settings/address_book/guest';
14
+ const XML_PATH_CUSTOMER_WISHLIST_ENABLED = 'connector_sync_settings/transactional_data/wishlist_enabled';
15
+
16
+ const FORCE_CUSTOMERS_YEARS = '10';
17
+
18
+ protected $_customers_address_book_id;
19
+ protected $_customers = array();
20
+ protected $_mapping_hash;
21
+ protected $_website; // website model
22
+ private $countSubscribers = 0;
23
+ private $countCustomers = 0;
24
+
25
+ protected $accounts = array();// api accounts
26
+ protected $wishlists = array();// wishlists
27
+ protected $_proccessing;
28
+ protected $_websiteId;
29
+ public $apiLimit = 450;
30
+
31
+ public function sync()
32
+ {
33
+ /** @var Dotdigitalgroup_Email_Helper_Data $helper */
34
+ $helper = Mage::helper('connector');
35
+ $helper->log('Start customer sync..', null, $this->_log_filename);
36
+ $result = array('error' => false, 'message' => "Done.");
37
+
38
+ // check for default settings to use memory limit
39
+ if(Mage::getStoreConfig('connector_advanced_settings/admin/memory_limit'))
40
+ $this->allowResourceFullExecution();
41
+
42
+ // get all websites
43
+ foreach(Mage::app()->getWebsites() as $website){
44
+
45
+ // skip any actions if sync disabled
46
+ if(! $website->getConfig(self::XML_PATH_CUSTOMER_SYNC_ENABLE))
47
+ continue;
48
+ //API credentials
49
+ $this->_api_user = $website->getConfig(self::XML_PATH_CONNECTOR_API_USERNAME);
50
+ $this->_api_password = $website->getConfig(self::XML_PATH_CONNECTOR_API_PASSWORD);
51
+
52
+ if(strlen($this->_api_user) > 10 && strlen($this->_api_password)){
53
+
54
+ $result = $this->exportCustomersForWebsite($website);
55
+ if($website->getConfig(self::XML_PATH_CUSTOMER_WISHLIST_ENABLED)){
56
+ $this->exportWishlistsForWebsite($website);
57
+ }
58
+ }else{
59
+ $result['error'] = true;
60
+ $message = 'The Credentials For Website :' . $website->getCode() . ' is not set!';
61
+ $result['message'] = $message;
62
+ $helper->log($message, null, $this->_log_filename);
63
+ }
64
+ }
65
+ //set result check
66
+ if($this->countCustomers != 0){
67
+
68
+ $message = 'Total Exported : ' . $this->countCustomers . ' Customers, ' . $this->countSubscribers . ' Subscribers.';
69
+
70
+ $result['message'] = $message;
71
+ $helper->log($message, null, $this->_log_filename);
72
+ }else{
73
+ $result['error'] = true;
74
+ $message = 'Check the logs for more information, the number of updated customers is : 0.';
75
+ $result['message'] = $message;
76
+ }
77
+
78
+ $helper->log('Customer sync end!', null, $this->_log_filename);
79
+ return $result;
80
+ }
81
+
82
+ /**
83
+ * Get the customer for the website
84
+ * @param bool $websiteId
85
+ * @return mixed
86
+ */
87
+ public function getContactsCustomers($websiteId = false)
88
+ {
89
+ /** @var Mage_Customer_Model_Customer $customerCollection */
90
+ $customerCollection = Mage::getModel('customer/customer')->getCollection()
91
+ ->addAttributeToSelect('dotmailer_contact_id')
92
+ ->addAttributeToFilter('dotmailer_contact_id', array('notnull' => true), 'left')
93
+ ;
94
+ if($websiteId !== false)
95
+ $customerCollection->addAttributeToFilter('website_id', $websiteId);
96
+
97
+ return $customerCollection;
98
+ }
99
+
100
+ private function countNumOfContacts($contacts)
101
+ {
102
+ $total = 0;
103
+ // Get contacts number with contact id
104
+ foreach ($contacts as $contact) {
105
+ if($contact->getDotmailerContactId())
106
+ $total++;
107
+ }
108
+ unset($contacts);
109
+ return $total;
110
+ }
111
+
112
+ public function syncContacts()
113
+ {
114
+ $updated = 0;
115
+ /**
116
+ * Customers at website level
117
+ */
118
+ foreach (Mage::app()->getWebsites(true) as $website) {
119
+ $websiteId = $website->getId();
120
+ $missingContacts = $this->getMissingContacts($websiteId, $this->apiLimit);
121
+ Mage::helper('connector')->log('API LIMIT : ' . $this->apiLimit, null, 'api.log');
122
+ Mage::helper('connector')->log($missingContacts->count(), null, 'api.log');
123
+ if(count($missingContacts) == 0)
124
+ continue;
125
+ //save customer and trigger the obsever
126
+ foreach($missingContacts as $customer){
127
+ try{
128
+ $customer->save();
129
+ $updated++;
130
+ //limit the number of updated contacts
131
+ if($this->apiLimit == $updated){
132
+ return $updated;
133
+ }
134
+ }catch (Exception $e){
135
+ Mage::logException($e);
136
+ }
137
+ }
138
+ }
139
+ return $updated;
140
+ }
141
+ public function getMissingContacts($websiteId = null, $limit = 200)
142
+ {
143
+ $customerCollection = Mage::getModel('customer/customer')->getCollection()
144
+ ->addAttributeToSelect('dotmailer_contact_id')
145
+ ->addAttributeToFilter('dotmailer_contact_id', array('null' => true), 'left')
146
+ ->setPageSize($limit)
147
+ ;
148
+ if($websiteId !== null)
149
+ $customerCollection->addAttributeToFilter('website_id', $websiteId);
150
+
151
+ return $customerCollection;
152
+ }
153
+ public function getTotalNumberCustomers()
154
+ {
155
+ $customers = Mage::getModel('customer/customer')->getCollection();
156
+ $totalCustomers = $customers->getSize();
157
+
158
+ return $totalCustomers;
159
+ }
160
+
161
+ public function countSkipContacts($contacts = false, $websiteId)
162
+ {
163
+ if($contacts)
164
+ $numContactIds = $this->countNumOfContacts($contacts);
165
+ else
166
+ $numContactIds = count($this->getContactsCustomers($websiteId));
167
+
168
+
169
+ return $numContactIds;
170
+ }
171
+
172
+ /**
173
+ * @param Mage_Core_Model_Website $website
174
+ * @return $this
175
+ */
176
+ public function exportCustomersForWebsite(Mage_Core_Model_Website $website)
177
+ {
178
+ $websiteCode = $website->getCode();
179
+ $websiteId = $website->getId();
180
+ $customer_filename = $websiteCode . '_' . $this->_customers_file_slug . '_' . date('d-M-Y_hms') . '.csv';
181
+ $subscriber_filename = $websiteCode . '_' . $this->_subscribers_file_slug . '_' . date('d-M-Y_hms') . '.csv';
182
+ $helper = Mage::helper('connector');
183
+
184
+ $helper->log('customer filename : ' . $customer_filename . ', subscriber filename : ' . $subscriber_filename, null, $this->_log_filename);
185
+
186
+ $pageNum = 1;
187
+ $pageSize = $website->getConfig('connector_advanced_settings/admin/batch_size');
188
+ if($pageSize == '') $pageSize = 5000;
189
+ $this->fileHelper = Mage::helper('connector/file');
190
+
191
+ do{
192
+ $time_start = microtime(true);
193
+
194
+ $currentBatch = $this->getCustomersToExport($pageSize, $pageNum, $this->getMappingHash($website), $website->getId());
195
+ $condition = count($currentBatch);
196
+ //write the csv headers
197
+ if($pageNum == 1 && count($currentBatch)){
198
+ $this->fileHelper->outputCSV($this->fileHelper->getFilePath($customer_filename), $this->getCsvHeaderArray($website));
199
+ $this->fileHelper->outputCSV($this->fileHelper->getFilePath($subscriber_filename), array('Email', 'emailType'));
200
+ }
201
+ foreach ($currentBatch as $customer) {
202
+
203
+ /**
204
+ * Send wishlist as transactional data
205
+ */
206
+ if($website->getConfig(self::XML_PATH_CUSTOMER_WISHLIST_ENABLED)){
207
+ $this->setWishlists($customer, $website);
208
+ }
209
+ // check if customer is subscribed
210
+ if($customer->isSubscribed()){
211
+ // save data for subscribers
212
+ $this->fileHelper->outputCSV($this->fileHelper->getFilePath($subscriber_filename), array($customer->getEmail(), 'Html'));
213
+ $this->countSubscribers++;
214
+ }
215
+
216
+ // save data for csutomers
217
+ $this->fileHelper->outputCSV($this->fileHelper->getFilePath($customer_filename), $customer->toCSVArray());
218
+ $this->countCustomers++;
219
+ }
220
+ $time_end = microtime(true);
221
+ $time_in_seconds = $time_end - $time_start;
222
+
223
+ $helper->log('-----------------------------------------------execution time :' . gmdate("H:i:s", $time_in_seconds), null, $this->_log_filename);
224
+ $pageNum++;
225
+ unset($currentBatch);
226
+
227
+ }while( $condition == $pageSize );
228
+
229
+ $storeIds = Mage::getModel('core/website')->load($websiteId)
230
+ ->getStoreIds();
231
+ $subscriberModel = new Dotdigitalgroup_Email_Model_Newsletter_Subscriber();
232
+ $subscribersNotCustomers = $subscriberModel->getSubscribersNotCustomers($storeIds);
233
+
234
+ foreach ($subscribersNotCustomers as $one) {
235
+ $this->fileHelper->outputCSV($this->fileHelper->getFilePath($subscriber_filename), array($one->getSubscriberEmail()));
236
+ $this->countSubscribers++;
237
+ }
238
+
239
+ /**
240
+ * Save customers and subscribers to address books
241
+ */
242
+ $this->postAddressBookContactsImport($customer_filename, $website->getConfig(self::XML_PATH_CUSTOMERS_ADDRESS_BOOK_ID));
243
+ $this->postAddressBookContactsImport($subscriber_filename, $website->getConfig(Dotdigitalgroup_Email_Model_Newsletter_Subscriber::XML_PATH_SUBSCRIBERS_ADDRESS_BOOK_ID));
244
+
245
+ //If successful, archive the CSV file and Log something in the Magento Log - success/failure
246
+ if(file_exists($this->fileHelper->getFilePath($customer_filename)) && file_exists($this->fileHelper->getFilePath($subscriber_filename))){
247
+ $this->fileHelper->archiveCSV($customer_filename);
248
+ $this->fileHelper->archiveCSV($subscriber_filename);
249
+ }
250
+ return $this;
251
+
252
+ }
253
+
254
+ private function exportWishlistsForWebsite(Mage_Core_Model_Website $website){
255
+
256
+ $this->_api_user = $website->getConfig(self::XML_PATH_CONNECTOR_API_USERNAME);
257
+ $this->_api_password = $website->getConfig(self::XML_PATH_CONNECTOR_API_PASSWORD);
258
+ //wishlists for the website key
259
+ if(isset($this->wishlists[$website->getId()])){
260
+
261
+ //send wishlists as transactional data
262
+ $wishlists = $this->wishlists[$website->getId()];
263
+
264
+ $this->postContactsTransactionalDataImport($collectionName = 'Wishlist', $wishlists);
265
+ }
266
+ }
267
+
268
+ public function getCustomersToExport($pageSize = 0, $pageNum = 1, $mappingHash, $websiteId)
269
+ {
270
+ // the filtering and aggregation of all the customer data here
271
+ $customers = array();
272
+ $helper = Mage::helper('connector');
273
+
274
+ $customerCollection = Mage::getModel('customer/customer')->getCollection()
275
+ ->addAttributeToSelect('email')
276
+ ->addAttributeToSelect('firstname')
277
+ ->addAttributeToSelect('lastname')
278
+ ->addAttributeToSelect('dob')
279
+ ->addAttributeToSelect('gender')
280
+ ->addAttributeToSelect('prefix')
281
+ ->addAttributeToSelect('website_id')
282
+ ->addAttributeToSelect('store_id')
283
+ ->addAttributeToSelect('created_at')
284
+ ->addAttributeToSelect('last_logged_in')
285
+ ->addAttributeToSelect('group_id')
286
+ ->addAttributeToSelect('dob')
287
+ ->addAttributeToSelect('dotmailer_contact_id')
288
+
289
+ ->addAttributeToFilter('website_id', $websiteId)
290
+
291
+ ->joinAttribute('billing_street', 'customer_address/street', 'default_billing', null, 'left')
292
+ ->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
293
+ ->joinAttribute('billing_country_code', 'customer_address/country_id', 'default_billing', null, 'left')
294
+ ->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
295
+ ->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
296
+ ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
297
+ ->joinAttribute('shipping_street', 'customer_address/street', 'default_shipping', null, 'left')
298
+ ->joinAttribute('shipping_city', 'customer_address/city', 'default_shipping', null, 'left')
299
+ ->joinAttribute('shipping_country_code', 'customer_address/country_id', 'default_shipping', null, 'left')
300
+ ->joinAttribute('shipping_postcode', 'customer_address/postcode', 'default_shipping', null, 'left')
301
+ ->joinAttribute('shipping_telephone', 'customer_address/telephone', 'default_shipping', null, 'left')
302
+ ->joinAttribute('shipping_region', 'customer_address/region', 'default_shipping', null, 'left')
303
+ ->joinTable('newsletter/subscriber','subscriber_email=email',array('subscriber_status' => 'subscriber_status'), null, 'left')
304
+
305
+ ;
306
+ if( $pageSize ){
307
+ $customerCollection->setPage($pageNum, $pageSize);
308
+ }
309
+
310
+ $customer_log = Mage::getSingleton('core/resource')->getTableName('log_customer');
311
+ $sales_flat_order_grid = Mage::getSingleton('core/resource')->getTableName('sales_flat_order_grid');
312
+ $sales_flat_order = Mage::getSingleton('core/resource')->getTableName('sales_flat_order');
313
+
314
+ // get the last login from the log_customer table
315
+ $customerCollection->getSelect()->columns(array('last_logged_in' => new Zend_Db_Expr ("(SELECT login_at
316
+ FROM $customer_log
317
+ WHERE customer_id =e.entity_id
318
+ ORDER BY log_id DESC
319
+ LIMIT 1)")));
320
+
321
+ // customer order information
322
+ $alias = 'subselect';
323
+ $subselect = Mage::getModel('Varien_Db_Select',
324
+ Mage::getSingleton('core/resource')->getConnection('core_read')
325
+ )->from($sales_flat_order_grid, array(
326
+ 'customer_id as s_customer_id',
327
+ 'sum(grand_total) as total_spend',
328
+ 'count(*) as total_orders',
329
+ 'avg(grand_total) as average_order_value',
330
+ )
331
+ )->group('customer_id')
332
+ ;
333
+ $customerCollection->getSelect()->columns(array(
334
+ 'last_purchase' => new Zend_Db_Expr("(SELECT created_at
335
+ FROM $sales_flat_order
336
+ WHERE customer_id =e.entity_id
337
+ ORDER BY created_at DESC
338
+ LIMIT 1)"),
339
+ 'last_order_no' => new Zend_Db_Expr("(SELECT entity_id
340
+ FROM $sales_flat_order
341
+ WHERE customer_id =e.entity_id
342
+ ORDER BY created_at DESC
343
+ LIMIT 1)")
344
+ ));
345
+
346
+ $customerCollection->getSelect()
347
+ ->joinLeft(array($alias => $subselect),
348
+ "{$alias}.s_customer_id = e.entity_id");
349
+
350
+
351
+
352
+ $time = microtime(true);
353
+ // create a customer object for each item in our collection
354
+ foreach ($customerCollection as $item) {
355
+
356
+ $customers[] = new Dotdigitalgroup_Email_Model_Connector_Customer($item, $mappingHash);
357
+ }
358
+
359
+ unset($customerCollection);
360
+ $end_time = microtime(true);
361
+ $end = $end_time - $time;
362
+
363
+
364
+ $helper->log($pageSize . ': page' . $pageNum . ' for website: ' . $websiteId, null, $this->_log_filename);
365
+ $helper->log('created dotmailer customers from collection: ' . gmdate("H:i:s", $end), null, $this->_log_filename);
366
+
367
+ return $customers;
368
+ }
369
+
370
+ protected function allowResourceFullExecution() {
371
+
372
+ /* it may be needed to set maximum execution time of the script to longer,
373
+ * like 60 minutes than usual */
374
+ set_time_limit ( 7200 );
375
+
376
+ /* and memory to 512 megabytes */
377
+ ini_set ( 'memory_limit', '512M' );
378
+
379
+ return $this;
380
+ }
381
+ function convert($size)
382
+ {
383
+ $unit=array('b','kb','mb','gb','tb','pb');
384
+ return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
385
+ }
386
+
387
+ /**
388
+ * Create an array of columns we have chosen to map in our System->Config
389
+ * @param Mage_Core_Model_Website $website
390
+ * @return array
391
+ */
392
+ public function getCsvHeaderArray(Mage_Core_Model_Website $website) {
393
+
394
+ $result = array();
395
+
396
+ $result[] = 'Email';
397
+
398
+ foreach ($this->getMappingHash($website) as $header) {
399
+ if ($header != "0") $result[] = $header;
400
+ }
401
+ $result[] = 'emailType';
402
+
403
+ return $result;
404
+ }
405
+
406
+ /**
407
+ * Gets the datafield mapping hash from the system config
408
+ * @param Mage_Core_Model_Website $website
409
+ * @return array
410
+ */
411
+ protected function getMappingHash(Mage_Core_Model_Website $website){
412
+
413
+
414
+ $customer_fields = array(
415
+ 'customer_data/firstname',
416
+ 'customer_data/lastname',
417
+ 'customer_data/dob',
418
+ 'customer_data/gender',
419
+ 'customer_data/title',
420
+ 'customer_data/website_created_on',
421
+ 'customer_data/store_created_on',
422
+ 'customer_data/account_created',
423
+ 'customer_data/last_logged_in',
424
+ 'customer_data/customer_group',
425
+ 'customer_data/billing_address_1',
426
+ 'customer_data/billing_address_2',
427
+ 'customer_data/billing_city',
428
+ 'customer_data/billing_country',
429
+ 'customer_data/billing_postcode',
430
+ 'customer_data/billing_telephone',
431
+ 'customer_data/delivery_address_1',
432
+ 'customer_data/delivery_address_2',
433
+ 'customer_data/delivery_city',
434
+ 'customer_data/delivery_country',
435
+ 'customer_data/delivery_postcode',
436
+ 'customer_data/delivery_telephone',
437
+ 'customer_data/total_orders',
438
+ 'customer_data/average_order_value',
439
+ 'customer_data/total_spend',
440
+ 'customer_data/last_order',
441
+ 'customer_data/last_order_no',
442
+ 'customer_data/customer_id'
443
+ );
444
+
445
+ $result = array();
446
+
447
+ foreach ($customer_fields as $field) {
448
+
449
+ $result[] = $website->getConfig('connector_data_field_settings/' . $field);
450
+
451
+ }
452
+ return $result;
453
+ }
454
+
455
+ public function setWishlists($customer, $website)
456
+ {
457
+ $customerId = $customer->id;
458
+ $wishList = Mage::getModel('wishlist/wishlist')->loadByCustomer($customerId);
459
+
460
+ /** @var $connectorWishlist */
461
+ $connectorWishlist = new Dotdigitalgroup_Email_Model_Connector_Wishlist($customer);
462
+ $connectorWishlist->setId($wishList->getId());
463
+
464
+ $wishListItemCollection = $wishList->getItemCollection();
465
+
466
+ if (count($wishListItemCollection)) {
467
+ foreach ($wishListItemCollection as $item) {
468
+ /* @var $product Mage_Catalog_Model_Product */
469
+ $product = $item->getProduct();
470
+ $connectorItem = new Dotdigitalgroup_Email_Model_Customer_Wishlist_Item($product);
471
+ $connectorItem->setQty($item->getQty());
472
+ $connectorItem->setPrice($product);
473
+ $connectorWishlist->setItem($connectorItem);//store for wishlists
474
+ }
475
+ //set wishlists for later use
476
+ $this->wishlists[$website->getId()][] = $connectorWishlist;
477
+ }
478
+ }
479
+
480
+ }
app/code/local/Dotdigitalgroup/Email/Model/Customer/Suppressed.php ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Customer_Suppressed extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+
6
+ private $suppressedContacts = array();
7
+
8
+ public function unsubscribe($force = false)
9
+ {
10
+ // result of sync
11
+ $result = array('errors' => false, 'message' => '', 'customers');
12
+ $result['customers'] = 0;
13
+ $date = new Zend_Date();
14
+
15
+ /**
16
+ * 1. calculate from frequency
17
+ */
18
+ if(! $force){
19
+ $frequency = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CUSTOMERS_SUPPRESSED_INTERVAL);
20
+ // get the frequency of sinse date
21
+ switch($frequency){
22
+ case('H'):
23
+ $date = $date->subHour(1);
24
+ break;
25
+ case('D'):
26
+ $date = $date->subDay(1);
27
+ break;
28
+ case('W'):
29
+ $date = $date->subWeek(1);
30
+ break;
31
+ case('M'):
32
+ $date = $date->subMonth(1);
33
+ break;
34
+ }
35
+ }else{
36
+
37
+ // force sync all customers
38
+ $date = $date->subYear(Dotdigitalgroup_Email_Model_Customer_Customer::FORCE_CUSTOMERS_YEARS);
39
+ }
40
+
41
+ // datetime format string
42
+ $dateString = $date->toString(Zend_Date::W3C);
43
+ /**
44
+ * Sync all suppressed for each store
45
+ */
46
+ foreach (Mage::app()->getWebsites(true) as $website) {
47
+ $this->_api_user = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
48
+ $this->_api_password = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD);
49
+ $contacts = $this->getSuppressedSince($dateString);
50
+ if(! empty($contacts)){
51
+ foreach ($contacts as $suppressed){
52
+ $contactEmail = false;
53
+ if(isset($suppressed->suppressedContact)){
54
+
55
+ $contactEmail = $suppressed->suppressedContact->email;
56
+ $contactId = $suppressed->suppressedContact->id;
57
+ }
58
+
59
+ if($contactEmail){
60
+ try{
61
+ /**
62
+ * 3. Unsubscribe customer
63
+ */
64
+ $newsletterModel = Mage::getModel('newsletter/subscriber')->loadByEmail($contactEmail);
65
+ if($newsletterModel->getStatus() == Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED){
66
+ $unsubscribe = $newsletterModel->setStatus(Mage_Newsletter_Model_Subscriber::STATUS_UNSUBSCRIBED);
67
+ $unsubscribe->save();
68
+ // remove from subscriber address-book
69
+ $this->deleteAddressBookContact($website->getConfig(Dotdigitalgroup_Email_Model_Newsletter_Subscriber::XML_PATH_SUBSCRIBERS_ADDRESS_BOOK_ID), $contactId);
70
+ $this->suppressedContacts[$newsletterModel->getSubscriberEmail()] = $newsletterModel->getSubscriberEmail();
71
+ }
72
+ }catch (Exception $e){
73
+ $result['errors'] = true;
74
+ $result['message'] = 'Error Saving Customer!';
75
+ }
76
+ }
77
+ }
78
+ }
79
+ }
80
+ $result['customers'] = count($this->suppressedContacts);
81
+
82
+ return $result;
83
+ }
84
+
85
+ }
app/code/local/Dotdigitalgroup/Email/Model/Customer/Wishlist/Item.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Customer_Wishlist_Item
4
+ {
5
+ protected $name;
6
+ protected $sku;
7
+ protected $price;
8
+ protected $qty;
9
+ protected $total_value_of_product;
10
+
11
+ public function __construct($product)
12
+ {
13
+ $this->setSku($product->getSku());
14
+ $this->setName($product->getName());
15
+ }
16
+
17
+ /**
18
+ * @param mixed $name
19
+ */
20
+ public function setName($name)
21
+ {
22
+ $this->name = $name;
23
+ }
24
+
25
+ /**
26
+ * @return mixed
27
+ */
28
+ public function getName()
29
+ {
30
+ return $this->name;
31
+ }
32
+
33
+ /**
34
+ * @param mixed $qty
35
+ */
36
+ public function setQty($qty)
37
+ {
38
+ $this->qty = (int)$qty;
39
+ }
40
+
41
+ /**
42
+ * @return mixed
43
+ */
44
+ public function getQty()
45
+ {
46
+ return $this->qty;
47
+ }
48
+
49
+ /**
50
+ * @return mixed
51
+ */
52
+ public function getTotalValueOfProduct()
53
+ {
54
+ return $this->total_value_of_product;
55
+ }
56
+
57
+ /**
58
+ * @param mixed $price
59
+ */
60
+ public function setPrice($product)
61
+ {
62
+ $this->price = $product->getFinalPrice();
63
+ $total = $this->price * $this->qty;
64
+
65
+ $this->total_value_of_product = number_format($total, 2);
66
+ }
67
+
68
+ /**
69
+ * @return mixed
70
+ */
71
+ public function getPrice()
72
+ {
73
+ return $this->price;
74
+ }
75
+
76
+ /**
77
+ * @param mixed $sku
78
+ */
79
+ public function setSku($sku)
80
+ {
81
+ $this->sku = $sku;
82
+ }
83
+
84
+ /**
85
+ * @return mixed
86
+ */
87
+ public function getSku()
88
+ {
89
+ return $this->sku;
90
+ }
91
+ public function expose() {
92
+
93
+ return get_object_vars($this);
94
+
95
+ }
96
+
97
+
98
+
99
+
100
+ }
app/code/local/Dotdigitalgroup/Email/Model/Dynamic/Product/Mapper.php ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Dynamic_Product_Mapper extends Mage_Core_Model_Abstract
4
+ {
5
+ protected $_max_per_child;
6
+
7
+ protected $_num_order_items;
8
+
9
+ protected $_helper;
10
+
11
+ public $_products = array();
12
+
13
+ public $filename = 'mapper.log';
14
+
15
+ public function __construct($num_order_items)
16
+ {
17
+ $this->_helper = Mage::helper('connector');
18
+ $items_to_display = Mage::helper('connector/recommended')->getLimit();
19
+ if($num_order_items < $items_to_display)
20
+ $this->_max_per_child = number_format($items_to_display / $num_order_items);
21
+ $this->_helper->log('max items per child : ' . $this->_max_per_child . ', items to display : ' . $items_to_display . ', number of order items : ' . $num_order_items, null, $this->filename);
22
+
23
+ }
24
+
25
+ /**
26
+ * Set the products with parent limit
27
+ * @param $products
28
+ */
29
+ public function setProducts($products)
30
+ {
31
+ $count = 0;
32
+ foreach ($products as $product) {
33
+ if($count < $this->_max_per_child)
34
+ $this->setProduct($product);
35
+ $count++;
36
+ }
37
+
38
+ }
39
+ public function setProduct(Mage_Catalog_Model_Product $product)
40
+ {
41
+ $productId = $product->getEntityId();
42
+
43
+ if(!isset($this->_products[$productId])){
44
+ $this->_products[$productId] = $product;
45
+ return true;
46
+ }
47
+ return false;
48
+ }
49
+
50
+ public function countProducts()
51
+ {
52
+ return count($this->_products);
53
+ }
54
+
55
+ public function getProducts()
56
+ {
57
+ return $this->_products;
58
+ }
59
+
60
+ public function getFallbackProducts($limit)
61
+ {
62
+ $count = 0;
63
+ $fallbackIds = Mage::helper('connector/recommended')->getFallbackIds();
64
+ $this->_helper->log('fallback products from helper : '. count($fallbackIds), null, $this->filename);
65
+
66
+ if(!empty($fallbackIds)){
67
+ foreach ($fallbackIds as $id) {
68
+ /** @var Mage_Catalog_Model_Product $product */
69
+ $product = Mage::getModel('catalog/product')->load($id);
70
+
71
+ if($product->getEntityId()){
72
+
73
+ $result = $this->setProduct($product);
74
+ if($result)
75
+ $count++;
76
+
77
+ }
78
+
79
+ $this->_helper->log('result for products ' . $this->countProducts() . ', count : ' . $count . ', limit : ' . $limit, null, $this->filename);
80
+
81
+ if($count == $limit){
82
+
83
+ break;
84
+ }
85
+ }
86
+ }
87
+
88
+ return;
89
+ }
90
+ }
app/code/local/Dotdigitalgroup/Email/Model/Dynamic/Recommended.php ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Dynamic_Recommended extends Dotdigitalgroup_Email_Model_Dynamic_Product_Mapper
4
+ {
5
+ protected $_result_limit;
6
+
7
+ protected $_storeId;//order store id
8
+
9
+ protected $_order_items = 0;//order product items
10
+
11
+ protected $_num_order_items;//number of items from order
12
+
13
+ protected $_productMapper;
14
+
15
+ protected $_is_log_enabled;
16
+
17
+ protected $_helper;
18
+
19
+ /**
20
+ * @param $orderModel
21
+ */
22
+ public function __construct(Mage_Sales_Model_Order $orderModel = null)
23
+ {
24
+ if($orderModel){
25
+ $this->_storeId = $orderModel->getStoreId();
26
+ $this->_order_items = $orderModel->getAllItems();
27
+ }
28
+ $this->_num_order_items = count($this->_order_items);
29
+ $this->_productMapper = new Dotdigitalgroup_Email_Model_Dynamic_Product_Mapper($this->_num_order_items);
30
+ $this->_helper = Mage::helper('connector/recommended');
31
+ $this->_result_limit = $this->_helper->getLimit();
32
+ }
33
+
34
+ /**
35
+ * Get the recommended products
36
+ * @return array
37
+ */
38
+ public function getProducts()
39
+ {
40
+ $mode = Mage::registry('mode');
41
+ if($mode == 'related' || $mode == 'upsell' || $mode == 'crosssell'){
42
+
43
+ //set the order items
44
+ $this->setOrderItems();
45
+ }else{
46
+ //set products directly without looking for order items
47
+ $this->setRecommendedProduct();
48
+ }
49
+
50
+ return $this->_productMapper->getProducts();
51
+ }
52
+
53
+ public function setOrderItems()
54
+ {
55
+ foreach ($this->_order_items as $item) {
56
+ $productId = $item->getProductId();
57
+ /** @var Mage_Catalog_Model_Product $product */
58
+ $product = Mage::getModel('catalog/product')->load($productId);//make sure the product is loaded
59
+
60
+ $this->setRecommendedProduct($product);
61
+ }
62
+
63
+ if($this->_productMapper->countProducts() < $this->_result_limit){
64
+ $limit = $this->_result_limit - $this->_productMapper->countProducts();
65
+ $this->_productMapper->getFallbackProducts($limit);
66
+ }
67
+
68
+ return $this->_productMapper->getProducts();
69
+ }
70
+
71
+ public function setRecommendedProduct(Mage_Catalog_Model_Product $productModel = null)
72
+ {
73
+ //array of products to display
74
+ $products = array();
75
+
76
+ $mode = Mage::registry('mode');
77
+ switch($mode){
78
+ case 'related':
79
+ $products = $productModel->getRelatedProducts();
80
+ break;
81
+ case 'upsell':
82
+ $products = $productModel->getUpSellProducts();
83
+ break;
84
+ case 'crosssell':
85
+ $products = $productModel->getCrossSellProducts();
86
+ break;
87
+ case 'bestsellers':
88
+ $products = $this->getBestSellersProducts();
89
+ break;
90
+ case 'mostviewed':
91
+ $products = $this->getMostViewedProducts();
92
+ break;
93
+ case 'recentlyviewed':
94
+ $products = $this->getRecentlyViewedProducts();
95
+ break;
96
+ case 'productpush':
97
+ $products = $this->getPushProducts();
98
+ break;
99
+ }
100
+ if($mode == 'related' || $mode == 'upsell' || $mode == 'crosssell'){
101
+
102
+ $this->_productMapper->setProducts($products, $this->_result_limit);
103
+ }
104
+
105
+
106
+ Mage::helper('connector')->log('number of all recommended products : ' . $this->_productMapper->countProducts() . ', max : ' . $this->_result_limit, null, $this->filename);
107
+
108
+ }
109
+ public function getNumberOfOrderItems()
110
+ {
111
+ return $this->_order_items;
112
+ }
113
+
114
+ /**
115
+ * Best Selling products
116
+ * @return array
117
+ */
118
+ public function getBestSellersProducts()
119
+ {
120
+ $limit = $this->_helper->getLimit();
121
+ $from = $this->_helper->getTimeFromConfig($config = 'bestsellers');
122
+ $to = new Zend_Date();
123
+ $to = $to->toString(Zend_Date::ISO_8601);
124
+
125
+ $productCollection = Mage::getResourceModel('reports/product_collection')
126
+ ->addOrderedQty($from, $to)
127
+ ->addAttributeToSelect('*')
128
+ ->addAttributeToSelect(array('name', 'price', 'small_image')) //edit to suit tastes
129
+ ->setOrder('ordered_qty', 'desc') //best sellers on top
130
+ ->setPageSize($limit);
131
+
132
+ $productCollection->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
133
+ $productCollection->addAttributeToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
134
+
135
+ foreach ($productCollection as $_product) {
136
+ $this->_productMapper->setProduct($_product);
137
+ }
138
+
139
+ return array();
140
+ }
141
+
142
+ /**
143
+ * Most viwed products
144
+ * @return array
145
+ */
146
+ public function getMostViewedProducts()
147
+ {
148
+ $limit = $this->_helper->getLimit();
149
+ $from = $this->_helper->getTimeFromConfig($config = 'mostviewed');
150
+
151
+ $to = new Zend_Date();
152
+ $to = $to->toString(Zend_Date::ISO_8601);
153
+ $productCollection = Mage::getResourceModel('reports/product_collection')
154
+ ->addViewsCount()
155
+ ->addViewsCount($from, $to)
156
+ ->setPageSize($limit);
157
+
158
+ $productCollection->addAttributeToFilter('status', Mage_Catalog_Model_Product_Status::STATUS_ENABLED);
159
+ $productCollection->addAttributeToFilter('visibility', Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH);
160
+
161
+ foreach ($productCollection as $_product) {
162
+ $this->_productMapper->setProduct($_product);
163
+ }
164
+
165
+
166
+ return $this->_productMapper->getProducts();
167
+ }
168
+
169
+ /**
170
+ * Recently viewed products
171
+ * @return $this
172
+ */
173
+ public function getRecentlyViewedProducts()
174
+ {
175
+ $customerId = Mage::registry('customer');
176
+ $helper = Mage::helper('connector');
177
+ $helper->log('recentlyviewed customer : ' . $customerId, null, $this->filename);
178
+ if($customerId){
179
+
180
+ $limit = $this->_helper->getLimit();
181
+
182
+ //login customer to receive the recent products
183
+ $session = Mage::getSingleton('customer/session');
184
+ $session->loginById($customerId);
185
+
186
+ /** @var Mage_Reports_Block_Product_Viewed $collection */
187
+ $collection = Mage::getSingleton('Mage_Reports_Block_Product_Viewed');
188
+ $items = $collection->getItemsCollection()
189
+ ->setPageSize($limit)
190
+ ;
191
+
192
+
193
+ foreach ($items as $product) {
194
+ $this->_productMapper->setProduct($product);
195
+ }
196
+
197
+
198
+ return $this->_productMapper->getProducts();
199
+ }else{
200
+
201
+ $helper->log('Get recently viewd products, customer id not found : ' . $customerId, null, $this->filename);
202
+ }
203
+
204
+ return null;
205
+ }
206
+
207
+ public function getPushProducts()
208
+ {
209
+ $productIds = $this->_helper->getProductPushIds();
210
+
211
+ Mage::helper('connector')->log('proudcts push ids : ' . implode(',', $productIds), null, $this->filename);
212
+
213
+
214
+ $productCollection = Mage::getModel('catalog/product')->getCollection()
215
+ ->addAttributeToFilter('entity_id', array('in' => $productIds))
216
+ ->setPageSize(Mage::helper('connector/recommended')->getLimit())
217
+ ;
218
+
219
+ foreach ($productCollection as $_product) {
220
+ $this->_productMapper->setProduct($_product);
221
+
222
+ }
223
+
224
+ return $this->_productMapper->getProducts();
225
+ }
226
+
227
+
228
+ }
app/code/local/Dotdigitalgroup/Email/Model/Newsletter/Subscriber.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Newsletter_Subscriber extends Mage_Core_Helper_Abstract
4
+ {
5
+ const XML_PATH_SUBSCRIBERS_ADDRESS_BOOK_ID = 'connector_data_field_settings/address_book/subscribers';
6
+
7
+ // select subscribers that are not registred as customers
8
+ public function getSubscribersNotCustomers($storeIds = array())
9
+ {
10
+ $newsletterCollection = Mage::getModel('newsletter/subscriber')->getCollection()
11
+ ->addFieldToFilter('main_table.customer_id', array('eq' => 0))
12
+ ->addFieldToFilter('subscriber_status', array('eq' => Mage_Newsletter_Model_Subscriber::STATUS_SUBSCRIBED))
13
+ ->addStoreFilter($storeIds)
14
+ ;
15
+
16
+ return $newsletterCollection;
17
+ }
18
+
19
+ }
app/code/local/Dotdigitalgroup/Email/Model/Observer.php ADDED
@@ -0,0 +1,189 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Observer extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+ /**
6
+ * Create new contact or update info also check for email change
7
+ * event: customer_save_before
8
+ * @param Varien_Event_Observer $observer
9
+ * @return $this
10
+ */
11
+ public function handleCustomerSaveBefore(Varien_Event_Observer $observer)
12
+ {
13
+ // skip update customer for first time sync
14
+ if(! Mage::registry('first_time_sync')){
15
+
16
+ /* @var $customer Mage_Customer_Model_Customer */
17
+ $customer = $observer->getEvent()->getCustomer();
18
+ $email = $customer->getEmail();
19
+ $websiteId = $customer->getWebsiteId();
20
+ $subscribed = $customer->getIsSubscribed();
21
+
22
+ $this->_api_user = Mage::app()->getWebsite($websiteId)->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
23
+ $this->_api_password = Mage::app()->getWebsite($websiteId)->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD);
24
+ $subscribersAddressBook = Mage::app()->getWebsite($websiteId)->getConfig(Dotdigitalgroup_Email_Model_Newsletter_Subscriber::XML_PATH_SUBSCRIBERS_ADDRESS_BOOK_ID);
25
+
26
+ if($customer->getData('dotmailer_contact_id')){
27
+ $dotmailerId = $customer->getData('dotmailer_contact_id');
28
+ //get contact infrmation by id
29
+ $response = $this->getContactById($dotmailerId);
30
+
31
+ //check for matching email
32
+ if(isset($response->email)){
33
+ if($email != $response->email){
34
+ $data = array(
35
+ 'Email' => $email,
36
+ 'EmailType' => 'Html'
37
+ );
38
+ //update the contact with same id - different email
39
+ $this->updateContact($dotmailerId, $data);
40
+ }
41
+
42
+ if(!$subscribed && $response->status == 'Subscribed'){
43
+ $this->deleteAddressBookContact($subscribersAddressBook, $response->id);
44
+ }
45
+ }
46
+ }else{
47
+ //get contact info by email
48
+ $response = $this->getContactByEmail($email);
49
+ //create new contact and add to address books
50
+ if(isset($response->message) && $response->message == Dotdigitalgroup_Email_Model_Api_Rest::REST_CONTACT_NOT_FOUND){
51
+ $contactApi = $this->createNewContact($email);
52
+ $this->postAddressBookContacts(Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CUSTOMERS_ADDRESS_BOOK_ID), $contactApi);
53
+
54
+ if($subscribed){
55
+ $this->postAddressBookContacts($subscribersAddressBook, $contactApi);
56
+ }
57
+ }
58
+ }
59
+
60
+ if(isset($response->id))
61
+ $customer->setData('dotmailer_contact_id', $response->id);//set the id from contact info
62
+ }
63
+ return $this;
64
+ }
65
+ /**
66
+ * event: sales_order_save_after
67
+ * @param Varien_Event_Observer $observer
68
+ * @return $this
69
+ */
70
+ public function handleSalesOrderSaveAfter(Varien_Event_Observer $observer)
71
+ {
72
+ $order = $observer->getEvent()->getOrder();
73
+ $storeId = $order->getStoreId();
74
+ $customerId = $order->getCustomerId();
75
+
76
+ $customerModel = Mage::getModel('customer/customer')->load($customerId);
77
+
78
+
79
+ if(!$customerModel->getData('dotmailer_contact_id'))
80
+ $customerModel->save();
81
+
82
+ $this->_api_user = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME, $storeId);
83
+ $this->_api_password = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD, $storeId);
84
+ $is_enabled = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Order::XML_PATH_TRANSACTIONAL_DATA_ENABLED, $storeId);
85
+
86
+ // store scope enabled
87
+ if($is_enabled){
88
+ $dotmailer = new Dotdigitalgroup_Email_Model_Connector_Order($order);
89
+ $this->sendOrderTransactionalData($dotmailer, 'Order');
90
+ }
91
+
92
+
93
+ return $this;
94
+ }
95
+
96
+ /**
97
+ * event: quote_save_after
98
+ * @param Varien_Event_Observer $observer
99
+ * @return $this
100
+ */
101
+ public function handleSalesQuoteSaveAfter(Varien_Event_Observer $observer)
102
+ {
103
+ $quote = $observer->getQuote();
104
+ $customerIsNotGuest = $quote->getCustomerId();
105
+ $storeId = $quote->getStoreId();
106
+
107
+ $this->_api_user = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME, $storeId);
108
+ $this->_api_password = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD, $storeId);
109
+ $is_enabled = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Order::XML_PATH_TRANSACTIONAL_DATA_ENABLED, $storeId);
110
+
111
+ // save quotes that are active
112
+ if($customerIsNotGuest && $is_enabled && $quote->getIsActive()){
113
+ $dotmailer = new Dotdigitalgroup_Email_Model_Connector_Quote($quote);
114
+ $this->sendTransactionalData($dotmailer, 'Basket');
115
+ }
116
+
117
+ return $this;
118
+ }
119
+
120
+ public function handleSalesOrderStatusChange(Varien_Event_Observer $observer)
121
+ {
122
+ $order = $observer->getEvent()->getOrder();
123
+ $status = $order->getStatus();
124
+
125
+ /**
126
+ * SMS functinality
127
+ */
128
+ $smsStatusOne = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Sms::XML_PATH_SMS_MESSAGE_ONE_STATUS);
129
+ $smsStatusTwo = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Sms::XML_PATH_SMS_MESSAGE_TWO_STATUS);
130
+ $smsStatusThree = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Sms::XML_PATH_SMS_MESSAGE_THREE_STATUS);
131
+ $smsStatusFour = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Sms::XML_PATH_SMS_MESSAGE_FOUR_STATUS);
132
+ $smsModel = new Dotdigitalgroup_Email_Model_Sales_Sms();
133
+
134
+ switch($status){
135
+ case $smsStatusOne:
136
+ $smsModel->sendMessage($order, 'ONE');
137
+ break;
138
+ case $smsStatusTwo:
139
+ $smsModel->sendMessage($order, 'TWO');
140
+ break;
141
+ case $smsStatusThree:
142
+ $smsModel->sendMessage($order, 'THREE');
143
+ break;
144
+ case $smsStatusFour:
145
+ $smsModel->sendMessage($order, 'FOUR');
146
+ break;
147
+ }
148
+
149
+ return $this;
150
+ }
151
+
152
+ public function handleSalesOrderRefund(Varien_Event_Observer $observer)
153
+ {
154
+ $creditmemo = $observer->getEvent()->getCreditmemo();
155
+ $storeId = $creditmemo->getStoreId();
156
+
157
+ $this->_api_user = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME, $storeId);
158
+ $this->_api_password = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD, $storeId);
159
+ $is_enabled = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Order::XML_PATH_TRANSACTIONAL_DATA_ENABLED, $storeId);
160
+ $order = $creditmemo->getOrder();
161
+
162
+ // store scope enabled
163
+ if($is_enabled){
164
+ $connectorOrder = new Dotdigitalgroup_Email_Model_Connector_Order($order);
165
+ $result = $this->sendOrderTransactionalData($connectorOrder, 'Order', $order->getIncrementId());
166
+ $this->_helper->log($result, null, $this->_log_filename);
167
+
168
+ }
169
+
170
+ return $this;
171
+ }
172
+ public function hangleSalesOrderCancel(Varien_Event_Observer $observer)
173
+ {
174
+ $order = $observer->getEvent()->getOrder();
175
+ $storeId = $order->getStoreId();
176
+ $key = $order->getIncrementId();
177
+
178
+ $this->_api_user = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME, $storeId);
179
+ $this->_api_password = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD, $storeId);
180
+ $is_enabled = Mage::getStoreConfig(Dotdigitalgroup_Email_Model_Sales_Order::XML_PATH_TRANSACTIONAL_DATA_ENABLED, $storeId);
181
+
182
+ if($is_enabled)
183
+ $this->deleteContactsTransactionalData('Order', $key);
184
+
185
+
186
+
187
+ return $this;
188
+ }
189
+ }
app/code/local/Dotdigitalgroup/Email/Model/Order.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Order extends Mage_Sales_Model_Order
4
+ {
5
+ protected function _setState($state, $status = false, $comment = '', $isCustomerNotified = null, $shouldProtectState = false)
6
+ {
7
+ // dispatch an event before we attempt to do anything
8
+ Mage::dispatchEvent('sales_order_status_before', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState));
9
+
10
+ // attempt to set the specified state
11
+ if ($shouldProtectState) {
12
+ if ($this->isStateProtected($state)) {
13
+ Mage::throwException(Mage::helper('sales')->__('The Order State "%s" must not be set manually.', $state));
14
+ }
15
+ }
16
+ $this->setData('state', $state);
17
+
18
+ // add status history
19
+ if ($status) {
20
+ if ($status === true) {
21
+ $status = $this->getConfig()->getStateDefaultStatus($state);
22
+ }
23
+ $this->setStatus($status);
24
+ $history = $this->addStatusHistoryComment($comment, false); // no sense to set $status again
25
+ $history->setIsCustomerNotified($isCustomerNotified); // for backwards compatibility
26
+ }
27
+
28
+ // dispatch an event after status has changed
29
+ Mage::dispatchEvent('sales_order_status_after', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState));
30
+
31
+ return $this;
32
+ }
33
+ }
app/code/local/Dotdigitalgroup/Email/Model/Sales/Order.php ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Sales_Order extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+ const XML_PATH_TRANSACTIONAL_DATA_ENABLED = 'connector_sync_settings/transactional_data/order_enabled';
6
+ const XML_PATH_TRANSACTIONAL_DATA_SYNC_LIMIT = 'connector_advanced_settings/sync_limits/orders';
7
+
8
+ protected $accounts = array();
9
+
10
+ /**
11
+ * initial sync the transactional data
12
+ * @return array
13
+ */
14
+ public function sync()
15
+ {
16
+ // Initialise a return hash containing results of our sync attempt
17
+ $this->_searchAccounts();
18
+
19
+ foreach ($this->accounts as $account){
20
+ if(count($account->getOrders())){
21
+ $this->sendMultiTransactionalData($account->getOrders(), 'Order');
22
+
23
+ }
24
+
25
+ unset($this->accounts[$account->getApiUsername()]);
26
+ }
27
+ return $this;
28
+ }
29
+
30
+ /**
31
+ *Search the configuration data per website
32
+ */
33
+ private function _searchAccounts()
34
+ {
35
+ foreach (Mage::app()->getWebsites() as $website){
36
+ $enabled = $website->getConfig(self::XML_PATH_TRANSACTIONAL_DATA_ENABLED);
37
+
38
+ if(!$enabled)
39
+ continue;
40
+
41
+ $this->_api_user = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
42
+ $limit = $website->getConfig(self::XML_PATH_TRANSACTIONAL_DATA_SYNC_LIMIT);
43
+
44
+ if(!isset($this->accounts[$this->_api_user])){
45
+ $account = new Dotdigitalgroup_Email_Model_Connector_Account();
46
+ $account->setApiUsername($this->_api_user);
47
+ $account->setApiPassword($this->_api_password);
48
+ $this->accounts[$this->_api_user] = $account;
49
+ }
50
+ $this->accounts[$this->_api_user]->setOrders($this->getConnectorOrders($limit));
51
+ }
52
+ }
53
+
54
+ /**
55
+ * get all connector orders data
56
+ * @param $limit
57
+ * @return array
58
+ */
59
+ public function getConnectorOrders($limit = 100)
60
+ {
61
+ $orders = $customers = array();
62
+ $orderCollection = Mage::getModel('sales/order')->getCollection()
63
+ ->addAttributeToFilter('dotmailer_order_imported', array('null' => true), 'left')
64
+ ->setPageSize($limit);
65
+
66
+ $this->_helper->log('GET CONNECTOR ORDERS ' . $orderCollection->count() . ' limit ' . $limit, null, $this->_log_filename);
67
+
68
+ //mark as imported for customers with contact id
69
+ foreach ($orderCollection as $order) {
70
+ try {
71
+ $customerEmail = $order->getCustomerEmail();
72
+ $storeId = $order->getStoreId();
73
+ $this->setStoreId(Mage::app()->getStore(true)->getId());
74
+ $websiteId = Mage::getModel('core/store')->load($storeId)->getWebsiteId();
75
+
76
+ $customerModel = Mage::getModel('customer/customer')->setWebsiteId($websiteId)
77
+ ->loadByEmail($customerEmail);
78
+
79
+ if($customerModel){
80
+ $contactId = $customerModel->getData('dotmailer_contact_id');
81
+ if($contactId){
82
+ $orders[] = new Dotdigitalgroup_Email_Model_Connector_Order($order);
83
+ $order->setData('dotmailer_order_imported', 1);
84
+ $order->save();
85
+ }
86
+ }
87
+ }catch(Exception $e){
88
+
89
+
90
+ $this->_helper->log($order->getIncrementId(), null, $this->_log_filename);
91
+ $this->_helper->log($e->getMessage(), null, $this->_log_filename);
92
+ }
93
+ }
94
+ return $orders;
95
+ }
96
+ }
app/code/local/Dotdigitalgroup/Email/Model/Sales/Quote.php ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Sales_Quote extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+ //xml path configuration
6
+ const XML_PATH_LOSTBASKET_1_ENABLED = 'lostbaskets/customers/enabled_1';
7
+ const XML_PATH_LOSTBASKET_2_ENABLED = 'lostbaskets/customers/enabled_2';
8
+ const XML_PATH_LOSTBASKET_3_ENABLED = 'lostbaskets/customers/enabled_3';
9
+
10
+ const XML_PATH_LOSTBASKET_1_INTERVAL = 'lost_basket_settings/customers/send_after_1';
11
+ const XML_PATH_LOSTBASKET_2_INTERVAL = 'lost_basket_settings/customers/send_after_2';
12
+ const XML_PATH_LOSTBASKET_3_INTERVAL = 'lost_basket_settings/customers/send_after_3';
13
+
14
+ const XML_PATH_TRIGGER_1_CAMPAIGN = 'lost_basket_settings/customers/campaign_1';
15
+ const XML_PATH_TRIGGER_2_CAMPAIGN = 'lost_basket_settings/customers/campaign_2';
16
+ const XML_PATH_TRIGGER_3_CAMPAIGN = 'lost_basket_settings/customers/campaign_3';
17
+
18
+ const XML_PATH_GUEST_LOSTBASKET_1_ENABLED = 'lostbaskets/guests/enabled_1';
19
+ const XML_PATH_GUEST_LOSTBASKET_2_ENABLED = 'lostbaskets/guests/enabled_2';
20
+ const XML_PATH_GUEST_LOSTBASKET_3_ENABLED = 'lostbaskets/guests/enabled_3';
21
+
22
+ const XML_PATH_GUEST_LOSTBASKET_1_INTERVAL = 'lost_basket_settings/guests/send_after_1';
23
+ const XML_PATH_GUEST_LOSTBASKET_2_INTERVAL = 'lost_basket_settings/guests/send_after_2';
24
+ const XML_PATH_GUEST_LOSTBASKET_3_INTERVAL = 'lost_basket_settings/guests/send_after_3';
25
+
26
+ const XML_PATH_GUEST_LOSTBASKET_1_CAMPAIGN = 'lost_basket_settings/guests/campaign_1';
27
+ const XML_PATH_GUEST_LOSTBASKET_2_CAMPAIGN = 'lost_basket_settings/guests/campaign_2';
28
+ const XML_PATH_GUEST_LOSTBASKET_3_CAMPAIGN = 'lost_basket_settings/guests/campaign_3';
29
+
30
+ const XML_PATH_TEST_LOSTBASKET_EMAIL = 'lost_basket_settings/test/email';
31
+
32
+
33
+ /**
34
+ * send the lost baskets to campains
35
+ * @return array
36
+ */
37
+ public function proccessCampaigns()
38
+ {
39
+ foreach (Mage::app()->getStores(true) as $store){
40
+
41
+ //skip any action if all lost basket campaings are disabled
42
+ if(!$store->getConfig(self::XML_PATH_LOSTBASKET_1_ENABLED) && !$store->getConfig(self::XML_PATH_LOSTBASKET_2_ENABLED) &&
43
+ !$store->getConfig(self::XML_PATH_LOSTBASKET_3_ENABLED) && !$store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_1_ENABLED) &&
44
+ !$store->getconfig(self::XML_PATH_GUEST_LOSTBASKET_2_ENABLED) && !$store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_3_ENABLED)
45
+ )continue;
46
+
47
+ // set credentials for every store
48
+ $storeId = $store->getId();
49
+ $this->_api_user = $store->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
50
+ $this->_api_password = $store->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD);
51
+
52
+ /**
53
+ * Customers campaings
54
+ */
55
+
56
+ //first campign
57
+ if($store->getConfig(self::XML_PATH_LOSTBASKET_1_ENABLED)){
58
+
59
+ $contacts = array();
60
+ $from = Zend_Date::now()->subMinute($store->getConfig(self::XML_PATH_LOSTBASKET_1_INTERVAL));
61
+ $to = clone($from);
62
+ $from->sub('5', Zend_Date::MINUTE);
63
+ // lost baskets
64
+ $quoteCollection = $this->_getStoreQuotes($storeId, $from->toString('YYYY-MM-dd HH:mm:ss'), $to->toString('YYYY-MM-dd HH:mm:ss'));
65
+ if(count($quoteCollection)){
66
+
67
+ // get collection contacts id
68
+ foreach ($quoteCollection as $quote) {
69
+ $customerId = $quote->getCustomerId();
70
+ $dotmailerContactId = $this->_getContactIdByCustomerId($customerId);
71
+
72
+ if($dotmailerContactId)
73
+ $contacts[] = $dotmailerContactId;
74
+ }
75
+ //check for empty contacts to avoid mass emails
76
+ if(!empty($contacts))
77
+ $this->sendCampaign($store->getConfig(self::XML_PATH_TRIGGER_1_CAMPAIGN), $contacts);
78
+ }
79
+ }
80
+
81
+ //second campaign
82
+ if($store->getConfig(self::XML_PATH_LOSTBASKET_2_ENABLED)){
83
+ $contacts = array();
84
+ $from = Zend_Date::now()->subHour($store->getConfig(self::XML_PATH_LOSTBASKET_2_INTERVAL));
85
+ $to = clone($from);
86
+ $from->sub('5', Zend_Date::MINUTE);
87
+ // lost baskets
88
+ $quoteCollection = $this->_getStoreQuotes($storeId, $from->toString('YYYY-MM-dd HH:mm:ss'), $to->toString('YYYY-MM-dd HH:mm:ss'));
89
+ if(count($quoteCollection)){
90
+ // get collection contacts id
91
+ foreach ($quoteCollection as $quote) {
92
+ $customerId = $quote->getCustomerId();
93
+ $dotmailerContactId = $this->_getContactIdByCustomerId($customerId);
94
+ if($dotmailerContactId)
95
+ $contacts[] = $dotmailerContactId;
96
+ }
97
+ if(!empty($contacts))
98
+ $this->sendCampaign($store->getConfig(self::XML_PATH_TRIGGER_2_CAMPAIGN), $contacts);
99
+ }
100
+ }
101
+
102
+ //third campign
103
+ if($store->getConfig(self::XML_PATH_LOSTBASKET_3_ENABLED)){
104
+ $contacts = array();
105
+ $from = Zend_Date::now()->subHour($store->getConfig(self::XML_PATH_LOSTBASKET_3_INTERVAL));
106
+ $to = clone($from);
107
+ $from->sub('5', Zend_Date::MINUTE);
108
+ // lost baskets
109
+ $quoteCollection = $this->_getStoreQuotes($storeId, $from->toString('YYYY-MM-dd HH:mm:ss'), $to->toString('YYYY-MM-dd HH:mm:ss'));
110
+ if(count($quoteCollection)){
111
+ // get collection contacts id
112
+ foreach ($quoteCollection as $quote) {
113
+ $customerId = $quote->getCustomerId();
114
+ $dotmailerContactId = $this->_getContactIdByCustomerId($customerId);
115
+ if($dotmailerContactId)
116
+ $contacts[] = $dotmailerContactId;
117
+ }
118
+ if(!empty($contacts))
119
+ $this->sendCampaign($store->getConfig(self::XML_PATH_TRIGGER_3_CAMPAIGN), $contacts);
120
+ }
121
+ }
122
+ /**
123
+ * Guests campaings
124
+ */
125
+ //first guest campaign
126
+ if($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_1_ENABLED))
127
+ {
128
+ $contacts = array();
129
+ $from = Zend_Date::now()->subMinute($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_1_INTERVAL));
130
+ $to = clone($from);
131
+ $from->sub('5', Zend_Date::MINUTE);
132
+ $quoteCollection = $this->_getStoreQuotes($storeId, $from->toString('YYYY-MM-dd HH:mm:ss'), $to->toString('YYYY-MM-dd HH:mm:ss'), true);
133
+ if(count($quoteCollection)){
134
+ // get collection contacts id
135
+ foreach ($quoteCollection as $quote) {
136
+ $email = $quote->getCustomerEmail();
137
+ //check if the customer exists
138
+ $response = $this->getContactByEmail($email);
139
+
140
+ if(isset($response->message) && $response->message == self::REST_CONTACT_NOT_FOUND){
141
+ //create new contact before sending campaign
142
+ $contactAPI = $this->createNewContact($email);
143
+ if(!isset($contactAPI->message))
144
+ $response = $this->postAddressBookContacts($store->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_GUEST_ADDRESS_BOOK_ID), $contactAPI);
145
+ }
146
+ $contacts[] = $response->id;
147
+ }
148
+ if(!empty($contacts))
149
+ $this->sendCampaign($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_1_CAMPAIGN), $contacts);
150
+ }
151
+ }
152
+ // second guest campaign
153
+ if($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_2_ENABLED))
154
+ {
155
+ $contacts = array();
156
+ $from = Zend_Date::now()->subHour($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_2_INTERVAL));
157
+ $to = clone($from);
158
+ $from->sub('5', Zend_Date::MINUTE);
159
+ // lost baskets
160
+ $quoteCollection = $this->_getStoreQuotes($storeId, $from->toString('YYYY-MM-dd HH:mm:ss'), $to->toString('YYYY-MM-dd HH:mm:ss'), true);
161
+ if(count($quoteCollection)){
162
+ // get collection contacts id
163
+ foreach ($quoteCollection as $quote) {
164
+ $email = $quote->getCustomerEmail();
165
+ //check if the customer exists
166
+ $response = $this->getContactByEmail($email);
167
+ if(isset($response->message) && $response->message == self::REST_CONTACT_NOT_FOUND){
168
+ //create new contact before sending campaign
169
+ $contactAPI = $this->createNewContact($email);
170
+ if(!isset($contactAPI->message))
171
+ $this->postAddressBookContacts($store->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_GUEST_ADDRESS_BOOK_ID), $contactAPI);
172
+ }
173
+ $contacts[] = $response->id;
174
+ }
175
+ if(!empty($contacts))
176
+ $this->sendCampaign($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_2_CAMPAIGN), $contacts);
177
+ }
178
+ }
179
+ //third guest campaign
180
+ if($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_3_ENABLED)){
181
+ $contacts = array();
182
+ $from = Zend_Date::now()->subHour($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_3_INTERVAL));
183
+ $to = clone($from);
184
+ $from->sub('5', Zend_Date::MINUTE);
185
+
186
+ // lost baskets
187
+ $quoteCollection = $this->_getStoreQuotes($storeId, $from->toString('YYYY-MM-dd HH:mm:ss'), $to->toString('YYYY-MM-dd HH:mm:ss'), true);
188
+ if(count($quoteCollection)){
189
+ // get collection contacts id
190
+ foreach ($quoteCollection as $quote) {
191
+ $email = $quote->getCustomerEmail();
192
+ //check if the customer exists
193
+ $response = $this->getContactByEmail($email);
194
+
195
+ if(isset($response->message) && $response->message == self::REST_CONTACT_NOT_FOUND){
196
+ //create new contact before sending campaign
197
+ $contactAPI = $this->createNewContact($email);
198
+ if(!isset($contactAPI->message))
199
+ $this->postAddressBookContacts($store->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_GUEST_ADDRESS_BOOK_ID), $contactAPI);
200
+ }
201
+ $contacts[] = $response->id;
202
+ }
203
+ if(!empty($contacts))
204
+ $this->sendCampaign($store->getConfig(self::XML_PATH_GUEST_LOSTBASKET_3_CAMPAIGN), $contacts);
205
+ }
206
+ }
207
+ }
208
+ return;
209
+ }
210
+
211
+ /**
212
+ * @param $storeId
213
+ * @param null $from
214
+ * @param null $to
215
+ * @param bool $guest
216
+ * @return Varien_Data_Collection_Db
217
+ */
218
+ private function _getStoreQuotes($storeId, $from = null, $to = null, $guest = false){
219
+
220
+ $salesCollection = Mage::getResourceModel('sales/quote_collection')
221
+ ->addFieldToFilter('is_active',1)
222
+ ->addFieldToFilter('items_count', array('gt' => 0))
223
+ ->addFieldToFilter('customer_email', array('neq' => ''))
224
+ ->addFieldToFilter('store_id', $storeId)
225
+ ->addFieldToFilter('updated_at',array(
226
+ 'from' => $from,
227
+ 'to' => $to,
228
+ 'date' => true)
229
+ );
230
+ if($guest)
231
+ $salesCollection->addFieldToFilter('checkout_method' , Mage_Checkout_Model_Type_Onepage::METHOD_GUEST);
232
+
233
+ return $salesCollection->load();
234
+ }
235
+
236
+ private function _getContactIdByCustomerId($customerId)
237
+ {
238
+ $customerModel = Mage::getModel('customer/customer')->load($customerId);
239
+
240
+ if($customerModel){
241
+ return $customerModel->getData('dotmailer_contact_id');
242
+ }
243
+ return false;
244
+
245
+ }
246
+ public function forceProccess()
247
+ {
248
+ $result = array('errors' => false, 'message' => '');
249
+ $contacts = array();
250
+ $customerEmail = Mage::getStoreConfig(self::XML_PATH_TEST_LOSTBASKET_EMAIL);
251
+
252
+
253
+ $salesCollection = Mage::getResourceModel('sales/quote_collection')
254
+ ->addFieldToFilter('is_active',1)
255
+ ->addFieldToFilter('items_count', array('gt' => 0))
256
+ ->addFieldToFilter('customer_id', array('neq' => ''))
257
+ ->addFieldToFilter('customer_email', $customerEmail)
258
+
259
+ //->addFieldToFilter('store_id', $storeId)
260
+ ;
261
+ $salesCollection->getSelect()->order("updated_at desc");
262
+
263
+
264
+ $quote = $salesCollection->getFirstItem();
265
+
266
+ if($quote){
267
+
268
+ $contactId = $this->_getContactIdByCustomerId($quote->getCustomerId());
269
+
270
+ if($contactId)
271
+ $contacts[] = $contactId;
272
+
273
+ if(!empty($contacts)){
274
+
275
+ $responce = $this->sendCampaign(Mage::getStoreConfig(self::XML_PATH_TRIGGER_1_CAMPAIGN), $contacts);
276
+ if(isset($responce->message)){
277
+ $result['errors'] = true;
278
+ $result['message'] = $responce->message;
279
+ }else{
280
+
281
+ $result['message'] = 'First Test Campaign Sent ';
282
+ }
283
+ }
284
+ }
285
+ return $result;
286
+
287
+ }
288
+
289
+ }
app/code/local/Dotdigitalgroup/Email/Model/Sales/Sms.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_Sales_Sms extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+ const XML_PATH_SMS_MESSAGE_ONE_STATUS = 'sms_section/sms_message_one/order_status';
6
+ const XML_PATH_SMS_MESSAGE_TWO_STATUS = 'sms_section/sms_message_two/order_status';
7
+ const XML_PATH_SMS_MESSAGE_THREE_STATUS = 'sms_section/sms_message_three/order_status';
8
+ const XML_PATH_SMS_MESSAGE_FOUR_STATUS = 'sms_section/sms_message_four/order_status';
9
+
10
+ const XML_PATH_SMS_MESSAGE_ONE = 'sms_section/sms_message_one/message';
11
+ const XML_PATH_SMS_MESSAGE_TWO = 'sms_section/sms_message_two/message';
12
+ const XML_PATH_SMS_MESSAGE_THREE = 'sms_section/sms_message_three/message';
13
+ const XML_PATH_SMS_MESSAGE_FOUR = 'sms_section/sms_message_four/message';
14
+
15
+ public $_available = array('/customer_name/', '/order_number/', '/{{var /', '/}}/');
16
+
17
+ public function sendMessage($order, $number)
18
+ {
19
+ $storeId = $order->getStoreId();
20
+ $billing = $order->getBillingAddress();
21
+ $customerTelephone = $billing->getTelephone();
22
+
23
+ $message = Mage::getStoreConfig(constant('self::XML_PATH_SMS_MESSAGE_' . $number), $storeId);
24
+
25
+ $message = $this->_processVariables($order, $message);
26
+
27
+
28
+ $pattern = "/^(\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$/";
29
+
30
+ $match = preg_match($pattern, $customerTelephone);
31
+ $this->_helper->log('sms number to send : ' . $customerTelephone, null, $this->_log_filename);
32
+
33
+ if ($match != false) {
34
+ $telephoneNumber = preg_replace('/\A(0){1}+/', '+44', $customerTelephone);
35
+ Mage::helper('connector')->log($telephoneNumber, null, 'api.log');
36
+ $this->postSmsMessagesSendTo($telephoneNumber, $message);
37
+ } else {
38
+
39
+ $this->_helper->log('telephone number not valid ' . $customerTelephone, null, $this->_log_filename);
40
+ }
41
+ }
42
+
43
+ /**
44
+ * @param $order
45
+ * @param $message
46
+ * @return mixed
47
+ */
48
+ protected function _processVariables($order, $message)
49
+ {
50
+ $helper = Mage::helper('connector');
51
+ if(preg_match('/{{var/', $message)){
52
+
53
+ $firstname = $order->getCustomerFirstname();
54
+
55
+ $replacemant = array();
56
+ $replacemant[] = $firstname;
57
+ $replacemant[] = $order->getIncrementId();
58
+ $replacemant[] = '';
59
+ $replacemant[] = '';
60
+
61
+ $message = preg_replace($this->_available, $replacemant, $message);
62
+
63
+ $helper->log($message, null, $this->_log_filename);
64
+
65
+ }
66
+
67
+ return $message;
68
+ }
69
+
70
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Backend/Syncschedule/Customer.php ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Backend_Syncschedule_Customer extends Mage_Core_Model_Config_Data
4
+ {
5
+ const CRON_STRING_PATH = 'connector_sync_settings/sync_customer_schedule/cronschedule';
6
+
7
+ /**
8
+ * Cron settings after save
9
+ *
10
+ *
11
+ */
12
+ protected function _afterSave()
13
+ {
14
+
15
+ $enabled = $this->getData('groups/sync_customer_schedule/fields/enabled/value');
16
+ $time = $this->getData('groups/sync_customer_schedule/fields/time/value');
17
+ $frequency = $this->getData('groups/sync_customer_schedule/fields/frequency/value');
18
+
19
+ $frequencyHourly = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_HOURLY;
20
+ $frequencyDaily = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_DAILY;
21
+ $frequencyWeekly = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_WEEKLY;
22
+ $frequencyMonthly = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_MONTHLY;
23
+
24
+ if ($enabled) {
25
+ $cronDayOfWeek = date('N');
26
+ $cronExprArray = array(
27
+ ($frequency == $frequencyHourly) ? intval($time[1]) : '*', # Minute
28
+ ($frequency == $frequencyDaily) ? intval($time[0]) : '*', # Hour
29
+ ($frequency == $frequencyMonthly) ? '1' : '*', # Day of the Month
30
+ '*', # Month of the Year
31
+ ($frequency == $frequencyWeekly) ? $cronDayOfWeek : '*', # Day of the Week
32
+ );
33
+ $cronExprString = join(' ', $cronExprArray);
34
+ }
35
+ else {
36
+ $cronExprString = '';
37
+ }
38
+
39
+ try {
40
+ // store config $cronExprString
41
+ Mage::getModel('core/config_data')
42
+ ->load(self::CRON_STRING_PATH, 'path')
43
+ ->setValue($cronExprString)
44
+ ->setPath(self::CRON_STRING_PATH)
45
+ ->save();
46
+ }catch (Exception $e) {
47
+ Mage::throwException('Unable to save the cron expression.');
48
+ }
49
+ }
50
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Backend/Syncschedule/Suppressed.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Backend_Syncschedule_Suppressed extends Mage_Core_Model_Config_Data
4
+ {
5
+ const CRON_STRING_PATH = 'connector_sync_settings/sync_suppressed_schedule/cronschedulesupp';
6
+
7
+ /**
8
+ * Cron settings after save
9
+ *
10
+ *
11
+ */
12
+ protected function _afterSave()
13
+ {
14
+
15
+ $enabled = $this->getData('groups/sync_suppressed_schedule/fields/enabled/value');
16
+ $time = $this->getData('groups/sync_suppressed_schedule/fields/time/value');
17
+ $frequency = $this->getData('groups/sync_suppressed_schedule/fields/frequency/value');
18
+
19
+ $frequencyHourly = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_HOURLY;
20
+ $frequencyDaily = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_DAILY;
21
+ $frequencyWeekly = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_WEEKLY;
22
+ $frequencyMonthly = Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency::CRON_MONTHLY;
23
+
24
+ if ($enabled) {
25
+ $cronDayOfWeek = date('N');
26
+ $cronExprArray = array(
27
+ ($frequency == $frequencyHourly) ? intval($time[1]) : '*', # Minute
28
+ ($frequency == $frequencyDaily) ? intval($time[0]) : '*', # Hour
29
+ ($frequency == $frequencyMonthly) ? '1' : '*', # Day of the Month
30
+ '*', # Month of the Year
31
+ ($frequency == $frequencyWeekly) ? $cronDayOfWeek : '*', # Day of the Week
32
+ );
33
+ $cronExprString = join(' ', $cronExprArray);
34
+ }
35
+ else {
36
+ $cronExprString = '';
37
+ }
38
+
39
+ try {
40
+ // store config $cronExprString
41
+
42
+
43
+ Mage::getModel('core/config_data')
44
+ ->load(self::CRON_STRING_PATH, 'path')
45
+ ->setValue($cronExprString)
46
+ ->setPath(self::CRON_STRING_PATH)
47
+ ->save();
48
+
49
+ }
50
+ catch (Exception $e) {
51
+ Mage::throwException('Unable to save the cron expression.');
52
+ }
53
+ }
54
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Activebasket.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Activebasket
4
+ {
5
+ function toOptionArray()
6
+ {
7
+ return array(
8
+ array('value' => '0', 'label' => Mage::helper('connector')->__('Success Page')),
9
+ array('value' => '1', 'label' => Mage::helper('connector')->__('Complete Order'))
10
+ );
11
+ }
12
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Addressbooks.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Addressbooks extends Dotdigitalgroup_Email_Model_Api_Rest
4
+ {
5
+ // Returns the account's datafields
6
+ public function toOptionArray()
7
+ {
8
+ $fields = array();
9
+ //load the configuration for website select in admin
10
+ $websiteName = Mage::app()->getRequest()->getParam('website');
11
+ if(! empty($websiteName)){
12
+ $websites = Mage::getModel('core/website')->getCollection()
13
+ ->addFieldToFilter('code', $websiteName);
14
+ $website = $websites->getFirstItem();
15
+ $this->_api_user = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
16
+ $this->_api_password = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD);
17
+ }
18
+ $addressBooks = $this->postAddressBooks();
19
+
20
+ //set up fields with book id and label
21
+ foreach ($addressBooks as $book){
22
+
23
+ if(isset($book->id))
24
+ $fields[] = array('value' => $book->id, 'label' => $book->name);
25
+ }
26
+
27
+ return $fields;
28
+ }
29
+
30
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Campaigns.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Date: 15/04/2013
4
+ * Time: 13:46
5
+ */
6
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Campaigns extends Dotdigitalgroup_Email_Model_Api_Rest
7
+ {
8
+
9
+ // Returns the account's datafields
10
+ public function toOptionArray()
11
+ {
12
+ $fields = array();
13
+ $websiteName = Mage::app()->getRequest()->getParam('website');
14
+ if(! empty($websiteName)){
15
+ $websites = Mage::getModel('core/website')->getCollection()
16
+ ->addFieldToFilter('code', $websiteName);
17
+ $website = $websites->getFirstItem();
18
+ $this->_api_user = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
19
+ $this->_api_password = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD);
20
+ }
21
+ $campaigns = $this->postCampaigns();
22
+ foreach ($campaigns as $one){
23
+ if(isset($one->id))
24
+ $fields[] = array('value' => $one->id, 'label' => $one->name);
25
+ }
26
+
27
+ return $fields;
28
+ }
29
+
30
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Datafields.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Date: 15/04/2013
4
+ * Time: 13:46
5
+ */
6
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Datafields extends Dotdigitalgroup_Email_Model_Api_Rest
7
+ {
8
+
9
+ // Returns the account's datafields
10
+ public function toOptionArray()
11
+ {
12
+ $fields = array();
13
+ //load the configuration for website select in admin
14
+ $websiteName = Mage::app()->getRequest()->getParam('website');
15
+ if(! empty($websiteName)){
16
+ $websites = Mage::getModel('core/website')->getCollection()
17
+ ->addFieldToFilter('code', $websiteName);
18
+ $website = $websites->getFirstItem();
19
+ $this->_api_user = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_USERNAME);
20
+ $this->_api_password = $website->getConfig(Dotdigitalgroup_Email_Model_Customer_Customer::XML_PATH_CONNECTOR_API_PASSWORD);
21
+ }
22
+
23
+ // Add a "Do Not Map" Option
24
+ $fields[] = array('value' => 0, 'label' => 'Do Not Map');
25
+
26
+ $datafileds = $this->postDataFields();
27
+ foreach ($datafileds as $datafield) {
28
+ if(isset($datafield->name))
29
+ $fields[] = array('value' => $datafield->name, 'label' => $datafield->name);
30
+ }
31
+
32
+ return $fields;
33
+ }
34
+
35
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Displayifnot.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Displayifnot
4
+ {
5
+ public function toOptionArray()
6
+ {
7
+ return array(
8
+ array('value' => 'best-sellers', 'label' => Mage::helper('connector')->__('Best Sellers')),
9
+ array('value' => 'most-viewed', 'label' => Mage::helper('connector')->__('Most Viewed'))
10
+ );
11
+ }
12
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Displaytype.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Displaytype
4
+ {
5
+ public function toOptionArray()
6
+ {
7
+ return array(
8
+ array('value' => 'grid', 'label' => Mage::helper('connector')->__('Grid')),
9
+ array('value' => 'list', 'label' => Mage::helper('connector')->__('List'))
10
+ );
11
+
12
+ }
13
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Gridview.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Gridview
4
+ {
5
+ public function toOptionArray()
6
+ {
7
+ return array(
8
+ array('value' => '2', 'label' => '2'),
9
+ array('value' => '4', 'label' => '4'),
10
+ array('value' => '6', 'label' => '6'),
11
+ array('value' => '8', 'label' => '8'),
12
+ array('value' => '12', 'label' => '12'),
13
+ array('value' => '16', 'label' => '16'),
14
+ array('value' => '20', 'label' => '20'),
15
+ array('value' => '24', 'label' => '24'),
16
+ array('value' => '28', 'label' => '28'),
17
+ array('value' => '32', 'label' => '32'),
18
+ );
19
+ }
20
+
21
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Lostbasket.php ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Lostbasket
4
+ {
5
+ /**
6
+ * lost basket hour options
7
+ * @return array
8
+ */
9
+ public function toOptionArray()
10
+ {
11
+ return array(
12
+ array('value' => "15", 'label' => Mage::helper('connector')->__('15 Minutes')),
13
+ array('value' => "20", 'label' => Mage::helper('connector')->__('20 Minutes')),
14
+ array('value' => "25", 'label' => Mage::helper('connector')->__('25 Minutes')),
15
+ array('value' => "30", 'label' => Mage::helper('connector')->__('30 Minutes')),
16
+ array('value' => "40", 'label' => Mage::helper('connector')->__('40 Minutes')),
17
+ array('value' => "50", 'label' => Mage::helper('connector')->__('50 Minutes')),
18
+ array('value' => "60", 'label' => Mage::helper('connector')->__('60 Minutes')),
19
+ );
20
+ }
21
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Orderlimit.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Orderlimit
4
+ {
5
+ /**
6
+ * @return array
7
+ */
8
+ public function toOptionArray()
9
+ {
10
+ return array(
11
+ array('value' => '50', 'label' => '50'),
12
+ array('value' => '100', 'label' => '100'),
13
+ array('value' => '200', 'label' => '200'),
14
+ array('value' => '300', 'label' => '300'),
15
+ array('value' => '400', 'label' => '400'),
16
+ array('value' => '500', 'label' => '500'),
17
+ );
18
+ }
19
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Orderstatus.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Orderstatus
4
+ {
5
+ public function toOptionArray(){
6
+
7
+ $statusCollection = Mage::getModel('sales/order_status')->getCollection();
8
+ $statuses = array();
9
+
10
+ foreach ($statusCollection as $one) {
11
+ $statuses[] = array('value' => $one->getStatus(), 'label' => Mage::helper('connector')->__($one->getLabel()));
12
+ }
13
+
14
+ return $statuses;
15
+ }
16
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Sendcampain.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_SendCampain
4
+ {
5
+ /**
6
+ * send to campain options hours
7
+ * @return array
8
+ */
9
+ public function toOptionArray()
10
+ {
11
+ return array(
12
+ array('value'=>1 , 'label'=>Mage::helper('adminhtml')->__('1 Hour')),
13
+ array('value'=>2 , 'label'=>Mage::helper('adminhtml')->__('2 Hours')),
14
+ array('value'=>3 , 'label'=>Mage::helper('adminhtml')->__('3 Hours')),
15
+ array('value'=>4 , 'label'=>Mage::helper('adminhtml')->__('4 Hours')),
16
+ array('value'=>5 , 'label'=>Mage::helper('adminhtml')->__('5 Hours')),
17
+ array('value'=>6 , 'label'=>Mage::helper('adminhtml')->__('6 Hours')),
18
+ array('value'=>12 , 'label'=>Mage::helper('adminhtml')->__('12 Hours')),
19
+ array('value'=>36 , 'label'=>Mage::helper('adminhtml')->__('36 Hours')),
20
+ array('value'=>48 , 'label'=>Mage::helper('adminhtml')->__('48 Hours')),
21
+ array('value'=>60 , 'label'=>Mage::helper('adminhtml')->__('60 Hours')),
22
+ array('value'=>72 , 'label'=>Mage::helper('adminhtml')->__('72 Hours')),
23
+ array('value'=>84 , 'label'=>Mage::helper('adminhtml')->__('84 Hours')),
24
+ array('value'=>96 , 'label'=>Mage::helper('adminhtml')->__('96 Hours')),
25
+ array('value'=>108 , 'label'=>Mage::helper('adminhtml')->__('108 Hours')),
26
+ array('value'=>120 , 'label'=>Mage::helper('adminhtml')->__('120 Hours')),
27
+ );
28
+
29
+ }
30
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Syncfrequency.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Syncfrequency
4
+ {
5
+
6
+ protected static $_options;
7
+
8
+ const CRON_HOURLY = 'H';
9
+ const CRON_DAILY = 'D';
10
+ const CRON_WEEKLY = 'W';
11
+ const CRON_MONTHLY = 'M';
12
+
13
+ public function toOptionArray()
14
+ {
15
+ if (!self::$_options) {
16
+ self::$_options = array(
17
+ array(
18
+ 'label' => Mage::helper('cron')->__('Hourly'),
19
+ 'value' => self::CRON_HOURLY,
20
+ ),
21
+ array(
22
+ 'label' => Mage::helper('cron')->__('Daily'),
23
+ 'value' => self::CRON_DAILY,
24
+ ),
25
+ array(
26
+ 'label' => Mage::helper('cron')->__('Weekly'),
27
+ 'value' => self::CRON_WEEKLY,
28
+ ),
29
+ array(
30
+ 'label' => Mage::helper('cron')->__('Monthly'),
31
+ 'value' => self::CRON_MONTHLY,
32
+ ),
33
+ );
34
+ }
35
+ return self::$_options;
36
+ }
37
+
38
+
39
+
40
+ }
app/code/local/Dotdigitalgroup/Email/Model/System/Config/Source/Timeperiod.php ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Model_System_Config_Source_Timeperiod
4
+ {
5
+ public function toOptionArray()
6
+ {
7
+ return array(
8
+ array('value' => 'week', 'label' => Mage::helper('connector')->__('Week')),
9
+ array('value' => 'month', 'label' => Mage::helper('connector')->__('Month')),
10
+ array('value' => 'year', 'label' => Mage::helper('connector')->__('Year'))
11
+ );
12
+ }
13
+ }
app/code/local/Dotdigitalgroup/Email/Test/Model/Product.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Dotdigitalgroup_Email_Test_Model_Product extends EcomDev_PHPUnit_Test_Case
3
+ {
4
+
5
+ public function testIfTheAnswerToTheUniverseIs42()
6
+ {
7
+
8
+ $productModel = Mage::getModel('catalog/product')->load(39);
9
+
10
+
11
+ $price = $productModel->getPrice();
12
+
13
+ $this->assertEquals('20', $price);
14
+
15
+
16
+
17
+ }
18
+ }
app/code/local/Dotdigitalgroup/Email/controllers/Adminhtml/DebugController.php ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_Adminhtml_DebugController extends Mage_Adminhtml_Controller_Action
4
+ {
5
+
6
+ public function forcecustomersyncAction()
7
+ {
8
+ $result = Mage::getModel('connector/customer_customer')->sync();
9
+
10
+ if ($result['error']) {
11
+ Mage::getSingleton('adminhtml/session')->addError($result['message']);
12
+ }else {
13
+ Mage::getSingleton('adminhtml/session')->addSuccess($result['message']);
14
+ }
15
+ $this->_redirectReferer();
16
+ }
17
+
18
+ public function forcelostbasketsyncAction()
19
+ {
20
+
21
+ $result = Mage::getModel('connector/sales_quote')->forceProccess();
22
+
23
+ if ($result['errors'])
24
+ Mage::getSingleton('adminhtml/session')->addError($result['message']);
25
+ else
26
+ Mage::getSingleton('adminhtml/session')->addSuccess($result['message']);
27
+
28
+ $this->_redirectReferer();
29
+ }
30
+
31
+ public function forcesuppressedAction()
32
+ {
33
+ // forse sync
34
+ $result = Mage::getModel('connector/customer_suppressed')->unsubscribe(true);
35
+
36
+ if($result['errors']){
37
+ Mage::getSingleton('adminhtml/session')->addError($result['message']);
38
+ }else{
39
+
40
+ if($result['customers'] > 0)
41
+ Mage::getSingleton('adminhtml/session')->addSuccess('Customers Unsubscribed : ' . $result['customers']);
42
+ else
43
+ Mage::getSingleton('adminhtml/session')->addSuccess('Done.');
44
+ }
45
+
46
+ $this->_redirectReferer();
47
+ }
48
+
49
+ public function testCredentialsAction()
50
+ {
51
+ /**
52
+ * Test account API
53
+ */
54
+ $testResult = Mage::getModel('connector/account_test')->test();
55
+
56
+ if($testResult['errors']){
57
+ Mage::getSingleton('adminhtml/session')->addError($testResult['message']);
58
+ }else{
59
+ Mage::getSingleton('adminhtml/session')->addSuccess('API Credentials Valid.');
60
+ }
61
+ $this->_redirectReferer();
62
+ }
63
+ public function transactionalSyncAction()
64
+ {
65
+
66
+ Mage::register('force_transactional', true);
67
+ $initialSync = Mage::getModel('connector/sales_order')->sync();
68
+
69
+ if ($initialSync['errors'])
70
+ Mage::getSingleton('adminhtml/session')->addError($initialSync['message']);
71
+ else
72
+ Mage::getSingleton('adminhtml/session')->addSuccess($initialSync['message']);
73
+
74
+ $this->_redirectReferer();
75
+ }
76
+ public function deletecontactsidAction()
77
+ {
78
+ Mage::register('first_time_sync', true);
79
+ $customerModel = new Dotdigitalgroup_Email_Model_Customer_Customer();
80
+ $customers = $customerModel->getContactsCustomers();
81
+ $numUpdated = 0;
82
+ if($customers->getSize()){
83
+ foreach ($customers as $one){
84
+ try{
85
+ $customer = Mage::getModel('customer/customer')->load($one->getId());
86
+ $customer->setData('dotmailer_contact_id', null);
87
+ $customer->save();
88
+ }catch(Exception $e){
89
+ Mage::helper('connector')->log($e->getMessage(), null, 'api.log');
90
+ }
91
+ $numUpdated++;
92
+ }
93
+ }
94
+ Mage::unregister('first_time_sync');
95
+ if($numUpdated);
96
+ Mage::getModel('adminhtml/session')->addSuccess('Number Of Contacts Id Removed :'. $numUpdated);
97
+ $this->_redirectReferer();
98
+ }
99
+
100
+ public function countcontactsAction()
101
+ {
102
+ $customer = new Dotdigitalgroup_Email_Model_Customer_Customer();
103
+ $contacts = $customer->getContactsCustomers();
104
+ $total = $customer->getTotalNumberCustomers();
105
+ $numMissing = $contacts->getSize();
106
+
107
+ Mage::getModel('adminhtml/session')->addSuccess('Customers No: ' . $total . ', With Contact Id No: ' . $numMissing);
108
+ $this->_redirectReferer();
109
+ }
110
+
111
+ public function ajaxvalidationAction()
112
+ {
113
+ $result = 'Validation failed!';
114
+ $api_user = $this->getRequest()->getParam('api_user');
115
+ $api_password = $this->getRequest()->getParam('api_password');
116
+ $testResult = Mage::getModel('connector/account_test')->test($api_user, $api_password);
117
+ if($testResult['errors'] == false){
118
+ $result = 'Valid';
119
+ }
120
+
121
+ $this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
122
+ }
123
+
124
+
125
+ }
app/code/local/Dotdigitalgroup/Email/controllers/EmailController.php ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Dotdigitalgroup_Email_EmailController extends Mage_Core_Controller_Front_Action
4
+ {
5
+ public function indexAction()
6
+ {
7
+ //Get current layout state
8
+ $this->loadLayout();
9
+
10
+ $this->renderLayout();
11
+ }
12
+
13
+
14
+ /**
15
+ * Params
16
+ * code - security check
17
+ * order - order id
18
+ * products type :
19
+ * 1.related
20
+ * 2.upsell
21
+ * 3.cross sell
22
+ * 4.best sellers
23
+ * 5.most viewed
24
+ * 6.recently viewed
25
+ *
26
+ */
27
+ public function productsAction()
28
+ {
29
+ //get all params
30
+ $params = $this->getRequest()->getParams();
31
+
32
+ if(!isset($params['code']) || !isset($params['mode'])){
33
+
34
+ exit();
35
+ }
36
+ //authenticate before proceed
37
+ Mage::helper('connector')->auth($params['code']);
38
+ Mage::register('mode', $params['mode']);
39
+ if(isset($params['customer']))
40
+ Mage::register('customer', $params['customer']);
41
+ $this->loadLayout();
42
+ $this->renderLayout();
43
+
44
+ }
45
+
46
+ public function couponAction()
47
+ {
48
+ $this->loadLayout();
49
+ $this->renderLayout();
50
+ }
51
+ public function basketAction()
52
+ {
53
+ $this->loadLayout();
54
+ $this->renderLayout();
55
+ }
56
+
57
+ public function logAction()
58
+ {
59
+ //@todo allow from these Ips
60
+ $allowedIps = array(
61
+
62
+ );
63
+
64
+ //file name param
65
+ $file = $this->getRequest()->getParam('file');
66
+ $fileName = $file . '.log';
67
+ $filePath = Mage::getBaseDir('log') . DIRECTORY_SEPARATOR . $fileName;
68
+
69
+ $this->_prepareDownloadResponse($fileName, array(
70
+ 'type' => 'filename',
71
+ 'value' => $filePath
72
+ ));
73
+ exit();
74
+
75
+ }
76
+
77
+ public function resetimportedorderdataAction()
78
+ {
79
+ $orderCollection = Mage::getResourceModel('sales/order_collection');
80
+ foreach ($orderCollection as $one) {
81
+
82
+ try{
83
+
84
+ $one->setData('dotmailer_order_imported', null);
85
+ $one->save();
86
+ }catch(Exception $e){
87
+ Mage::logException($e);
88
+ }
89
+ }
90
+
91
+ }
92
+
93
+ public function saveMissingIdCustomerAction()
94
+ {
95
+ $customer = Mage::getModel('connector/customer_customer')->getMissingContacts();
96
+ $helper = Mage::helper('connector');
97
+ $helper->log('number of miss ids : ' . count($customer));
98
+ foreach ($customer as $one) {
99
+ try{
100
+ $helper->log($one->getEmail());
101
+ $one->save();
102
+ }catch(Exception $e){
103
+ $helper->log($e->getMessage());
104
+
105
+ }
106
+
107
+ }
108
+
109
+ }
110
+
111
+ public function importAllTransactionalDataAction()
112
+ {
113
+ $orderCollection = Mage::getModel('sales/order')->getCollection();
114
+ $helper = Mage::helper('connector');
115
+ $helper->log('import all transactional data : ' . $orderCollection->getSize());
116
+ foreach($orderCollection as $one){
117
+
118
+ $order = Mage::getModel('connector/connector_order', $one);
119
+ if($order->connector_id)
120
+ $orders[] = $order;
121
+ }
122
+ $helper->log('orders created : ' . count($orders));
123
+ $rest = Mage::getModel('connector/api_rest');
124
+
125
+ try{
126
+ $result = $rest->sendMultiTransactionalData($orders, 'Order');
127
+ $helper->log($result);
128
+ }catch(Exception $e){
129
+ $helper->log($e->getMessage());
130
+ }
131
+
132
+ }
133
+ }
app/code/local/Dotdigitalgroup/Email/etc/adminhtml.xml ADDED
@@ -0,0 +1,43 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <acl>
4
+ <resources>
5
+ <admin>
6
+ <children>
7
+ <system>
8
+ <children>
9
+ <config>
10
+ <children>
11
+ <connector_api_settings translate="title">
12
+ <title><![CDATA[API Credentials]]></title>
13
+ </connector_api_settings>
14
+ <connector_sync_settings translate="title">
15
+ <title><![CDATA[Sync Settings]]></title>
16
+ </connector_sync_settings>
17
+ <connector_data_field_settings translate="title">
18
+ <title><![CDATA[Data Field Mapping]]></title>
19
+ </connector_data_field_settings>
20
+ <connector_roi_page_tracking_settings translate="title">
21
+ <title><![CDATA[ROI & Tracking]]></title>
22
+ </connector_roi_page_tracking_settings>
23
+ <lost_basket_settings translate="title">
24
+ <title><![CDATA[Lost Baskets]]></title>
25
+ </lost_basket_settings>
26
+ <sms_section translate="title">
27
+ <title><![CDATA[SMS Section]]></title>
28
+ </sms_section>
29
+ <dynamic_content translate="label">
30
+ <title><![CDATA[Dynamic Content]]></title>
31
+ </dynamic_content>
32
+ <connector_advanced_settings translate="title">
33
+ <title><![CDATA[Advanced Settings]]></title>
34
+ </connector_advanced_settings>
35
+ </children>
36
+ </config>
37
+ </children>
38
+ </system>
39
+ </children>
40
+ </admin>
41
+ </resources>
42
+ </acl>
43
+ </config>
app/code/local/Dotdigitalgroup/Email/etc/config.xml ADDED
@@ -0,0 +1,289 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+
4
+ <modules>
5
+ <Dotdigitalgroup_Email>
6
+ <version>1.5.1</version>
7
+ </Dotdigitalgroup_Email>
8
+ </modules>
9
+ <frontend>
10
+ <routers>
11
+ <connector>
12
+ <use>standard</use>
13
+ <args>
14
+ <module>Dotdigitalgroup_Email</module>
15
+ <frontName>connector</frontName>
16
+ </args>
17
+ </connector>
18
+ </routers>
19
+ <layout>
20
+ <updates>
21
+ <connector>
22
+ <file>connector.xml</file>
23
+ </connector>
24
+ </updates>
25
+ </layout>
26
+ </frontend>
27
+ <global>
28
+ <models>
29
+ <connector>
30
+ <class>Dotdigitalgroup_Email_Model</class>
31
+ </connector>
32
+ <sales>
33
+ <rewrite>
34
+ <order>Dotdigitalgroup_Email_Model_Order</order>
35
+ </rewrite>
36
+ </sales>
37
+ </models>
38
+ <helpers>
39
+ <connector>
40
+ <class>Dotdigitalgroup_Email_Helper</class>
41
+ </connector>
42
+ </helpers>
43
+ <blocks>
44
+ <connector>
45
+ <class>Dotdigitalgroup_Email_Block</class>
46
+ </connector>
47
+ </blocks>
48
+
49
+ <resources>
50
+ <connector_setup>
51
+ <setup>
52
+ <module>Dotdigitalgroup_Email</module>
53
+ <class>Mage_Sales_Model_Mysql4_Setup</class>
54
+ </setup>
55
+ <connection>
56
+ <use>core_setup</use>
57
+ </connection>
58
+ </connector_setup>
59
+ <customer_write>
60
+ <connection>
61
+ <use>core_write</use>
62
+ </connection>
63
+ </customer_write>
64
+ <customer_read>
65
+ <connection>
66
+ <use>core_read</use>
67
+ </connection>
68
+ </customer_read>
69
+ </resources>
70
+ <events>
71
+ <customer_save_before>
72
+ <observers>
73
+ <contactid>
74
+ <class>Dotdigitalgroup_Email_Model_Observer</class>
75
+ <method>handleCustomerSaveBefore</method>
76
+ </contactid>
77
+ </observers>
78
+ </customer_save_before>
79
+ <sales_order_save_after>
80
+ <observers>
81
+ <connector_checkout_type_onepage_save_order_after>
82
+ <class>Dotdigitalgroup_Email_Model_Observer</class>
83
+ <method>handleSalesOrderSaveAfter</method>
84
+ </connector_checkout_type_onepage_save_order_after>
85
+ </observers>
86
+ </sales_order_save_after>
87
+ <sales_quote_save_after>
88
+ <observers>
89
+ <connector_quote_save_after>
90
+ <type>singleton</type>
91
+ <class>Dotdigitalgroup_Email_Model_Observer</class>
92
+ <method>handleSalesQuoteSaveAfter</method>
93
+ </connector_quote_save_after>
94
+ </observers>
95
+ </sales_quote_save_after>
96
+ <sales_order_creditmemo_save_after>
97
+ <observers>
98
+ <connector_sales_order_payment_refund>
99
+ <class>Dotdigitalgroup_Email_Model_Observer</class>
100
+ <method>handleSalesOrderRefund</method>
101
+ </connector_sales_order_payment_refund>
102
+ </observers>
103
+ </sales_order_creditmemo_save_after>
104
+ <order_cancel_after>
105
+ <observers>
106
+ <connector_sales_order_cancel>
107
+ <class>Dotdigitalgroup_Email_Model_Observer</class>
108
+ <method>hangleSalesOrderCancel</method>
109
+ </connector_sales_order_cancel>
110
+ </observers>
111
+ </order_cancel_after>
112
+
113
+ <sales_order_status_after>
114
+ <observers>
115
+ <connector_sales_order_status_change>
116
+ <class>Dotdigitalgroup_Email_Model_Observer</class>
117
+ <method>handleSalesOrderStatusChange</method>
118
+ </connector_sales_order_status_change>
119
+ </observers>
120
+ </sales_order_status_after>
121
+ </events>
122
+ </global>
123
+
124
+ <adminhtml>
125
+ <layout>
126
+ <updates>
127
+ <connector>
128
+ <file>connector.xml</file>
129
+ </connector>
130
+ </updates>
131
+ </layout>
132
+ </adminhtml>
133
+
134
+
135
+ <admin>
136
+ <routers>
137
+ <connector>
138
+ <use>admin</use>
139
+ <args>
140
+ <modules>
141
+ <connector before="Mage_Adminhtml">Dotdigitalgroup_Email_Adminhtml</connector>
142
+ </modules>
143
+ <module>Dotdigitalgroup_Email_Adminhtml</module>
144
+ <frontName>connector</frontName>
145
+ </args>
146
+ </connector>
147
+ </routers>
148
+ </admin>
149
+
150
+ <crontab>
151
+ <jobs>
152
+ <dotdigitalgroup_email_customer_sync>
153
+ <run><model>connector/cron::customersync</model></run>
154
+ <schedule>
155
+ <config_path>connector_sync_settings/sync_customer_schedule/cronschedule</config_path>
156
+ </schedule>
157
+ </dotdigitalgroup_email_customer_sync>
158
+ <dotdigitalgroup_email_lostbaskets_sync>
159
+ <run><model>connector/cron::lostbasketssync</model></run>
160
+ <schedule>
161
+ <cron_expr>*/5 * * * *</cron_expr>
162
+ </schedule>
163
+ </dotdigitalgroup_email_lostbaskets_sync>
164
+ <dotdigitalgroup_email_suppressed_sync>
165
+ <run><model>connector/cron::suppressedsync</model></run>
166
+ <schedule>
167
+ <config_path>connector_sync_settings/sync_suppressed_schedule/cronschedulesupp</config_path>
168
+ </schedule>
169
+ </dotdigitalgroup_email_suppressed_sync>
170
+ <dotdigitalgroup_email_cleaner>
171
+ <run><model>connector/cron::cleaning</model></run>
172
+ <schedule>
173
+ <cron_expr>0 0 1 * * </cron_expr>
174
+ </schedule>
175
+ </dotdigitalgroup_email_cleaner>
176
+ </jobs>
177
+ </crontab>
178
+ <default>
179
+ <connector_api_settings>
180
+ <api_credentials>
181
+ <username></username>
182
+ <password></password>
183
+ </api_credentials>
184
+ </connector_api_settings>
185
+ <connector_sync_settings>
186
+ <sync_customer_schedule>
187
+ <enabled>0</enabled>
188
+ <cronschedule></cronschedule>
189
+ </sync_customer_schedule>
190
+ <sync_suppressed_schedule>
191
+ <enabled>0</enabled>
192
+ <cronschedulesupp></cronschedulesupp>
193
+ </sync_suppressed_schedule>
194
+ <transactional_data>
195
+ <enabled>0</enabled>
196
+ </transactional_data>
197
+ </connector_sync_settings>
198
+ <connector_data_field_settings>
199
+ <customer_data>
200
+ <firstname></firstname>
201
+ <lastname></lastname>
202
+ <dob></dob>
203
+ <gender></gender>
204
+ <website_created_on></website_created_on>
205
+ <store_created_on></store_created_on>
206
+ <account_created></account_created>
207
+ <last_logged_in></last_logged_in>
208
+ <customer_group></customer_group>
209
+ </customer_data>
210
+ <customer_address>
211
+ <billing_address_1></billing_address_1>
212
+ <billing_address_2></billing_address_2>
213
+ <billing_city></billing_city>
214
+ <billing_country></billing_country>
215
+ <billing_postcode></billing_postcode>
216
+ <billing_telephone></billing_telephone>
217
+ <delivery_address_1></delivery_address_1>
218
+ <delivery_address_2></delivery_address_2>
219
+ <delivery_city></delivery_city>
220
+ <delivery_country></delivery_country>
221
+ <delivery_postcode></delivery_postcode>
222
+ <delivery_telephone></delivery_telephone>
223
+ </customer_address>
224
+ <customer_sales>
225
+ <total_orders></total_orders>
226
+ <average_order_value></average_order_value>
227
+ <total_spend></total_spend>
228
+ </customer_sales>
229
+ </connector_data_field_settings>
230
+
231
+ <connector_roi_page_tracking_settings>
232
+ <page_tracking>
233
+ <enabled></enabled>
234
+ </page_tracking>
235
+ <roi_tracking>
236
+ <enabled></enabled>
237
+ </roi_tracking>
238
+ </connector_roi_page_tracking_settings>
239
+ <connector_newsletter_subscription_settings>
240
+ <customers_subscription_management>
241
+ <default></default>
242
+ </customers_subscription_management>
243
+ <subscribers_subscription_management>
244
+ <default></default>
245
+ </subscribers_subscription_management>
246
+ </connector_newsletter_subscription_settings>
247
+ <lost_basket_settings>
248
+ <customers>
249
+ <enabled_1></enabled_1>
250
+ <send_after_1></send_after_1>
251
+ <campaign_1></campaign_1>
252
+ <enabled_2></enabled_2>
253
+ <send_after_2></send_after_2>
254
+ <campaign_2></campaign_2>
255
+ <enabled_3></enabled_3>
256
+ <send_after_3></send_after_3>
257
+ <campaign_3></campaign_3>
258
+ </customers>
259
+ <guests>
260
+ <enabled_1></enabled_1>
261
+ <send_after_1></send_after_1>
262
+ <campaign_1></campaign_1>
263
+ <enabled_2></enabled_2>
264
+ <send_after_2></send_after_2>
265
+ <campaign_2></campaign_2>
266
+ <enabled_3></enabled_3>
267
+ <send_after_3></send_after_3>
268
+ <campaign_3></campaign_3>
269
+ </guests>
270
+ </lost_basket_settings>
271
+ <connector_advanced_settings>
272
+ <sync_limits>
273
+ <contact>500</contact>
274
+ <orders>500</orders>
275
+ </sync_limits>
276
+ <admin>
277
+ <memory_limit></memory_limit>
278
+ <batch_size>5000</batch_size>
279
+ </admin>
280
+ </connector_advanced_settings>
281
+ </default>
282
+ <phpunit>
283
+ <suite>
284
+ <modules>
285
+ <Dotdigitalgroup_Email />
286
+ </modules>
287
+ </suite>
288
+ </phpunit>
289
+ </config>
app/code/local/Dotdigitalgroup/Email/etc/system.xml ADDED
@@ -0,0 +1,1610 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <config>
3
+ <tabs>
4
+ <connector translate="label">
5
+ <label>EMAIL</label>
6
+ <sort_order>1000</sort_order>
7
+ </connector>
8
+ </tabs>
9
+ <sections>
10
+ <connector_api_settings translate="label">
11
+ <label><![CDATA[API Credentials]]></label>
12
+ <tab>connector</tab>
13
+ <frontend_type>text</frontend_type>
14
+ <sort_order>1000</sort_order>
15
+ <show_in_default>1</show_in_default>
16
+ <show_in_website>1</show_in_website>
17
+ <show_in_store>0</show_in_store>
18
+ <groups>
19
+ <api_credentials>
20
+ <label>API Settings</label>
21
+ <frontend_type>text</frontend_type>
22
+ <sort_order>10</sort_order>
23
+ <show_in_default>1</show_in_default>
24
+ <show_in_website>1</show_in_website>
25
+ <show_in_store>0</show_in_store>
26
+ <expanded>1</expanded>
27
+ <fields>
28
+ <username>
29
+ <label>API Username</label>
30
+ <frontend_type>text</frontend_type>
31
+ <frontend_model>connector/adminhtml_system_config_wrapper</frontend_model>
32
+ <sort_order>10</sort_order>
33
+ <show_in_default>1</show_in_default>
34
+ <show_in_website>1</show_in_website>
35
+ <show_in_store>0</show_in_store>
36
+ <validate>validate-length minimum-length-36</validate>
37
+ </username>
38
+ <password>
39
+ <label>API Password</label>
40
+ <frontend_type>password</frontend_type>
41
+ <frontend_model>connector/adminhtml_system_config_password</frontend_model>
42
+ <sort_order>20</sort_order>
43
+ <show_in_default>1</show_in_default>
44
+ <show_in_website>1</show_in_website>
45
+ <show_in_store>0</show_in_store>
46
+ </password>
47
+ <initialsync translate="label">
48
+ <label>Test API Credentials</label>
49
+ <frontend_model>connector/debug_testcredentials</frontend_model>
50
+ <sort_order>30</sort_order>
51
+ <show_in_default>1</show_in_default>
52
+ <show_in_website>1</show_in_website>
53
+ <show_in_store>0</show_in_store>
54
+ <comment>*Please save your settings before clicking here! Use this button to test the account.</comment>
55
+ </initialsync>
56
+ <validator>
57
+ <label></label>
58
+ <frontend_type>hidden</frontend_type>
59
+ <frontend_model>connector/adminhtml_system_config_waitingfield</frontend_model>
60
+ <sort_order>50</sort_order>
61
+ <show_in_default>1</show_in_default>
62
+ <show_in_website>1</show_in_website>
63
+ <show_in_store>0</show_in_store>
64
+ <can_be_empty>1</can_be_empty>
65
+ </validator>
66
+ </fields>
67
+ </api_credentials>
68
+ </groups>
69
+ </connector_api_settings>
70
+ <connector_sync_settings translate="label">
71
+ <!-- you can put anything inbetween the CDATA tags (including image tags) -->
72
+ <label><![CDATA[Sync Settings]]></label>
73
+ <!-- this relates to the value in tab -->
74
+ <tab>connector</tab>
75
+ <frontend_type>text</frontend_type>
76
+ <sort_order>3000</sort_order>
77
+ <show_in_default>1</show_in_default>
78
+ <show_in_website>1</show_in_website>
79
+ <show_in_store>0</show_in_store>
80
+ <groups>
81
+ <sync_customer_schedule>
82
+ <label>Customer Data and Subscribers Sync Schedule</label>
83
+ <frontend_type>text</frontend_type>
84
+ <sort_order>10</sort_order>
85
+ <show_in_default>1</show_in_default>
86
+ <show_in_website>1</show_in_website>
87
+ <show_in_store>0</show_in_store>
88
+ <expanded>1</expanded>
89
+ <fields>
90
+ <enabled translate="label">
91
+ <label>Enabled</label>
92
+ <frontend_type>select</frontend_type>
93
+ <source_model>adminhtml/system_config_source_yesno</source_model>
94
+ <sort_order>10</sort_order>
95
+ <show_in_default>1</show_in_default>
96
+ <show_in_website>1</show_in_website>
97
+ <show_in_store>0</show_in_store>
98
+ </enabled>
99
+ <time translate="label">
100
+ <label>Start Time</label>
101
+ <frontend_type>time</frontend_type>
102
+ <backend_model>connector/system_config_backend_syncschedule_customer</backend_model>
103
+ <sort_order>20</sort_order>
104
+ <show_in_default>1</show_in_default>
105
+ <show_in_website>0</show_in_website>
106
+ <show_in_store>0</show_in_store>
107
+ <depends><enabled>1</enabled></depends>
108
+ </time>
109
+ <frequency translate="label">
110
+ <label>Frequency</label>
111
+ <frontend_type>select</frontend_type>
112
+ <source_model>connector/system_config_source_syncfrequency</source_model>
113
+ <backend_model>connector/system_config_backend_syncschedule_customer</backend_model>
114
+ <sort_order>30</sort_order>
115
+ <show_in_default>1</show_in_default>
116
+ <show_in_website>0</show_in_website>
117
+ <show_in_store>0</show_in_store>
118
+ <comment>Note: For Weekly and Monthly frequency, the day of the week/month will be today</comment>
119
+ <depends><enabled>1</enabled></depends>
120
+ </frequency>
121
+ <force_sync translate="label">
122
+ <label></label>
123
+ <frontend_model>connector/debug_forcecustomersync</frontend_model>
124
+ <sort_order>50</sort_order>
125
+ <show_in_default>1</show_in_default>
126
+ <show_in_website>0</show_in_website>
127
+ <show_in_store>0</show_in_store>
128
+ <comment>Use this button force the data synchronization to run now</comment>
129
+ </force_sync>
130
+ <validator>
131
+ <label></label>
132
+ <frontend_type>hidden</frontend_type>
133
+ <frontend_model>connector/adminhtml_system_config_waitingfield</frontend_model>
134
+ <sort_order>60</sort_order>
135
+ <show_in_default>1</show_in_default>
136
+ <show_in_website>0</show_in_website>
137
+ <show_in_store>0</show_in_store>
138
+ <can_be_empty>1</can_be_empty>
139
+ </validator>
140
+ </fields>
141
+ </sync_customer_schedule>
142
+ <sync_suppressed_schedule>
143
+ <label>Suppressed Data Sync Schedule</label>
144
+ <frontend_type>text</frontend_type>
145
+ <sort_order>20</sort_order>
146
+ <show_in_default>1</show_in_default>
147
+ <show_in_website>1</show_in_website>
148
+ <show_in_store>0</show_in_store>
149
+ <expanded>1</expanded>
150
+ <fields>
151
+ <enabled translate="label">
152
+ <label>Enabled</label>
153
+ <frontend_type>select</frontend_type>
154
+ <source_model>adminhtml/system_config_source_yesno</source_model>
155
+ <sort_order>2</sort_order>
156
+ <show_in_default>1</show_in_default>
157
+ <show_in_website>1</show_in_website>
158
+ <show_in_store>0</show_in_store>
159
+ </enabled>
160
+ <time translate="label">
161
+ <label>Start Time</label>
162
+ <frontend_type>time</frontend_type>
163
+ <backend_model>connector/system_config_backend_syncschedule_suppressed</backend_model>
164
+ <sort_order>3</sort_order>
165
+ <show_in_default>1</show_in_default>
166
+ <show_in_website>0</show_in_website>
167
+ <show_in_store>0</show_in_store>
168
+ <depends><enabled>1</enabled></depends>
169
+ </time>
170
+ <frequency translate="label">
171
+ <label>Frequency</label>
172
+ <frontend_type>select</frontend_type>
173
+ <source_model>connector/system_config_source_syncfrequency</source_model>
174
+ <backend_model>connector/system_config_backend_syncschedule_suppressed</backend_model>
175
+ <sort_order>4</sort_order>
176
+ <show_in_default>1</show_in_default>
177
+ <show_in_website>0</show_in_website>
178
+ <show_in_store>0</show_in_store>
179
+ <comment>Note: For Weekly and Monthly frequency, the day of the week/month will be today</comment>
180
+ <depends><enabled>1</enabled></depends>
181
+ </frequency>
182
+ <force_sync translate="label">
183
+ <label></label>
184
+ <frontend_model>connector/debug_forcesuppressedsync</frontend_model>
185
+ <sort_order>20</sort_order>
186
+ <show_in_default>1</show_in_default>
187
+ <show_in_website>0</show_in_website>
188
+ <show_in_store>0</show_in_store>
189
+ <comment>Use this button force the suppressed data synchronization to run now</comment>
190
+ </force_sync>
191
+ </fields>
192
+ </sync_suppressed_schedule>
193
+ <transactional_data translate="label">
194
+ <label><![CDATA[ Transactional data settings]]></label>
195
+ <frontend_type>text</frontend_type>
196
+ <sort_order>30</sort_order>
197
+ <show_in_default>1</show_in_default>
198
+ <show_in_website>1</show_in_website>
199
+ <show_in_store>0</show_in_store>
200
+ <fields>
201
+ <order_info_title translate="label">
202
+ <label>Order/Basket Information</label>
203
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
204
+ <sort_order>10</sort_order>
205
+ <show_in_default>1</show_in_default>
206
+ <show_in_website>1</show_in_website>
207
+ <show_in_store>0</show_in_store>
208
+ </order_info_title>
209
+ <order_enabled translate="label">
210
+ <label>Enabled</label>
211
+ <frontend_type>select</frontend_type>
212
+ <source_model>adminhtml/system_config_source_yesno</source_model>
213
+ <sort_order>20</sort_order>
214
+ <show_in_default>1</show_in_default>
215
+ <show_in_website>1</show_in_website>
216
+ <show_in_store>0</show_in_store>
217
+ </order_enabled>
218
+ <wishlist_tile translate="label">
219
+ <label>Wish List Information</label>
220
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
221
+ <sort_order>30</sort_order>
222
+ <show_in_default>1</show_in_default>
223
+ <show_in_website>1</show_in_website>
224
+ <show_in_store>0</show_in_store>
225
+ </wishlist_tile>
226
+ <wishlist_enabled translate="label">
227
+ <label>Enabled</label>
228
+ <frontend_type>select</frontend_type>
229
+ <source_model>adminhtml/system_config_source_yesno</source_model>
230
+ <sort_order>40</sort_order>
231
+ <show_in_default>1</show_in_default>
232
+ <show_in_website>1</show_in_website>
233
+ <show_in_store>0</show_in_store>
234
+ </wishlist_enabled>
235
+ </fields>
236
+ </transactional_data>
237
+ </groups>
238
+ </connector_sync_settings>
239
+ <connector_data_field_settings translate="label">
240
+ <label><![CDATA[Data Mapping]]></label>
241
+ <tab>connector</tab>
242
+ <frontend_type>text</frontend_type>
243
+ <sort_order>2000</sort_order>
244
+ <show_in_default>1</show_in_default>
245
+ <show_in_website>1</show_in_website>
246
+ <show_in_store>0</show_in_store>
247
+ <groups>
248
+ <customer_data>
249
+ <label>Data Field Mapping</label>
250
+ <frontend_type>text</frontend_type>
251
+ <sort_order>20</sort_order>
252
+ <show_in_default>1</show_in_default>
253
+ <show_in_website>1</show_in_website>
254
+ <show_in_store>0</show_in_store>
255
+ <expanded>1</expanded>
256
+ <fields>
257
+ <customer_title translate="label">
258
+ <label>Customer Information</label>
259
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
260
+ <sort_order>10</sort_order>
261
+ <show_in_default>1</show_in_default>
262
+ <show_in_website>1</show_in_website>
263
+ <show_in_store>0</show_in_store>
264
+ </customer_title>
265
+
266
+ <customer_id translate="label">
267
+ <label>Customer ID</label>
268
+ <frontend_type>select</frontend_type>
269
+ <source_model>connector/system_config_source_datafields</source_model>
270
+ <sort_order>20</sort_order>
271
+ <show_in_default>1</show_in_default>
272
+ <show_in_website>1</show_in_website>
273
+ <show_in_store>0</show_in_store>
274
+ <comment>Please map the customer id, if you want to use the dynamic content.</comment>
275
+ </customer_id>
276
+ <title>
277
+ <label>Title</label>
278
+ <frontend_type>select</frontend_type>
279
+ <source_model>connector/system_config_source_datafields</source_model>
280
+ <sort_order>30</sort_order>
281
+ <show_in_default>1</show_in_default>
282
+ <show_in_website>1</show_in_website>
283
+ <show_in_store>0</show_in_store>
284
+ </title>
285
+
286
+ <firstname>
287
+ <label>First Name</label>
288
+ <frontend_type>select</frontend_type>
289
+ <source_model>connector/system_config_source_datafields</source_model>
290
+ <sort_order>40</sort_order>
291
+ <show_in_default>1</show_in_default>
292
+ <show_in_website>1</show_in_website>
293
+ <show_in_store>0</show_in_store>
294
+ </firstname>
295
+ <lastname>
296
+ <label>Last Name</label>
297
+ <frontend_type>select</frontend_type>
298
+ <source_model>connector/system_config_source_datafields</source_model>
299
+ <sort_order>50</sort_order>
300
+ <show_in_default>1</show_in_default>
301
+ <show_in_website>1</show_in_website>
302
+ <show_in_store>0</show_in_store>
303
+ </lastname>
304
+ <dob>
305
+ <label>D.O.B.</label>
306
+ <frontend_type>select</frontend_type>
307
+ <source_model>connector/system_config_source_datafields</source_model>
308
+ <sort_order>60</sort_order>
309
+ <show_in_default>1</show_in_default>
310
+ <show_in_website>1</show_in_website>
311
+ <show_in_store>0</show_in_store>
312
+ </dob>
313
+ <gender>
314
+ <label>Gender</label>
315
+ <frontend_type>select</frontend_type>
316
+ <source_model>connector/system_config_source_datafields</source_model>
317
+ <sort_order>70</sort_order>
318
+ <show_in_default>1</show_in_default>
319
+ <show_in_website>1</show_in_website>
320
+ <show_in_store>0</show_in_store>
321
+ </gender>
322
+ <website_created_on>
323
+ <label>Website Created On</label>
324
+ <frontend_type>select</frontend_type>
325
+ <source_model>connector/system_config_source_datafields</source_model>
326
+ <sort_order>80</sort_order>
327
+ <show_in_default>1</show_in_default>
328
+ <show_in_website>1</show_in_website>
329
+ <show_in_store>0</show_in_store>
330
+ </website_created_on>
331
+ <store_created_on>
332
+ <label>Store Created On</label>
333
+ <frontend_type>select</frontend_type>
334
+ <source_model>connector/system_config_source_datafields</source_model>
335
+ <sort_order>90</sort_order>
336
+ <show_in_default>1</show_in_default>
337
+ <show_in_website>1</show_in_website>
338
+ <show_in_store>0</show_in_store>
339
+ </store_created_on>
340
+ <account_created>
341
+ <label>Account Created Date</label>
342
+ <frontend_type>select</frontend_type>
343
+ <source_model>connector/system_config_source_datafields</source_model>
344
+ <sort_order>100</sort_order>
345
+ <show_in_default>1</show_in_default>
346
+ <show_in_website>1</show_in_website>
347
+ <show_in_store>0</show_in_store>
348
+ </account_created>
349
+ <last_logged_in>
350
+ <label>Last Logged In Date</label>
351
+ <frontend_type>select</frontend_type>
352
+ <source_model>connector/system_config_source_datafields</source_model>
353
+ <sort_order>110</sort_order>
354
+ <show_in_default>1</show_in_default>
355
+ <show_in_website>1</show_in_website>
356
+ <show_in_store>0</show_in_store>
357
+ </last_logged_in>
358
+ <customer_group>
359
+ <label>Customer Group</label>
360
+ <frontend_type>select</frontend_type>
361
+ <source_model>connector/system_config_source_datafields</source_model>
362
+ <sort_order>120</sort_order>
363
+ <show_in_default>1</show_in_default>
364
+ <show_in_website>1</show_in_website>
365
+ <show_in_store>0</show_in_store>
366
+ </customer_group>
367
+ <address_title translate="label">
368
+ <label>Address Information</label>
369
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
370
+ <sort_order>130</sort_order>
371
+ <show_in_default>1</show_in_default>
372
+ <show_in_website>1</show_in_website>
373
+ <show_in_store>0</show_in_store>
374
+ </address_title>
375
+ <billing_address_1>
376
+ <label>Billing Address Line 1</label>
377
+ <frontend_type>select</frontend_type>
378
+ <source_model>connector/system_config_source_datafields</source_model>
379
+ <sort_order>140</sort_order>
380
+ <show_in_default>1</show_in_default>
381
+ <show_in_website>1</show_in_website>
382
+ <show_in_store>0</show_in_store>
383
+ </billing_address_1>
384
+ <billing_address_2>
385
+ <label>Billing Address Line 2</label>
386
+ <frontend_type>select</frontend_type>
387
+ <source_model>connector/system_config_source_datafields</source_model>
388
+ <sort_order>150</sort_order>
389
+ <show_in_default>1</show_in_default>
390
+ <show_in_website>1</show_in_website>
391
+ <show_in_store>0</show_in_store>
392
+ </billing_address_2>
393
+ <billing_city>
394
+ <label>Billing City</label>
395
+ <frontend_type>select</frontend_type>
396
+ <source_model>connector/system_config_source_datafields</source_model>
397
+ <sort_order>160</sort_order>
398
+ <show_in_default>1</show_in_default>
399
+ <show_in_website>1</show_in_website>
400
+ <show_in_store>0</show_in_store>
401
+ </billing_city>
402
+ <billing_country>
403
+ <label>Billing Country</label>
404
+ <frontend_type>select</frontend_type>
405
+ <source_model>connector/system_config_source_datafields</source_model>
406
+ <sort_order>170</sort_order>
407
+ <show_in_default>1</show_in_default>
408
+ <show_in_website>1</show_in_website>
409
+ <show_in_store>0</show_in_store>
410
+ </billing_country>
411
+ <billing_postcode>
412
+ <label>Billing Zip/Postcode</label>
413
+ <frontend_type>select</frontend_type>
414
+ <source_model>connector/system_config_source_datafields</source_model>
415
+ <sort_order>180</sort_order>
416
+ <show_in_default>1</show_in_default>
417
+ <show_in_website>1</show_in_website>
418
+ <show_in_store>0</show_in_store>
419
+ </billing_postcode>
420
+ <billing_telephone>
421
+ <label>Billing Telephone</label>
422
+ <frontend_type>select</frontend_type>
423
+ <source_model>connector/system_config_source_datafields</source_model>
424
+ <sort_order>190</sort_order>
425
+ <show_in_default>1</show_in_default>
426
+ <show_in_website>1</show_in_website>
427
+ <show_in_store>0</show_in_store>
428
+ </billing_telephone>
429
+ <delivery_address_1>
430
+ <label>Delivery Address Line 1</label>
431
+ <frontend_type>select</frontend_type>
432
+ <source_model>connector/system_config_source_datafields</source_model>
433
+ <sort_order>200</sort_order>
434
+ <show_in_default>1</show_in_default>
435
+ <show_in_website>1</show_in_website>
436
+ <show_in_store>0</show_in_store>
437
+ </delivery_address_1>
438
+ <delivery_address_2>
439
+ <label>Delivery Address Line 2</label>
440
+ <frontend_type>select</frontend_type>
441
+ <source_model>connector/system_config_source_datafields</source_model>
442
+ <sort_order>210</sort_order>
443
+ <show_in_default>1</show_in_default>
444
+ <show_in_website>1</show_in_website>
445
+ <show_in_store>0</show_in_store>
446
+ </delivery_address_2>
447
+ <delivery_city>
448
+ <label>Delivery City</label>
449
+ <frontend_type>select</frontend_type>
450
+ <source_model>connector/system_config_source_datafields</source_model>
451
+ <sort_order>220</sort_order>
452
+ <show_in_default>1</show_in_default>
453
+ <show_in_website>1</show_in_website>
454
+ <show_in_store>0</show_in_store>
455
+ </delivery_city>
456
+ <delivery_country>
457
+ <label>Delivery Country</label>
458
+ <frontend_type>select</frontend_type>
459
+ <source_model>connector/system_config_source_datafields</source_model>
460
+ <sort_order>230</sort_order>
461
+ <show_in_default>1</show_in_default>
462
+ <show_in_website>1</show_in_website>
463
+ <show_in_store>0</show_in_store>
464
+ </delivery_country>
465
+ <delivery_postcode>
466
+ <label>Delivery Zip/Postcode</label>
467
+ <frontend_type>select</frontend_type>
468
+ <source_model>connector/system_config_source_datafields</source_model>
469
+ <sort_order>240</sort_order>
470
+ <show_in_default>1</show_in_default>
471
+ <show_in_website>1</show_in_website>
472
+ <show_in_store>0</show_in_store>
473
+ </delivery_postcode>
474
+ <delivery_telephone>
475
+ <label>Delivery Telephone</label>
476
+ <frontend_type>select</frontend_type>
477
+ <source_model>connector/system_config_source_datafields</source_model>
478
+ <sort_order>250</sort_order>
479
+ <show_in_default>1</show_in_default>
480
+ <show_in_website>1</show_in_website>
481
+ <show_in_store>0</show_in_store>
482
+ </delivery_telephone>
483
+ <sales_title translate="label">
484
+ <label>Sales Information</label>
485
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
486
+ <sort_order>260</sort_order>
487
+ <show_in_default>1</show_in_default>
488
+ <show_in_website>1</show_in_website>
489
+ <show_in_store>0</show_in_store>
490
+ </sales_title>
491
+ <total_orders>
492
+ <label>Total Number of Orders</label>
493
+ <frontend_type>select</frontend_type>
494
+ <source_model>connector/system_config_source_datafields</source_model>
495
+ <sort_order>270</sort_order>
496
+ <show_in_default>1</show_in_default>
497
+ <show_in_website>1</show_in_website>
498
+ <show_in_store>0</show_in_store>
499
+ </total_orders>
500
+ <average_order_value>
501
+ <label>Average Order Value</label>
502
+ <frontend_type>select</frontend_type>
503
+ <source_model>connector/system_config_source_datafields</source_model>
504
+ <sort_order>280</sort_order>
505
+ <show_in_default>1</show_in_default>
506
+ <show_in_website>1</show_in_website>
507
+ <show_in_store>0</show_in_store>
508
+ </average_order_value>
509
+ <total_spend>
510
+ <label>Total Spend</label>
511
+ <frontend_type>select</frontend_type>
512
+ <source_model>connector/system_config_source_datafields</source_model>
513
+ <sort_order>290</sort_order>
514
+ <show_in_default>1</show_in_default>
515
+ <show_in_website>1</show_in_website>
516
+ <show_in_store>0</show_in_store>
517
+ </total_spend>
518
+ <last_order translate="label">
519
+ <label>Last Purchase Date</label>
520
+ <frontend_type>select</frontend_type>
521
+ <source_model>connector/system_config_source_datafields</source_model>
522
+ <sort_order>300</sort_order>
523
+ <show_in_default>1</show_in_default>
524
+ <show_in_website>1</show_in_website>
525
+ <show_in_store>0</show_in_store>
526
+ </last_order>
527
+ <last_order_no translate="label">
528
+ <label>Last Order No</label>
529
+ <frontend_type>select</frontend_type>
530
+ <source_model>connector/system_config_source_datafields</source_model>
531
+ <sort_order>310</sort_order>
532
+ <show_in_default>1</show_in_default>
533
+ <show_in_website>1</show_in_website>
534
+ <show_in_store>0</show_in_store>
535
+ </last_order_no>
536
+ <validator>
537
+ <label>Validation Block</label>
538
+ <frontend_type>select</frontend_type>
539
+ <source_model>connector/system_config_source_datafields</source_model>
540
+ <frontend_model>connector/adminhtml_system_config_validator</frontend_model>
541
+ <sort_order>320</sort_order>
542
+ <show_in_default>1</show_in_default>
543
+ <show_in_website>1</show_in_website>
544
+ <show_in_store>0</show_in_store>
545
+ <can_be_empty>1</can_be_empty>
546
+ <expanded>1</expanded>
547
+ </validator>
548
+ </fields>
549
+ </customer_data>
550
+ <address_book translate="label">
551
+ <label>Address Book Mapping</label>
552
+ <sort_order>10</sort_order>
553
+ <show_in_default>1</show_in_default>
554
+ <show_in_website>1</show_in_website>
555
+ <show_in_store>0</show_in_store>
556
+ <expanded>1</expanded>
557
+ <fields>
558
+ <customers>
559
+ <label>Add Customers to</label>
560
+ <frontend_type>select</frontend_type>
561
+ <source_model>connector/system_config_source_addressbooks</source_model>
562
+ <sort_order>10</sort_order>
563
+ <show_in_default>1</show_in_default>
564
+ <show_in_website>1</show_in_website>
565
+ <show_in_store>0</show_in_store>
566
+ </customers>
567
+ <subscribers>
568
+ <label>Add Subscribers to</label>
569
+ <frontend_type>select</frontend_type>
570
+ <source_model>connector/system_config_source_addressbooks</source_model>
571
+ <sort_order>20</sort_order>
572
+ <show_in_default>1</show_in_default>
573
+ <show_in_website>1</show_in_website>
574
+ <show_in_store>0</show_in_store>
575
+ </subscribers>
576
+ <guest>
577
+ <label>Add Guests to</label>
578
+ <frontend_type>select</frontend_type>
579
+ <source_model>connector/system_config_source_addressbooks</source_model>
580
+ <sort_order>30</sort_order>
581
+ <show_in_default>1</show_in_default>
582
+ <show_in_website>1</show_in_website>
583
+ <show_in_store>0</show_in_store>
584
+ </guest>
585
+ </fields>
586
+ </address_book>
587
+ </groups>
588
+ </connector_data_field_settings>
589
+ <connector_roi_page_tracking_settings translate="label">
590
+ <label><![CDATA[ROI & Tracking]]></label>
591
+ <tab>connector</tab>
592
+ <frontend_type>text</frontend_type>
593
+ <sort_order>4000</sort_order>
594
+ <show_in_default>1</show_in_default>
595
+ <show_in_website>1</show_in_website>
596
+ <show_in_store>0</show_in_store>
597
+ <groups>
598
+ <page_tracking>
599
+ <label>Page Tracking</label>
600
+ <frontend_type>text</frontend_type>
601
+ <sort_order>10</sort_order>
602
+ <show_in_default>1</show_in_default>
603
+ <show_in_website>1</show_in_website>
604
+ <show_in_store>0</show_in_store>
605
+ <expanded>1</expanded>
606
+ <fields>
607
+ <enabled translate="label">
608
+ <label>Enabled</label>
609
+ <frontend_type>select</frontend_type>
610
+ <source_model>adminhtml/system_config_source_yesno</source_model>
611
+ <sort_order>10</sort_order>
612
+ <show_in_default>1</show_in_default>
613
+ <show_in_website>1</show_in_website>
614
+ <show_in_store>0</show_in_store>
615
+ </enabled>
616
+ </fields>
617
+ </page_tracking>
618
+ <roi_tracking>
619
+ <label>ROI Tracking</label>
620
+ <frontend_type>text</frontend_type>
621
+ <sort_order>20</sort_order>
622
+ <show_in_default>1</show_in_default>
623
+ <show_in_website>1</show_in_website>
624
+ <show_in_store>0</show_in_store>
625
+ <expanded>1</expanded>
626
+ <fields>
627
+ <enabled translate="label">
628
+ <label>Enabled</label>
629
+ <frontend_type>select</frontend_type>
630
+ <source_model>adminhtml/system_config_source_yesno</source_model>
631
+ <sort_order>10</sort_order>
632
+ <show_in_default>1</show_in_default>
633
+ <show_in_website>1</show_in_website>
634
+ <show_in_store>0</show_in_store>
635
+ </enabled>
636
+ </fields>
637
+ </roi_tracking>
638
+ </groups>
639
+ </connector_roi_page_tracking_settings>
640
+ <lost_basket_settings translate="label">
641
+ <label><![CDATA[Lost Baskets]]></label>
642
+ <tab>connector</tab>
643
+ <frontend_type>text</frontend_type>
644
+ <sort_order>6000</sort_order>
645
+ <show_in_default>1</show_in_default>
646
+ <show_in_website>1</show_in_website>
647
+ <show_in_store>1</show_in_store>
648
+ <groups>
649
+ <active>
650
+ <label>Lost Baskets Settings</label>
651
+ <frontend_type>text</frontend_type>
652
+ <sort_order>100</sort_order>
653
+ <show_in_default>0</show_in_default>
654
+ <show_in_website>0</show_in_website>
655
+ <show_in_store>0</show_in_store>
656
+ <fields>
657
+ <active translate="label">
658
+ <label>Consider Order complete for lost baskets</label>
659
+ <frontend_type>select</frontend_type>
660
+ <source_model>connector/system_config_source_activebasket</source_model>
661
+ <sort_order>10</sort_order>
662
+ <show_in_default>1</show_in_default>
663
+ <show_in_website>1</show_in_website>
664
+ <show_in_store>0</show_in_store>
665
+ </active>
666
+ </fields>
667
+ </active>
668
+ <customers>
669
+ <label>Customers</label>
670
+ <frontend_type>text</frontend_type>
671
+ <sort_order>10</sort_order>
672
+ <show_in_default>1</show_in_default>
673
+ <show_in_website>1</show_in_website>
674
+ <show_in_store>1</show_in_store>
675
+ <expanded>1</expanded>
676
+ <fields>
677
+ <heading_1 translate="label">
678
+ <label>Lost basket 1</label>
679
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
680
+ <sort_order>10</sort_order>
681
+ <show_in_default>1</show_in_default>
682
+ <show_in_website>1</show_in_website>
683
+ <show_in_store>1</show_in_store>
684
+ </heading_1>
685
+ <enabled_1 translate="label">
686
+ <label>Enabled/Disabled</label>
687
+ <frontend_type>select</frontend_type>
688
+ <config_path>lostbaskets/customers/enabled_1</config_path>
689
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
690
+ <sort_order>20</sort_order>
691
+ <show_in_default>1</show_in_default>
692
+ <show_in_website>1</show_in_website>
693
+ <show_in_store>1</show_in_store>
694
+ </enabled_1>
695
+ <send_after_1>
696
+ <label>Send after (min)</label>
697
+ <frontend_type>select</frontend_type>
698
+ <source_model>connector/system_config_source_lostbasket</source_model>
699
+ <sort_order>30</sort_order>
700
+ <show_in_default>1</show_in_default>
701
+ <show_in_website>1</show_in_website>
702
+ <show_in_store>1</show_in_store>
703
+ </send_after_1>
704
+ <campaign_1>
705
+ <label>Campaign To Send</label>
706
+ <frontend_type>select</frontend_type>
707
+ <source_model>connector/system_config_source_campaigns</source_model>
708
+ <sort_order>40</sort_order>
709
+ <show_in_default>1</show_in_default>
710
+ <show_in_website>1</show_in_website>
711
+ <show_in_store>1</show_in_store>
712
+ </campaign_1>
713
+ <heading_2 translate="label">
714
+ <label>Lost basket 2</label>
715
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
716
+ <sort_order>50</sort_order>
717
+ <show_in_default>1</show_in_default>
718
+ <show_in_website>1</show_in_website>
719
+ <show_in_store>1</show_in_store>
720
+ </heading_2>
721
+ <enabled_2 translate="label">
722
+ <label>Enabled/Disabled</label>
723
+ <frontend_type>select</frontend_type>
724
+ <config_path>lostbaskets/customers/enabled_2</config_path>
725
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
726
+ <sort_order>60</sort_order>
727
+ <show_in_default>1</show_in_default>
728
+ <show_in_website>1</show_in_website>
729
+ <show_in_store>1</show_in_store>
730
+ </enabled_2>
731
+ <send_after_2>
732
+ <label>Send after (hrs)</label>
733
+ <frontend_type>select</frontend_type>
734
+ <source_model>connector/system_config_source_sendcampain</source_model>
735
+ <sort_order>70</sort_order>
736
+ <show_in_default>1</show_in_default>
737
+ <show_in_website>1</show_in_website>
738
+ <show_in_store>1</show_in_store>
739
+ </send_after_2>
740
+ <campaign_2>
741
+ <label>Campaign to send</label>
742
+ <frontend_type>select</frontend_type>
743
+ <source_model>connector/system_config_source_campaigns</source_model>
744
+ <sort_order>80</sort_order>
745
+ <show_in_default>1</show_in_default>
746
+ <show_in_website>1</show_in_website>
747
+ <show_in_store>1</show_in_store>
748
+ </campaign_2>
749
+ <heading_3 translate="label">
750
+ <label>Lost basket 3 </label>
751
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
752
+ <sort_order>90</sort_order>
753
+ <show_in_default>1</show_in_default>
754
+ <show_in_website>1</show_in_website>
755
+ <show_in_store>1</show_in_store>
756
+ </heading_3>
757
+ <enabled_3 translate="label">
758
+ <label>Enabled/Disabled</label>
759
+ <frontend_type>select</frontend_type>
760
+ <config_path>lostbaskets/customers/enabled_3</config_path>
761
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
762
+ <sort_order>100</sort_order>
763
+ <show_in_default>1</show_in_default>
764
+ <show_in_website>1</show_in_website>
765
+ <show_in_store>1</show_in_store>
766
+ </enabled_3>
767
+ <send_after_3>
768
+ <label>Send after (hrs)</label>
769
+ <frontend_type>select</frontend_type>
770
+ <source_model>connector/system_config_source_sendcampain</source_model>
771
+ <sort_order>110</sort_order>
772
+ <show_in_default>1</show_in_default>
773
+ <show_in_website>1</show_in_website>
774
+ <show_in_store>1</show_in_store>
775
+ </send_after_3>
776
+ <campaign_3>
777
+ <label>Campaign to send</label>
778
+ <frontend_type>select</frontend_type>
779
+ <source_model>connector/system_config_source_campaigns</source_model>
780
+ <sort_order>120</sort_order>
781
+ <show_in_default>1</show_in_default>
782
+ <show_in_website>1</show_in_website>
783
+ <show_in_store>1</show_in_store>
784
+ </campaign_3>
785
+ </fields>
786
+ </customers>
787
+ <guests>
788
+ <label>Guests</label>
789
+ <frontend_type>text</frontend_type>
790
+ <sort_order>20</sort_order>
791
+ <show_in_default>1</show_in_default>
792
+ <show_in_website>1</show_in_website>
793
+ <show_in_store>1</show_in_store>
794
+ <fields>
795
+ <heading_1 translate="label">
796
+ <label>Lost basket 1</label>
797
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
798
+ <sort_order>10</sort_order>
799
+ <show_in_default>1</show_in_default>
800
+ <show_in_website>1</show_in_website>
801
+ <show_in_store>1</show_in_store>
802
+ </heading_1>
803
+ <enabled_1 translate="label">
804
+ <label>Enabled/Disabled</label>
805
+ <frontend_type>select</frontend_type>
806
+ <config_path>lostbaskets/guests/enabled_1</config_path>
807
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
808
+ <sort_order>20</sort_order>
809
+ <show_in_default>1</show_in_default>
810
+ <show_in_website>1</show_in_website>
811
+ <show_in_store>1</show_in_store>
812
+ </enabled_1>
813
+ <send_after_1>
814
+ <label>Send after (min)</label>
815
+ <frontend_type>select</frontend_type>
816
+ <source_model>connector/system_config_source_lostbasket</source_model>
817
+ <sort_order>30</sort_order>
818
+ <show_in_default>1</show_in_default>
819
+ <show_in_website>1</show_in_website>
820
+ <show_in_store>1</show_in_store>
821
+ </send_after_1>
822
+ <campaign_1>
823
+ <label>Campaign To Send</label>
824
+ <frontend_type>select</frontend_type>
825
+ <source_model>connector/system_config_source_campaigns</source_model>
826
+ <sort_order>40</sort_order>
827
+ <show_in_default>1</show_in_default>
828
+ <show_in_website>1</show_in_website>
829
+ <show_in_store>1</show_in_store>
830
+ </campaign_1>
831
+
832
+ <heading_2 translate="label">
833
+ <label>Lost basket 2</label>
834
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
835
+ <sort_order>50</sort_order>
836
+ <show_in_default>1</show_in_default>
837
+ <show_in_website>1</show_in_website>
838
+ <show_in_store>1</show_in_store>
839
+ </heading_2>
840
+ <enabled_2 translate="label">
841
+ <label>Enabled/Disabled</label>
842
+ <frontend_type>select</frontend_type>
843
+ <config_path>lostbaskets/guests/enabled_2</config_path>
844
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
845
+ <sort_order>60</sort_order>
846
+ <show_in_default>1</show_in_default>
847
+ <show_in_website>1</show_in_website>
848
+ <show_in_store>1</show_in_store>
849
+ </enabled_2>
850
+ <send_after_2>
851
+ <label>Send after (hrs)</label>
852
+ <frontend_type>select</frontend_type>
853
+ <source_model>connector/system_config_source_sendcampain</source_model>
854
+ <sort_order>70</sort_order>
855
+ <show_in_default>1</show_in_default>
856
+ <show_in_website>1</show_in_website>
857
+ <show_in_store>1</show_in_store>
858
+ </send_after_2>
859
+ <campaign_2>
860
+ <label>Campaign to send</label>
861
+ <frontend_type>select</frontend_type>
862
+ <source_model>connector/system_config_source_campaigns</source_model>
863
+ <sort_order>80</sort_order>
864
+ <show_in_default>1</show_in_default>
865
+ <show_in_website>1</show_in_website>
866
+ <show_in_store>1</show_in_store>
867
+ </campaign_2>
868
+
869
+ <heading_3 translate="label">
870
+ <label>Lost basket 3 </label>
871
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
872
+ <sort_order>90</sort_order>
873
+ <show_in_default>1</show_in_default>
874
+ <show_in_website>1</show_in_website>
875
+ <show_in_store>1</show_in_store>
876
+ </heading_3>
877
+ <enabled_3 translate="label">
878
+ <label>Enabled/Disabled</label>
879
+ <frontend_type>select</frontend_type>
880
+ <config_path>lostbaskets/guests/enabled_3</config_path>
881
+ <source_model>adminhtml/system_config_source_enabledisable</source_model>
882
+ <sort_order>100</sort_order>
883
+ <show_in_default>1</show_in_default>
884
+ <show_in_website>1</show_in_website>
885
+ <show_in_store>1</show_in_store>
886
+ </enabled_3>
887
+ <send_after_3>
888
+ <label>Send after (hrs)</label>
889
+ <frontend_type>select</frontend_type>
890
+ <source_model>connector/system_config_source_sendcampain</source_model>
891
+ <sort_order>110</sort_order>
892
+ <show_in_default>1</show_in_default>
893
+ <show_in_website>1</show_in_website>
894
+ <show_in_store>1</show_in_store>
895
+ </send_after_3>
896
+ <campaign_3>
897
+ <label>Campaign to send</label>
898
+ <frontend_type>select</frontend_type>
899
+ <source_model>connector/system_config_source_campaigns</source_model>
900
+ <sort_order>120</sort_order>
901
+ <show_in_default>1</show_in_default>
902
+ <show_in_website>1</show_in_website>
903
+ <show_in_store>1</show_in_store>
904
+ </campaign_3>
905
+ </fields>
906
+ </guests>
907
+ <test>
908
+ <label>Test</label>
909
+ <frontend_type>text</frontend_type>
910
+ <sort_order>30</sort_order>
911
+ <show_in_default>1</show_in_default>
912
+ <show_in_website>1</show_in_website>
913
+ <show_in_store>1</show_in_store>
914
+ <fields>
915
+ <email translate="label">
916
+ <label>Test Email</label>
917
+ <frontend_type>text</frontend_type>
918
+ <sort_order>10</sort_order>
919
+ <show_in_default>1</show_in_default>
920
+ <show_in_website>1</show_in_website>
921
+ <show_in_store>0</show_in_store>
922
+ <comment>Enter the email for customer to test lost basket, with the first lost basket campaign.</comment>
923
+ </email>
924
+ <force_test translate="label">
925
+ <label></label>
926
+ <frontend_model>connector/debug_forcelostbasketsync</frontend_model>
927
+ <sort_order>50</sort_order>
928
+ <show_in_default>1</show_in_default>
929
+ <show_in_website>0</show_in_website>
930
+ <show_in_store>0</show_in_store>
931
+ <comment>Use this button force the data synchronization to run now</comment>
932
+ </force_test>
933
+ </fields>
934
+ </test>
935
+ </groups>
936
+ </lost_basket_settings>
937
+ <sms_section translate="label">
938
+ <label><![CDATA[SMS]]></label>
939
+ <tab>connector</tab>
940
+ <frontend_type>text</frontend_type>
941
+ <sort_order>7000</sort_order>
942
+ <show_in_default>1</show_in_default>
943
+ <show_in_website>1</show_in_website>
944
+ <show_in_store>1</show_in_store>
945
+ <groups>
946
+ <sms_message_one translate="label">
947
+ <label>SMS Message 1</label>
948
+ <frontend_type>text</frontend_type>
949
+ <sort_order>10</sort_order>
950
+ <show_in_default>1</show_in_default>
951
+ <show_in_website>1</show_in_website>
952
+ <show_in_store>1</show_in_store>
953
+ <fields>
954
+ <enabled translate="label">
955
+ <label>Enabled</label>
956
+ <frontend_type>select</frontend_type>
957
+ <source_model>adminhtml/system_config_source_yesno</source_model>
958
+ <sort_order>10</sort_order>
959
+ <show_in_default>1</show_in_default>
960
+ <show_in_website>1</show_in_website>
961
+ <show_in_store>1</show_in_store>
962
+ </enabled>
963
+ <order_status translate="label">
964
+ <label>Order Status</label>
965
+ <sort_order>20</sort_order>
966
+ <frontend_type>select</frontend_type>
967
+ <source_model>connector/system_config_source_orderstatus</source_model>
968
+ <show_in_default>1</show_in_default>
969
+ <show_in_website>1</show_in_website>
970
+ <show_in_store>1</show_in_store>
971
+ </order_status>
972
+ <message translate="label">
973
+ <label>Message</label>
974
+ <frontend_type>textarea</frontend_type>
975
+ <frontend_model>connector/adminhtml_system_config_smsmessageone</frontend_model>
976
+ <sort_order>30</sort_order>
977
+ <show_in_default>1</show_in_default>
978
+ <show_in_website>1</show_in_website>
979
+ <show_in_store>1</show_in_store>
980
+ <validate>validate-length maximum-length-110</validate>
981
+ </message>
982
+ </fields>
983
+
984
+ </sms_message_one>
985
+ <sms_message_two translate="label">
986
+ <label>SMS Message 2</label>
987
+ <frontend_type>text</frontend_type>
988
+ <sort_order>20</sort_order>
989
+ <show_in_default>1</show_in_default>
990
+ <show_in_website>1</show_in_website>
991
+ <show_in_store>1</show_in_store>
992
+ <fields>
993
+ <enabled translate="label">
994
+ <label>Enabled</label>
995
+ <frontend_type>select</frontend_type>
996
+ <source_model>adminhtml/system_config_source_yesno</source_model>
997
+ <sort_order>10</sort_order>
998
+ <show_in_default>1</show_in_default>
999
+ <show_in_website>1</show_in_website>
1000
+ <show_in_store>1</show_in_store>
1001
+ </enabled>
1002
+ <order_status translate="label">
1003
+ <label>Order Status</label>
1004
+ <sort_order>20</sort_order>
1005
+ <frontend_type>select</frontend_type>
1006
+ <source_model>connector/system_config_source_orderstatus</source_model>
1007
+ <show_in_default>1</show_in_default>
1008
+ <show_in_website>1</show_in_website>
1009
+ <show_in_store>1</show_in_store>
1010
+ </order_status>
1011
+ <message translate="label">
1012
+ <label>Message</label>
1013
+ <frontend_type>textarea</frontend_type>
1014
+ <frontend_model>connector/adminhtml_system_config_smsmessagetwo</frontend_model>
1015
+ <sort_order>30</sort_order>
1016
+ <show_in_default>1</show_in_default>
1017
+ <show_in_website>1</show_in_website>
1018
+ <show_in_store>1</show_in_store>
1019
+ <validate>validate-length maximum-length-110</validate>
1020
+ </message>
1021
+ </fields>
1022
+
1023
+ </sms_message_two>
1024
+ <sms_message_three translate="label">
1025
+ <label>SMS Message 3</label>
1026
+ <frontend_type>text</frontend_type>
1027
+ <sort_order>30</sort_order>
1028
+ <show_in_default>1</show_in_default>
1029
+ <show_in_website>1</show_in_website>
1030
+ <show_in_store>1</show_in_store>
1031
+ <fields>
1032
+ <enabled translate="label">
1033
+ <label>Enabled</label>
1034
+ <frontend_type>select</frontend_type>
1035
+ <source_model>adminhtml/system_config_source_yesno</source_model>
1036
+ <sort_order>10</sort_order>
1037
+ <show_in_default>1</show_in_default>
1038
+ <show_in_website>1</show_in_website>
1039
+ <show_in_store>1</show_in_store>
1040
+ </enabled>
1041
+ <order_status translate="label">
1042
+ <label>Order Status</label>
1043
+ <sort_order>20</sort_order>
1044
+ <frontend_type>select</frontend_type>
1045
+ <source_model>connector/system_config_source_orderstatus</source_model>
1046
+ <show_in_default>1</show_in_default>
1047
+ <show_in_website>1</show_in_website>
1048
+ <show_in_store>1</show_in_store>
1049
+ </order_status>
1050
+ <message translate="label">
1051
+ <label>Message</label>
1052
+ <frontend_type>textarea</frontend_type>
1053
+ <frontend_model>connector/adminhtml_system_config_smsmessagethree</frontend_model>
1054
+ <sort_order>30</sort_order>
1055
+ <show_in_default>1</show_in_default>
1056
+ <show_in_website>1</show_in_website>
1057
+ <show_in_store>1</show_in_store>
1058
+ <validate>validate-length maximum-length-110</validate>
1059
+ </message>
1060
+ </fields>
1061
+ </sms_message_three>
1062
+ <sms_message_four translate="label">
1063
+ <label>SMS Message 4</label>
1064
+ <frontend_type>text</frontend_type>
1065
+ <sort_order>40</sort_order>
1066
+ <show_in_default>1</show_in_default>
1067
+ <show_in_website>1</show_in_website>
1068
+ <show_in_store>1</show_in_store>
1069
+ <fields>
1070
+ <enabled translate="label">
1071
+ <label>Enabled</label>
1072
+ <frontend_type>select</frontend_type>
1073
+ <source_model>adminhtml/system_config_source_yesno</source_model>
1074
+ <sort_order>10</sort_order>
1075
+ <show_in_default>1</show_in_default>
1076
+ <show_in_website>1</show_in_website>
1077
+ <show_in_store>1</show_in_store>
1078
+ </enabled>
1079
+ <order_status translate="label">
1080
+ <label>Order Status</label>
1081
+ <sort_order>20</sort_order>
1082
+ <frontend_type>select</frontend_type>
1083
+ <source_model>connector/system_config_source_orderstatus</source_model>
1084
+ <show_in_default>1</show_in_default>
1085
+ <show_in_website>1</show_in_website>
1086
+ <show_in_store>1</show_in_store>
1087
+ </order_status>
1088
+ <message translate="label">
1089
+ <label>Message</label>
1090
+ <frontend_type>textarea</frontend_type>
1091
+ <frontend_model>connector/adminhtml_system_config_smsmessagefour</frontend_model>
1092
+ <sort_order>30</sort_order>
1093
+ <show_in_default>1</show_in_default>
1094
+ <show_in_website>1</show_in_website>
1095
+ <show_in_store>1</show_in_store>
1096
+ <validate>validate-length maximum-length-110</validate>
1097
+ </message>
1098
+ </fields>
1099
+
1100
+ </sms_message_four>
1101
+ </groups>
1102
+ </sms_section>
1103
+ <dynamic_content translate="label">
1104
+ <label><![CDATA[Dynamic Content]]></label>
1105
+ <tab>connector</tab>
1106
+ <frontend_type>text</frontend_type>
1107
+ <sort_order>8000</sort_order>
1108
+ <show_in_default>1</show_in_default>
1109
+ <show_in_website>1</show_in_website>
1110
+ <show_in_store>0</show_in_store>
1111
+ <groups>
1112
+ <products translate="label">
1113
+ <label>Dynamic Products</label>
1114
+ <frontend_type>text</frontend_type>
1115
+ <sort_order>10</sort_order>
1116
+ <show_in_default>1</show_in_default>
1117
+ <show_in_website>1</show_in_website>
1118
+ <show_in_store>0</show_in_store>
1119
+ <expanded>1</expanded>
1120
+ <fields>
1121
+ <related translate="label">
1122
+ <label>Related Products</label>
1123
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1124
+ <sort_order>10</sort_order>
1125
+ <show_in_default>1</show_in_default>
1126
+ <show_in_website>1</show_in_website>
1127
+ <show_in_store>0</show_in_store>
1128
+ </related>
1129
+ <related_display_type translate="label">
1130
+ <label>Display Type</label>
1131
+ <frontend_type>select</frontend_type>
1132
+ <source_model>connector/system_config_source_displaytype</source_model>
1133
+ <sort_order>20</sort_order>
1134
+ <show_in_default>1</show_in_default>
1135
+ <show_in_website>1</show_in_website>
1136
+ <show_in_store>0</show_in_store>
1137
+ </related_display_type>
1138
+ <related_items_to_display translate="label">
1139
+ <label>Items To Display</label>
1140
+ <frontend_type>select</frontend_type>
1141
+ <source_model>connector/system_config_source_gridview</source_model>
1142
+ <sort_order>30</sort_order>
1143
+ <show_in_website>1</show_in_website>
1144
+ <show_in_default>1</show_in_default>
1145
+ <show_in_store>0</show_in_store>
1146
+ </related_items_to_display>
1147
+
1148
+ <upsell translate="label">
1149
+ <label>Up Sell Products</label>
1150
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1151
+ <sort_order>40</sort_order>
1152
+ <show_in_default>1</show_in_default>
1153
+ <show_in_website>1</show_in_website>
1154
+ <show_in_store>0</show_in_store>
1155
+ </upsell>
1156
+ <upsell_display_type translate="label">
1157
+ <label>Display Type</label>
1158
+ <frontend_type>select</frontend_type>
1159
+ <source_model>connector/system_config_source_displaytype</source_model>
1160
+ <sort_order>50</sort_order>
1161
+ <show_in_default>1</show_in_default>
1162
+ <show_in_website>1</show_in_website>
1163
+ <show_in_store>0</show_in_store>
1164
+ </upsell_display_type>
1165
+ <upsell_items_to_display translate="label">
1166
+ <label>Items To Display</label>
1167
+ <frontend_type>select</frontend_type>
1168
+ <source_model>connector/system_config_source_gridview</source_model>
1169
+ <sort_order>60</sort_order>
1170
+ <show_in_website>1</show_in_website>
1171
+ <show_in_default>1</show_in_default>
1172
+ <show_in_store>0</show_in_store>
1173
+ </upsell_items_to_display>
1174
+
1175
+ <crosssell translate="label">
1176
+ <label>Cross Sell Products</label>
1177
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1178
+ <sort_order>70</sort_order>
1179
+ <show_in_default>1</show_in_default>
1180
+ <show_in_website>1</show_in_website>
1181
+ <show_in_store>0</show_in_store>
1182
+ </crosssell>
1183
+ <crosssell_display_type translate="label">
1184
+ <label>Display Type</label>
1185
+ <frontend_type>select</frontend_type>
1186
+ <source_model>connector/system_config_source_displaytype</source_model>
1187
+ <sort_order>80</sort_order>
1188
+ <show_in_default>1</show_in_default>
1189
+ <show_in_website>1</show_in_website>
1190
+ <show_in_store>0</show_in_store>
1191
+ </crosssell_display_type>
1192
+ <crosssell_items_to_display translate="label">
1193
+ <label>Items To Display</label>
1194
+ <frontend_type>select</frontend_type>
1195
+ <source_model>connector/system_config_source_gridview</source_model>
1196
+ <sort_order>90</sort_order>
1197
+ <show_in_website>1</show_in_website>
1198
+ <show_in_default>1</show_in_default>
1199
+ <show_in_store>0</show_in_store>
1200
+ </crosssell_items_to_display>
1201
+
1202
+ <best translate="label">
1203
+ <label>Best Sellers</label>
1204
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1205
+ <sort_order>100</sort_order>
1206
+ <show_in_default>1</show_in_default>
1207
+ <show_in_website>1</show_in_website>
1208
+ <show_in_store>0</show_in_store>
1209
+ </best>
1210
+ <best_display_type translate="label">
1211
+ <label>Display Type</label>
1212
+ <frontend_type>select</frontend_type>
1213
+ <source_model>connector/system_config_source_displaytype</source_model>
1214
+ <sort_order>110</sort_order>
1215
+ <show_in_default>1</show_in_default>
1216
+ <show_in_website>1</show_in_website>
1217
+ <show_in_store>0</show_in_store>
1218
+ </best_display_type>
1219
+ <best_items_to_display translate="label">
1220
+ <label>Items To Display</label>
1221
+ <frontend_type>select</frontend_type>
1222
+ <source_model>connector/system_config_source_gridview</source_model>
1223
+ <sort_order>120</sort_order>
1224
+ <show_in_website>1</show_in_website>
1225
+ <show_in_default>1</show_in_default>
1226
+ <show_in_store>0</show_in_store>
1227
+ </best_items_to_display>
1228
+ <best_time_period translate="label">
1229
+ <label>Time Period</label>
1230
+ <frontend_type>select</frontend_type>
1231
+ <source_model>connector/system_config_source_timeperiod</source_model>
1232
+ <sort_order>130</sort_order>
1233
+ <show_in_default>1</show_in_default>
1234
+ <show_in_website>1</show_in_website>
1235
+ <show_in_store>0</show_in_store>
1236
+ </best_time_period>
1237
+
1238
+ <most_viewed translate="label">
1239
+ <label>Most Viewed</label>
1240
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1241
+ <sort_order>140</sort_order>
1242
+ <show_in_default>1</show_in_default>
1243
+ <show_in_website>1</show_in_website>
1244
+ <show_in_store>0</show_in_store>
1245
+ </most_viewed>
1246
+ <most_viewed_display_type translate="label">
1247
+ <label>Display Type</label>
1248
+ <frontend_type>select</frontend_type>
1249
+ <source_model>connector/system_config_source_displaytype</source_model>
1250
+ <sort_order>150</sort_order>
1251
+ <show_in_default>1</show_in_default>
1252
+ <show_in_website>1</show_in_website>
1253
+ <show_in_store>0</show_in_store>
1254
+ </most_viewed_display_type>
1255
+ <most_viewed_items_to_display translate="label">
1256
+ <label>Items To Display</label>
1257
+ <frontend_type>select</frontend_type>
1258
+ <source_model>connector/system_config_source_gridview</source_model>
1259
+ <sort_order>160</sort_order>
1260
+ <show_in_website>1</show_in_website>
1261
+ <show_in_default>1</show_in_default>
1262
+ <show_in_store>0</show_in_store>
1263
+ </most_viewed_items_to_display>
1264
+ <most_viewed_time_period translate="label">
1265
+ <label>Time Period</label>
1266
+ <frontend_type>select</frontend_type>
1267
+ <source_model>connector/system_config_source_timeperiod</source_model>
1268
+ <sort_order>170</sort_order>
1269
+ <show_in_default>1</show_in_default>
1270
+ <show_in_website>1</show_in_website>
1271
+ <show_in_store>0</show_in_store>
1272
+ </most_viewed_time_period>
1273
+
1274
+ <recently_viewed translate="label">
1275
+ <label>Recently Viewed</label>
1276
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1277
+ <sort_order>180</sort_order>
1278
+ <show_in_default>1</show_in_default>
1279
+ <show_in_website>1</show_in_website>
1280
+ <show_in_store>0</show_in_store>
1281
+ </recently_viewed>
1282
+ <recently_viewed_display_type translate="label">
1283
+ <label>Display Type</label>
1284
+ <frontend_type>select</frontend_type>
1285
+ <source_model>connector/system_config_source_displaytype</source_model>
1286
+ <sort_order>190</sort_order>
1287
+ <show_in_default>1</show_in_default>
1288
+ <show_in_website>1</show_in_website>
1289
+ <show_in_store>0</show_in_store>
1290
+ </recently_viewed_display_type>
1291
+ <recently_viewed_items_to_display translate="label">
1292
+ <label>items To Display</label>
1293
+ <frontend_type>select</frontend_type>
1294
+ <source_model>connector/system_config_source_gridview</source_model>
1295
+ <sort_order>200</sort_order>
1296
+ <show_in_default>1</show_in_default>
1297
+ <show_in_website>1</show_in_website>
1298
+ <show_in_store>0</show_in_store>
1299
+ </recently_viewed_items_to_display>
1300
+
1301
+ <validator>
1302
+ <label></label>
1303
+ <frontend_type>hidden</frontend_type>
1304
+ <frontend_model>connector/adminhtml_system_config_gridlist</frontend_model>
1305
+ <sort_order>210</sort_order>
1306
+ <show_in_default>1</show_in_default>
1307
+ <show_in_website>1</show_in_website>
1308
+ <show_in_store>0</show_in_store>
1309
+ <can_be_empty>1</can_be_empty>
1310
+ </validator>
1311
+ </fields>
1312
+
1313
+ </products>
1314
+ <manual_product_search translate="label">
1315
+ <label>Manual Product Push</label>
1316
+ <frontend_type>text</frontend_type>
1317
+ <sort_order>20</sort_order>
1318
+ <show_in_default>1</show_in_default>
1319
+ <show_in_website>1</show_in_website>
1320
+ <show_in_store>0</show_in_store>
1321
+ <expanded>1</expanded>
1322
+ <fields>
1323
+ <settings tranlate="label">
1324
+ <label>Settings</label>
1325
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1326
+ <sort_order>10</sort_order>
1327
+ <show_in_default>1</show_in_default>
1328
+ <show_in_website>1</show_in_website>
1329
+ <show_in_store>0</show_in_store>
1330
+ </settings>
1331
+ <display_type translate="label">
1332
+ <label>Display Type</label>
1333
+ <frontend_type>select</frontend_type>
1334
+ <source_model>connector/system_config_source_displaytype</source_model>
1335
+ <sort_order>50</sort_order>
1336
+ <show_in_default>1</show_in_default>
1337
+ <show_in_website>1</show_in_website>
1338
+ <show_in_store>0</show_in_store>
1339
+ </display_type>
1340
+ <items_to_display translate="label">
1341
+ <label>Items To Display</label>
1342
+ <frontend_type>select</frontend_type>
1343
+ <source_model>connector/system_config_source_gridview</source_model>
1344
+ <sort_order>60</sort_order>
1345
+ <show_in_website>1</show_in_website>
1346
+ <show_in_default>1</show_in_default>
1347
+ <show_in_store>0</show_in_store>
1348
+ </items_to_display>
1349
+ <products_push translate="label">
1350
+ <label>Products</label>
1351
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1352
+ <sort_order>80</sort_order>
1353
+ <show_in_default>1</show_in_default>
1354
+ <show_in_website>1</show_in_website>
1355
+ <show_in_store>0</show_in_store>
1356
+ </products_push>
1357
+ <products_push_items translate="label">
1358
+ <label>Products</label>
1359
+ <frontend_type>text</frontend_type>
1360
+ <sort_order>90</sort_order>
1361
+ <show_in_default>1</show_in_default>
1362
+ <show_in_website>1</show_in_website>
1363
+ <show_in_store>0</show_in_store>
1364
+ <comment><![CDATA[Comma Separated Product Id's]]></comment>
1365
+ </products_push_items>
1366
+ </fields>
1367
+ </manual_product_search>
1368
+ <fallback_products translate="label">
1369
+ <label>Fallback Products</label>
1370
+ <frontend_type>text</frontend_type>
1371
+ <sort_order>30</sort_order>
1372
+ <show_in_default>1</show_in_default>
1373
+ <show_in_website>1</show_in_website>
1374
+ <show_in_store>0</show_in_store>
1375
+ <fields>
1376
+ <product_list translate="label">
1377
+ <label>Products</label>
1378
+ <frontend_type>text</frontend_type>
1379
+ <sort_order>10</sort_order>
1380
+ <show_in_default>1</show_in_default>
1381
+ <show_in_website>1</show_in_website>
1382
+ <show_in_store>0</show_in_store>
1383
+ <comment><![CDATA[Comma Separated Product Id's]]></comment>
1384
+ </product_list>
1385
+ </fields>
1386
+ </fallback_products>
1387
+ </groups>
1388
+ </dynamic_content>
1389
+ <connector_advanced_settings translate="label">
1390
+ <label><![CDATA[Advanced Settings]]></label>
1391
+ <tab>connector</tab>
1392
+ <frontend_type>text</frontend_type>
1393
+ <sort_order>9000</sort_order>
1394
+ <show_in_default>1</show_in_default>
1395
+ <show_in_website>1</show_in_website>
1396
+ <show_in_store>1</show_in_store>
1397
+ <groups>
1398
+ <sync_limits>
1399
+ <label>Transactional Sync Limit</label>
1400
+ <frontend_type>text</frontend_type>
1401
+ <sort_order>10</sort_order>
1402
+ <show_in_default>1</show_in_default>
1403
+ <show_in_website>1</show_in_website>
1404
+ <show_in_store>0</show_in_store>
1405
+ <fields>
1406
+ <orders translate="label">
1407
+ <label>Historical import limit</label>
1408
+ <frontend_type>select</frontend_type>
1409
+ <source_model>connector/system_config_source_orderlimit</source_model>
1410
+ <sort_order>40</sort_order>
1411
+ <show_in_default>1</show_in_default>
1412
+ <show_in_website>1</show_in_website>
1413
+ <show_in_store>0</show_in_store>
1414
+ </orders>
1415
+ </fields>
1416
+ </sync_limits>
1417
+ <external translate="label">
1418
+ <label><![CDATA[External Dynamic Content]]></label>
1419
+ <frontend_type>text</frontend_type>
1420
+ <sort_order>20</sort_order>
1421
+ <show_in_default>1</show_in_default>
1422
+ <show_in_website>1</show_in_website>
1423
+ <show_in_store>0</show_in_store>
1424
+ <fields>
1425
+ <passcode translate="label">
1426
+ <label>Passcode</label>
1427
+ <frontend_type>text</frontend_type>
1428
+ <sort_order>10</sort_order>
1429
+ <show_in_default>1</show_in_default>
1430
+ <show_in_website>1</show_in_website>
1431
+ <show_in_store>0</show_in_store>
1432
+ <comment><![CDATA[Recommended: Set a passcode so that basket contents and coupon codes can only be viewed if the following passcode is sent with the request.]]></comment>
1433
+ </passcode>
1434
+ <lost_basket_title translate="label">
1435
+ <label>Lost Baskets</label>
1436
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1437
+ <sort_order>20</sort_order>
1438
+ <show_in_default>1</show_in_default>
1439
+ <show_in_website>1</show_in_website>
1440
+ <show_in_store>0</show_in_store>
1441
+ </lost_basket_title>
1442
+
1443
+ <lost_basket_url translate="label">
1444
+ <label>Baskets Content URL</label>
1445
+ <frontend_type>label</frontend_type>
1446
+ <frontend_model>connector/adminhtml_system_lostbasket</frontend_model>
1447
+ <sort_order>30</sort_order>
1448
+ <show_in_default>1</show_in_default>
1449
+ <show_in_website>1</show_in_website>
1450
+ <show_in_store>0</show_in_store>
1451
+ </lost_basket_url>
1452
+ <coupon_code_title title="label">
1453
+ <label>Coupon Codes</label>
1454
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1455
+ <sort_order>40</sort_order>
1456
+ <show_in_website>1</show_in_website>
1457
+ <show_in_default>1</show_in_default>
1458
+ <show_in_store>0</show_in_store>
1459
+ </coupon_code_title>
1460
+ <coupon_code_url translate="label">
1461
+ <label>Coupon Codes URL</label>
1462
+ <frontend_type>label</frontend_type>
1463
+ <frontend_model>connector/adminhtml_system_couponinfo</frontend_model>
1464
+ <sort_order>50</sort_order>
1465
+ <show_in_default>1</show_in_default>
1466
+ <show_in_website>1</show_in_website>
1467
+ <show_in_store>0</show_in_store>
1468
+ </coupon_code_url>
1469
+
1470
+ <dynamic_content_url translate="label">
1471
+ <label>Dynamic Content</label>
1472
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1473
+ <sort_order>60</sort_order>
1474
+ <show_in_default>1</show_in_default>
1475
+ <show_in_website>1</show_in_website>
1476
+ <show_in_store>0</show_in_store>
1477
+ </dynamic_content_url>
1478
+ <related_products_url translate="label">
1479
+ <label>Related Products URL</label>
1480
+ <frontend_type>label</frontend_type>
1481
+ <frontend_model>connector/adminhtml_system_related</frontend_model>
1482
+ <sort_order>70</sort_order>
1483
+ <show_in_default>1</show_in_default>
1484
+ <show_in_website>1</show_in_website>
1485
+ <show_in_store>0</show_in_store>
1486
+ </related_products_url>
1487
+ <upsell_products_url translate="label">
1488
+ <label>Up Sell Products URL</label>
1489
+ <frontend_type>label</frontend_type>
1490
+ <frontend_model>connector/adminhtml_system_upsell</frontend_model>
1491
+ <sort_order>80</sort_order>
1492
+ <show_in_default>1</show_in_default>
1493
+ <show_in_website>1</show_in_website>
1494
+ <show_in_store>0</show_in_store>
1495
+ </upsell_products_url>
1496
+ <crosssell_products_url translate="label">
1497
+ <label>Cross Sell Products URL</label>
1498
+ <frontend_type>label</frontend_type>
1499
+ <frontend_model>connector/adminhtml_system_crosssell</frontend_model>
1500
+ <sort_order>90</sort_order>
1501
+ <show_in_default>1</show_in_default>
1502
+ <show_in_website>1</show_in_website>
1503
+ <show_in_store>0</show_in_store>
1504
+ </crosssell_products_url>
1505
+
1506
+ <best_sellers_url translate="label">
1507
+ <label>Best Sellers URL</label>
1508
+ <frontend_type>label</frontend_type>
1509
+ <frontend_model>connector/adminhtml_system_bestsellers</frontend_model>
1510
+ <sort_order>100</sort_order>
1511
+ <show_in_default>1</show_in_default>
1512
+ <show_in_website>1</show_in_website>
1513
+ <show_in_store>0</show_in_store>
1514
+ </best_sellers_url>
1515
+ <most_viewed_url translate="label">
1516
+ <label>Most Viewed URL</label>
1517
+ <frontend_type>label</frontend_type>
1518
+ <frontend_model>connector/adminhtml_system_mostviewed</frontend_model>
1519
+ <sort_order>110</sort_order>
1520
+ <show_in_default>1</show_in_default>
1521
+ <show_in_website>1</show_in_website>
1522
+ <show_in_store>0</show_in_store>
1523
+ </most_viewed_url>
1524
+ <product_push_url translate="label">
1525
+ <label>Product Push URL</label>
1526
+ <frontend_type>label</frontend_type>
1527
+ <frontend_model>connector/adminhtml_system_productpush</frontend_model>
1528
+ <sort_order>120</sort_order>
1529
+ <show_in_default>1</show_in_default>
1530
+ <show_in_website>1</show_in_website>
1531
+ <show_in_store>0</show_in_store>
1532
+ </product_push_url>
1533
+ <recently_viewed_url translate="label">
1534
+ <label>Recently Viewed</label>
1535
+ <frontend_type>label</frontend_type>
1536
+ <frontend_model>connector/adminhtml_system_recentlyviewed</frontend_model>
1537
+ <sort_order>130</sort_order>
1538
+ <show_in_default>1</show_in_default>
1539
+ <show_in_website>1</show_in_website>
1540
+ <show_in_store>0</show_in_store>
1541
+ </recently_viewed_url>
1542
+ </fields>
1543
+ </external>
1544
+ <admin translate="label">
1545
+ <label>Admin</label>
1546
+ <frontend_type>text</frontend_type>
1547
+ <sort_order>30</sort_order>
1548
+ <show_in_default>1</show_in_default>
1549
+ <show_in_default>1</show_in_default>
1550
+ <show_in_store>0</show_in_store>
1551
+ <fields>
1552
+ <admin_title translate="label">
1553
+ <label>Contacts ID's</label>
1554
+ <frontend_model>adminhtml/system_config_form_field_heading</frontend_model>
1555
+ <sort_order>10</sort_order>
1556
+ <show_in_default>1</show_in_default>
1557
+ <show_in_website>1</show_in_website>
1558
+ <show_in_store>0</show_in_store>
1559
+ </admin_title>
1560
+ <count_customers translate="label">
1561
+ <label>Count Customers with ID</label>
1562
+ <frontend_model>connector/debug_countcontacts</frontend_model>
1563
+ <sort_order>20</sort_order>
1564
+ <show_in_default>1</show_in_default>
1565
+ <show_in_website>1</show_in_website>
1566
+ <show_in_store>0</show_in_store>
1567
+ </count_customers>
1568
+ <delete_contact translate="label">
1569
+ <label>Delete All Contact ID's</label>
1570
+ <frontend_model>connector/debug_deletecontacts</frontend_model>
1571
+ <sort_order>30</sort_order>
1572
+ <show_in_default>1</show_in_default>
1573
+ <show_in_website>1</show_in_website>
1574
+ <show_in_store>0</show_in_store>
1575
+ </delete_contact>
1576
+ <memory_limit translate="label">
1577
+ <label>Memory Limit</label>
1578
+ <frontend_type>select</frontend_type>
1579
+ <source_model>adminhtml/system_config_source_yesno</source_model>
1580
+ <show_in_default>1</show_in_default>
1581
+ <show_in_website>0</show_in_website>
1582
+ <show_in_store>0</show_in_store>
1583
+ <sort_order>40</sort_order>
1584
+ <comment>Set to NO to use system default memory.</comment>
1585
+ </memory_limit>
1586
+ <batch_size translate="label">
1587
+ <label>Customer Sync Batch Size</label>
1588
+ <frontend_type>text</frontend_type>
1589
+ <show_in_default>1</show_in_default>
1590
+ <show_in_website>1</show_in_website>
1591
+ <show_in_store>0</show_in_store>
1592
+ <sort_order>50</sort_order>
1593
+ <comment>Set the limit size for customers loaded in memory.</comment>
1594
+ </batch_size>
1595
+ <debug translate="label">
1596
+ <label>Debug Mode</label>
1597
+ <frontend_type>select</frontend_type>
1598
+ <source_model>adminhtml/system_config_source_yesno</source_model>
1599
+ <sort_order>50</sort_order>
1600
+ <show_in_default>1</show_in_default>
1601
+ <show_in_website>1</show_in_website>
1602
+ <show_in_store>1</show_in_store>
1603
+ <comment>Set to YES to allow creating log files</comment>
1604
+ </debug>
1605
+ </fields>
1606
+ </admin>
1607
+ </groups>
1608
+ </connector_advanced_settings>
1609
+ </sections>
1610
+ </config>
app/code/local/Dotdigitalgroup/Email/sql/connector_setup/mysql4-install-0.1.0.php ADDED
@@ -0,0 +1,53 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * mag17.
4
+ *
5
+ * User: chrisroseuk
6
+ * Date: 30/04/2013
7
+ * Time: 14:17
8
+ *
9
+ */
10
+
11
+ $installer = $this;
12
+ $installer->startSetup();
13
+
14
+ $setup = new Mage_Eav_Model_Entity_Setup('core_setup');
15
+
16
+ $entityTypeId = $setup->getEntityTypeId('customer');
17
+ $attributeSetId = $setup->getDefaultAttributeSetId($entityTypeId);
18
+ $attributeGroupId = $setup->getDefaultAttributeGroupId($entityTypeId, $attributeSetId);
19
+
20
+ $setup->addAttribute('customer', 'dotmailer_contact_id', array(
21
+ 'input' => 'text',
22
+ 'type' => 'int',
23
+ 'label' => 'Connector Contact ID',
24
+ 'visible' => 1,
25
+ 'required' => 0,
26
+ 'user_defined' => 0,
27
+ ));
28
+
29
+ $setup->addAttributeToGroup(
30
+ $entityTypeId,
31
+ $attributeSetId,
32
+ $attributeGroupId,
33
+ 'dotmailer_contact_id',
34
+ '999' //sort_order
35
+ );
36
+
37
+ $oAttribute = Mage::getSingleton('eav/config')->getAttribute('customer', 'dotmailer_contact_id');
38
+ $oAttribute->setData('used_in_forms', array('adminhtml_customer'));
39
+ $oAttribute->save();
40
+
41
+ $adminData = array();
42
+ $adminData[] = array(
43
+ 'severity' => 4,
44
+ 'date_added' => gmdate('Y-m-d H:i:s', time()),
45
+ 'title' => 'Email Connector was installed. Remmenber to enable cronjob to make it working.',
46
+ 'description' => 'Connector synchronization is based on the cronjob please make sure this is setup before running through configuration.',
47
+ 'url' => ''
48
+ );
49
+
50
+ Mage::getModel('adminnotification/inbox')->parse($adminData);
51
+
52
+
53
+ $setup->endSetup();
app/code/local/Dotdigitalgroup/Email/sql/connector_setup/mysql4-upgrade-1.1.1-1.1.2.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $installer = $this;
4
+ $installer->startSetup();
5
+
6
+
7
+ $installer->addAttribute("order", "dotmailer_order_imported", array("type"=>"int"));
8
+
9
+ $installer->endSetup();
app/code/local/Varien/Data/Collection.php ADDED
@@ -0,0 +1,818 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Open Software License (OSL 3.0)
8
+ * that is bundled with this package in the file LICENSE.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/osl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category Varien
22
+ * @package Varien_Data
23
+ * @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
24
+ * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
+ */
26
+
27
+ /**
28
+ * Data collection
29
+ *
30
+ * @category Varien
31
+ * @package Varien_Data
32
+ * @author Magento Core Team <core@magentocommerce.com>
33
+ */
34
+ class Varien_Data_Collection implements IteratorAggregate, Countable
35
+ {
36
+ const SORT_ORDER_ASC = 'ASC';
37
+ const SORT_ORDER_DESC = 'DESC';
38
+
39
+ /**
40
+ * Collection items
41
+ *
42
+ * @var array
43
+ */
44
+ protected $_items = array();
45
+
46
+ /**
47
+ * Item object class name
48
+ *
49
+ * @var string
50
+ */
51
+ protected $_itemObjectClass = 'Varien_Object';
52
+
53
+ /**
54
+ * Order configuration
55
+ *
56
+ * @var array
57
+ */
58
+ protected $_orders = array();
59
+
60
+ /**
61
+ * Filters configuration
62
+ *
63
+ * @var array
64
+ */
65
+ protected $_filters = array();
66
+
67
+ /**
68
+ * Filter rendered flag
69
+ *
70
+ * @var bool
71
+ */
72
+ protected $_isFiltersRendered = false;
73
+
74
+ /**
75
+ * Current page number for items pager
76
+ *
77
+ * @var int
78
+ */
79
+ protected $_curPage = 1;
80
+
81
+ /**
82
+ * Pager page size
83
+ *
84
+ * if page size is false, then we works with all items
85
+ *
86
+ * @var int | false
87
+ */
88
+ protected $_pageSize = false;
89
+
90
+ /**
91
+ * Total items number
92
+ *
93
+ * @var int
94
+ */
95
+ protected $_totalRecords;
96
+
97
+ /**
98
+ * Loading state flag
99
+ *
100
+ * @var bool
101
+ */
102
+ protected $_isCollectionLoaded;
103
+
104
+ protected $_cacheKey;
105
+
106
+ protected $_cacheTags = array();
107
+
108
+ protected $_cacheLifetime = 86400;
109
+
110
+ /**
111
+ * Additional collection flags
112
+ *
113
+ * @var array
114
+ */
115
+ protected $_flags = array();
116
+
117
+ public function __construct()
118
+ {
119
+
120
+ }
121
+
122
+ /**
123
+ * Add collection filter
124
+ *
125
+ * @param string $field
126
+ * @param string $value
127
+ * @param string $type and|or|string
128
+ */
129
+ public function addFilter($field, $value, $type = 'and')
130
+ {
131
+ $filter = new Varien_Object(); // implements ArrayAccess
132
+ $filter['field'] = $field;
133
+ $filter['value'] = $value;
134
+ $filter['type'] = strtolower($type);
135
+
136
+ $this->_filters[] = $filter;
137
+ $this->_isFiltersRendered = false;
138
+ return $this;
139
+ }
140
+
141
+ /**
142
+ * Search for a filter by specified field
143
+ *
144
+ * Multiple filters can be matched if an array is specified:
145
+ * - 'foo' -- get the first filter with field name 'foo'
146
+ * - array('foo') -- get all filters with field name 'foo'
147
+ * - array('foo', 'bar') -- get all filters with field name 'foo' or 'bar'
148
+ * - array() -- get all filters
149
+ *
150
+ * @param string|array $field
151
+ * @return Varien_Object|array|null
152
+ */
153
+ public function getFilter($field)
154
+ {
155
+ if (is_array($field)) {
156
+ // empty array: get all filters
157
+ if (empty($field)) {
158
+ return $this->_filters;
159
+ }
160
+ // non-empty array: collect all filters that match specified field names
161
+ $result = array();
162
+ foreach ($this->_filters as $filter) {
163
+ if (in_array($filter['field'], $field)) {
164
+ $result[] = $filter;
165
+ }
166
+ }
167
+ return $result;
168
+ }
169
+
170
+ // get a first filter by specified name
171
+ foreach ($this->_filters as $filter) {
172
+ if ($filter['field'] === $field) {
173
+ return $filter;
174
+ }
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Retrieve collection loading status
180
+ *
181
+ * @return bool
182
+ */
183
+ public function isLoaded()
184
+ {
185
+ return $this->_isCollectionLoaded;
186
+ }
187
+
188
+ /**
189
+ * Set collection loading status flag
190
+ *
191
+ * @param unknown_type $flag
192
+ * @return unknown
193
+ */
194
+ protected function _setIsLoaded($flag = true)
195
+ {
196
+ $this->_isCollectionLoaded = $flag;
197
+ return $this;
198
+ }
199
+
200
+ /**
201
+ * Get current collection page
202
+ *
203
+ * @param int $displacement
204
+ * @return int
205
+ */
206
+ public function getCurPage($displacement = 0)
207
+ {
208
+ if ($this->_curPage + $displacement < 1) {
209
+ return 1;
210
+ }
211
+ elseif ($this->_curPage + $displacement > $this->getLastPageNumber()) {
212
+ return $this->getLastPageNumber();
213
+ } else {
214
+ return $this->_curPage + $displacement;
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Retrieve collection last page number
220
+ *
221
+ * @return int
222
+ */
223
+ public function getLastPageNumber()
224
+ {
225
+ $collectionSize = (int) $this->getSize();
226
+ if (0 === $collectionSize) {
227
+ return 1;
228
+ }
229
+ elseif($this->_pageSize) {
230
+ return ceil($collectionSize/$this->_pageSize);
231
+ }
232
+ else{
233
+ return 1;
234
+ }
235
+ }
236
+
237
+ /**
238
+ * Retrieve collection page size
239
+ *
240
+ * @return int
241
+ */
242
+ public function getPageSize()
243
+ {
244
+ return $this->_pageSize;
245
+ }
246
+
247
+ /**
248
+ * Retrieve collection all items count
249
+ *
250
+ * @return int
251
+ */
252
+ public function getSize()
253
+ {
254
+ $this->load();
255
+ if (is_null($this->_totalRecords)) {
256
+ $this->_totalRecords = count($this->getItems());
257
+ }
258
+ return intval($this->_totalRecords);
259
+ }
260
+
261
+ /**
262
+ * Retrieve collection first item
263
+ *
264
+ * @return Varien_Object
265
+ */
266
+ public function getFirstItem()
267
+ {
268
+ $this->load();
269
+
270
+ if (count($this->_items)) {
271
+ reset($this->_items);
272
+ return current($this->_items);
273
+ }
274
+
275
+ return new $this->_itemObjectClass();
276
+ }
277
+
278
+ /**
279
+ * Retrieve collection last item
280
+ *
281
+ * @return Varien_Object
282
+ */
283
+ public function getLastItem()
284
+ {
285
+ $this->load();
286
+
287
+ if (count($this->_items)) {
288
+ return end($this->_items);
289
+ }
290
+
291
+ return new $this->_itemObjectClass();
292
+ }
293
+
294
+ /**
295
+ * Retrieve collection items
296
+ *
297
+ * @return array
298
+ */
299
+ public function getItems()
300
+ {
301
+ $this->load();
302
+ return $this->_items;
303
+ }
304
+
305
+ /**
306
+ * Retrieve field values from all items
307
+ *
308
+ * @param string $colName
309
+ * @return array
310
+ */
311
+ public function getColumnValues($colName)
312
+ {
313
+ $this->load();
314
+
315
+ $col = array();
316
+ foreach ($this->getItems() as $item) {
317
+ $col[] = $item->getData($colName);
318
+ }
319
+ return $col;
320
+ }
321
+
322
+ /**
323
+ * Search all items by field value
324
+ *
325
+ * @param string $column
326
+ * @param mixed $value
327
+ * @return array
328
+ */
329
+ public function getItemsByColumnValue($column, $value)
330
+ {
331
+ $this->load();
332
+
333
+ $res = array();
334
+ foreach ($this as $item) {
335
+ if ($item->getData($column)==$value) {
336
+ $res[] = $item;
337
+ }
338
+ }
339
+ return $res;
340
+ }
341
+
342
+ /**
343
+ * Search first item by field value
344
+ *
345
+ * @param string $column
346
+ * @param mixed $value
347
+ * @return Varien_Object || null
348
+ */
349
+ public function getItemByColumnValue($column, $value)
350
+ {
351
+ $this->load();
352
+
353
+ foreach ($this as $item) {
354
+ if ($item->getData($column)==$value) {
355
+ return $item;
356
+ }
357
+ }
358
+ return null;
359
+ }
360
+
361
+ /**
362
+ * Adding item to item array
363
+ *
364
+ * @param Varien_Object $item
365
+ * @return Varien_Data_Collection
366
+ */
367
+ public function addItem(Varien_Object $item)
368
+ {
369
+ $itemId = $this->_getItemId($item);
370
+
371
+ if (!is_null($itemId)) {
372
+ if (isset($this->_items[$itemId])) {
373
+ //throw new Exception('Item ('.get_class($item).') with the same id "'.$item->getId().'" already exist');
374
+ }
375
+ $this->_items[$itemId] = $item;
376
+ } else {
377
+ $this->_addItem($item);
378
+ }
379
+ return $this;
380
+ }
381
+
382
+ /**
383
+ * Add item that has no id to collection
384
+ *
385
+ * @param Varien_Object $item
386
+ * @return Varien_Data_Collection
387
+ */
388
+ protected function _addItem($item)
389
+ {
390
+ $this->_items[] = $item;
391
+ return $this;
392
+ }
393
+
394
+ /**
395
+ * Retrieve item id
396
+ *
397
+ * @param Varien_Object $item
398
+ * @return mixed
399
+ */
400
+ protected function _getItemId(Varien_Object $item)
401
+ {
402
+ return $item->getId();
403
+ }
404
+
405
+ /**
406
+ * Retrieve ids of all tems
407
+ *
408
+ * @return array
409
+ */
410
+ public function getAllIds()
411
+ {
412
+ $ids = array();
413
+ foreach ($this->getItems() as $item) {
414
+ $ids[] = $this->_getItemId($item);
415
+ }
416
+ return $ids;
417
+ }
418
+
419
+ /**
420
+ * Remove item from collection by item key
421
+ *
422
+ * @param mixed $key
423
+ * @return Varien_Data_Collection
424
+ */
425
+ public function removeItemByKey($key)
426
+ {
427
+ if (isset($this->_items[$key])) {
428
+ unset($this->_items[$key]);
429
+ }
430
+ return $this;
431
+ }
432
+
433
+ /**
434
+ * Clear collection
435
+ *
436
+ * @return Varien_Data_Collection
437
+ */
438
+ public function clear()
439
+ {
440
+ $this->_setIsLoaded(false);
441
+ $this->_items = array();
442
+ return $this;
443
+ }
444
+
445
+ /**
446
+ * Walk through the collection and run model method or external callback
447
+ * with optional arguments
448
+ *
449
+ * Returns array with results of callback for each item
450
+ *
451
+ * @param string $method
452
+ * @param array $args
453
+ * @return array
454
+ */
455
+ public function walk($callback, array $args=array())
456
+ {
457
+ $results = array();
458
+ $useItemCallback = is_string($callback) && strpos($callback, '::')===false;
459
+ foreach ($this->getItems() as $id=>$item) {
460
+ if ($useItemCallback) {
461
+ $cb = array($item, $callback);
462
+ } else {
463
+ $cb = $callback;
464
+ array_unshift($args, $item);
465
+ }
466
+ $results[$id] = call_user_func_array($cb, $args);
467
+ }
468
+ return $results;
469
+ }
470
+
471
+ public function each($obj_method, $args=array())
472
+ {
473
+ foreach ($args->_items as $k => $item) {
474
+ $args->_items[$k] = call_user_func($obj_method, $item);
475
+ }
476
+ }
477
+
478
+ /**
479
+ * Setting data for all collection items
480
+ *
481
+ * @param mixed $key
482
+ * @param mixed $value
483
+ * @return Varien_Data_Collection
484
+ */
485
+ public function setDataToAll($key, $value=null)
486
+ {
487
+ if (is_array($key)) {
488
+ foreach ($key as $k=>$v) {
489
+ $this->setDataToAll($k, $v);
490
+ }
491
+ return $this;
492
+ }
493
+ foreach ($this->getItems() as $item) {
494
+ $item->setData($key, $value);
495
+ }
496
+ return $this;
497
+ }
498
+
499
+ /**
500
+ * Set current page
501
+ *
502
+ * @param int $page
503
+ * @return Varien_Data_Collection
504
+ */
505
+ public function setCurPage($page)
506
+ {
507
+ $this->_curPage = $page;
508
+ return $this;
509
+ }
510
+
511
+ /**
512
+ * Set collection page size
513
+ *
514
+ * @param int $size
515
+ * @return Varien_Data_Collection
516
+ */
517
+ public function setPageSize($size)
518
+ {
519
+ $this->_pageSize = $size;
520
+ return $this;
521
+ }
522
+
523
+ /**
524
+ * Set select order
525
+ *
526
+ * @param string $field
527
+ * @param string $direction
528
+ * @return Varien_Data_Collection
529
+ */
530
+ public function setOrder($field, $direction = self::SORT_ORDER_DESC)
531
+ {
532
+ $this->_orders[$field] = $direction;
533
+ return $this;
534
+ }
535
+
536
+ /**
537
+ * Set collection item class name
538
+ *
539
+ * @param string $className
540
+ * @return Varien_Data_Collection
541
+ */
542
+ function setItemObjectClass($className)
543
+ {
544
+ $className = Mage::getConfig()->getModelClassName($className);
545
+ /**
546
+ * is_subclass_of($className, 'Varien_Object') - Segmentation fault in php 5.2.3
547
+ */
548
+ /*if (!is_subclass_of($className, 'Varien_Object')) {
549
+ throw new Exception($className.' does not extends from Varien_Object');
550
+ }*/
551
+ $this->_itemObjectClass = $className;
552
+ return $this;
553
+ }
554
+
555
+ /**
556
+ * Retrieve collection empty item
557
+ *
558
+ * @return Varien_Object
559
+ */
560
+ public function getNewEmptyItem()
561
+ {
562
+ return new $this->_itemObjectClass();
563
+ }
564
+
565
+ /**
566
+ * Render sql select conditions
567
+ *
568
+ * @return Varien_Data_Collection
569
+ */
570
+ protected function _renderFilters()
571
+ {
572
+ return $this;
573
+ }
574
+
575
+ /**
576
+ * Render sql select orders
577
+ *
578
+ * @return Varien_Data_Collection
579
+ */
580
+ protected function _renderOrders()
581
+ {
582
+ return $this;
583
+ }
584
+
585
+ /**
586
+ * Render sql select limit
587
+ *
588
+ * @return Varien_Data_Collection
589
+ */
590
+ protected function _renderLimit()
591
+ {
592
+ return $this;
593
+ }
594
+
595
+ /**
596
+ * Set select distinct
597
+ *
598
+ * @param bool $flag
599
+ */
600
+ public function distinct($flag)
601
+ {
602
+ return $this;
603
+ }
604
+
605
+ /**
606
+ * Load data
607
+ *
608
+ * @return Varien_Data_Collection
609
+ */
610
+ public function loadData($printQuery = false, $logQuery = false)
611
+ {
612
+ return $this;
613
+ }
614
+
615
+ /**
616
+ * Load data
617
+ *
618
+ * @return Varien_Data_Collection
619
+ */
620
+ public function load($printQuery = false, $logQuery = false)
621
+ {
622
+ return $this->loadData($printQuery, $logQuery);
623
+ }
624
+
625
+ /**
626
+ * Convert collection to XML
627
+ *
628
+ * @return string
629
+ */
630
+ public function toXml()
631
+ {
632
+ $xml = '<?xml version="1.0" encoding="UTF-8"?>
633
+ <collection>
634
+ <totalRecords>'.$this->_totalRecords.'</totalRecords>
635
+ <items>';
636
+
637
+ foreach ($this as $item) {
638
+ $xml.=$item->toXml();
639
+ }
640
+ $xml.= '</items>
641
+ </collection>';
642
+ return $xml;
643
+ }
644
+
645
+ /**
646
+ * Convert collection to array
647
+ *
648
+ * @return array
649
+ */
650
+ public function toArray($arrRequiredFields = array())
651
+ {
652
+ $arrItems = array();
653
+ $arrItems['totalRecords'] = $this->getSize();
654
+
655
+ $arrItems['items'] = array();
656
+ foreach ($this as $item) {
657
+ $arrItems['items'][] = $item->toArray($arrRequiredFields);
658
+ }
659
+ return $arrItems;
660
+ }
661
+
662
+ /**
663
+ * Convert items array to array for select options
664
+ *
665
+ * return items array
666
+ * array(
667
+ * $index => array(
668
+ * 'value' => mixed
669
+ * 'label' => mixed
670
+ * )
671
+ * )
672
+ *
673
+ * @param string $valueField
674
+ * @param string $labelField
675
+ * @return array
676
+ */
677
+ protected function _toOptionArray($valueField='id', $labelField='name', $additional=array())
678
+ {
679
+ $res = array();
680
+ $additional['value'] = $valueField;
681
+ $additional['label'] = $labelField;
682
+
683
+ foreach ($this as $item) {
684
+ foreach ($additional as $code => $field) {
685
+ $data[$code] = $item->getData($field);
686
+ }
687
+ $res[] = $data;
688
+ }
689
+ return $res;
690
+ }
691
+
692
+ public function toOptionArray()
693
+ {
694
+ return $this->_toOptionArray();
695
+ }
696
+
697
+ public function toOptionHash()
698
+ {
699
+ return $this->_toOptionHash();
700
+ }
701
+
702
+ /**
703
+ * Convert items array to hash for select options
704
+ *
705
+ * return items hash
706
+ * array($value => $label)
707
+ *
708
+ * @param string $valueField
709
+ * @param string $labelField
710
+ * @return array
711
+ */
712
+ protected function _toOptionHash($valueField='id', $labelField='name')
713
+ {
714
+ $res = array();
715
+ foreach ($this as $item) {
716
+ $res[$item->getData($valueField)] = $item->getData($labelField);
717
+ }
718
+ return $res;
719
+ }
720
+
721
+ /**
722
+ * Retrieve item by id
723
+ *
724
+ * @param mixed $idValue
725
+ * @return Varien_Object
726
+ */
727
+ public function getItemById($idValue)
728
+ {
729
+ $this->load();
730
+ if (isset($this->_items[$idValue])) {
731
+ return $this->_items[$idValue];
732
+ }
733
+ return null;
734
+ }
735
+
736
+ /**
737
+ * Implementation of IteratorAggregate::getIterator()
738
+ */
739
+ public function getIterator()
740
+ {
741
+ $this->load();
742
+ return new ArrayIterator($this->_items);
743
+ }
744
+
745
+ /**
746
+ * Retireve count of collection loaded items
747
+ *
748
+ * @return int
749
+ */
750
+ public function count()
751
+ {
752
+ $this->load();
753
+
754
+ return count($this->_items);
755
+ }
756
+
757
+ public function setCacheKey($key)
758
+ {
759
+ $this->_cacheKey = $key;
760
+ return $this;
761
+ }
762
+
763
+ public function getCacheKey()
764
+ {
765
+ return $this->_cacheKey;
766
+ }
767
+
768
+ public function setCacheTags($tags)
769
+ {
770
+ $this->_cacheTags = $tags;
771
+ return $this;
772
+ }
773
+
774
+ public function getCacheTags()
775
+ {
776
+ return $this->_cacheTags;
777
+ }
778
+
779
+ public function getCacheLifetime()
780
+ {
781
+ return $this->_cacheLifetime;
782
+ }
783
+
784
+ /**
785
+ * Retrieve Flag
786
+ *
787
+ * @param string $flag
788
+ * @return mixed
789
+ */
790
+ public function getFlag($flag)
791
+ {
792
+ return isset($this->_flags[$flag]) ? $this->_flags[$flag] : null;
793
+ }
794
+
795
+ /**
796
+ * Set Flag
797
+ *
798
+ * @param string $flag
799
+ * @param mixed $value
800
+ * @return Varien_Data_Collection
801
+ */
802
+ public function setFlag($flag, $value = null)
803
+ {
804
+ $this->_flags[$flag] = $value;
805
+ return $this;
806
+ }
807
+
808
+ /**
809
+ * Has Flag
810
+ *
811
+ * @param string $flag
812
+ * @return bool
813
+ */
814
+ public function hasFlag($flag)
815
+ {
816
+ return array_key_exists($flag, $this->_flags);
817
+ }
818
+ }
app/design/frontend/base/default/layout/connector.xml ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout version="0.1.0">
3
+ <default>
4
+ <reference name="head">
5
+ <block type="core/template" name="checkout.tag" as="connector.tag" template="connector/tracking_code.phtml"/>
6
+ </reference>
7
+ </default>
8
+ <checkout_onepage_success>
9
+ <reference name="content">
10
+ <block type="checkout/onepage_success" name="checkout.roi" as="connector.roi" template="connector/roi_code.phtml"/>
11
+ </reference>
12
+ </checkout_onepage_success>
13
+ <connector_email_products>
14
+ <reference name="root">
15
+ <action method="setTemplate"><template>page/blank.phtml</template></action>
16
+ </reference>
17
+ <reference name="content">
18
+ <block type="connector/products" name="email.products" as="email.products" template="page/connector/products.phtml"/>
19
+ </reference>
20
+ </connector_email_products>
21
+ <connector_email_coupon>
22
+ <reference name="root">
23
+ <action method="setTemplate"><template>page/blank.phtml</template></action>
24
+ </reference>
25
+ <reference name="content">
26
+ <block type="connector/coupon" name="email.coupon" as="email.coupon" template="connector/coupon.phtml"/>
27
+ </reference>
28
+ </connector_email_coupon>
29
+ <connector_email_basket>
30
+ <reference name="root">
31
+ <action method="setTemplate"><template>page/blank.phtml</template></action>
32
+ </reference>
33
+ <reference name="content">
34
+ <block type="connector/basket" name="email.basket" as="email.basket" template="connector/basket.phtml"/>
35
+ </reference>
36
+ </connector_email_basket>
37
+ </layout>
app/design/frontend/base/default/template/connector/basket.phtml ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $items = $this->getBasketItems();
4
+ $helper = Mage::helper('core');
5
+
6
+ ?>
7
+
8
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
9
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/html">
10
+ <head>
11
+
12
+ <title>Basket</title>
13
+
14
+ </head>
15
+ <body class="csv" style="background:#fff; font: 12px/1.5em Arial, Helvetica, sans-serif;">
16
+
17
+ <table style ='float:left; width:600px; border: 1px solid #cbd3d4; font-family:arial; border-collapse: collapse; font-size:12; padding: 5px;' class='data'>
18
+ <tr>
19
+ <th style="border-bottom: 1px solid #cbd3d4; border-right: 1px solid #cbd3d4;">Image</th>
20
+ <th style="border-bottom: 1px solid #cbd3d4; border-right: 1px solid #cbd3d4;">Description</th>
21
+ <th style="border-bottom: 1px solid #cbd3d4; border-right: 1px solid #cbd3d4;">Quantity</th>
22
+ <th style="border-bottom: 1px solid #cbd3d4;">Total</th>
23
+ </tr>
24
+
25
+ <?php foreach($items as $one):?>
26
+ <?php
27
+ if($one->getParentItemId() != null)
28
+ continue;
29
+ $_product = Mage::getModel('catalog/product')->load($one->getProductId());
30
+
31
+ $name = $_product->getName();
32
+ $stock = $_product->getStockItem()->getIsInStock();
33
+ $inStock = ($stock)? 'In Stock' : 'Out of stock';
34
+ $img = $_product->getImageUrl();
35
+ $total = $helper->currency($one->getBaseRowTotalInclTax());
36
+ $productUrl = Mage::getBaseUrl() . $_product->getUrlPath();
37
+ $grandTotal = $helper->currency($this->getGrandTotal());
38
+
39
+ ?>
40
+ <tr>
41
+ <td style="padding: 1px; border-bottom: 1px solid #cbd3d4; border-right: 1px solid #cbd3d4;">
42
+ <img alt="" src="<?php echo $img;?>" width="85" align="absmiddle" border="0" height="85">
43
+ </td>
44
+ <td style="padding: 1px; border-bottom: 1px solid #cbd3d4; border-right: 1px solid #cbd3d4;">Product Name : <a href="<?php echo $productUrl;?>"><?php echo $name . '</a></br>'. $inStock;?></td>
45
+ <td style="padding: 1px; border-bottom: 1px solid #cbd3d4; border-right: 1px solid #cbd3d4;"><?php echo (int)$one->getQty();?></td>
46
+ <td style="padding: 1px; border-bottom: 1px solid #cbd3d4;"><?php echo $total;?></td>
47
+ </tr>
48
+
49
+ <?php endforeach;?>
50
+ <tr>
51
+ <td style="padding: 1px; border-right: 1px solid #cbd3d4;"></td>
52
+ <td style="padding: 1px; border-right: 1px solid #cbd3d4;"></td>
53
+
54
+ <td style="padding: 1px; border-right: 1px solid #cbd3d4;">Order Total</td>
55
+ <td style="padding: 1px;">
56
+ <?php echo $grandTotal;?>
57
+ </td>
58
+ </tr>
59
+
60
+ </table>
61
+
62
+
63
+ </body>
app/design/frontend/base/default/template/connector/coupon.phtml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php
2
+
3
+ $coupon = $this->generateCoupon();
4
+ if($coupon)
5
+ echo $coupon;
6
+
app/design/frontend/base/default/template/connector/price.phtml ADDED
@@ -0,0 +1,428 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magentocommerce.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magentocommerce.com for more information.
20
+ *
21
+ * @category design
22
+ * @package base_default
23
+ * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ ?>
27
+
28
+ <?php
29
+ /**
30
+ * Template for displaying product price in different places (products grid, product view page etc)
31
+ *
32
+ * @see Mage_Catalog_Block_Product_Abstract
33
+ */
34
+ ?>
35
+ <?php
36
+ $_coreHelper = $this->helper('core');
37
+ $_weeeHelper = $this->helper('weee');
38
+ $_taxHelper = $this->helper('tax');
39
+ /* @var $_coreHelper Mage_Core_Helper_Data */
40
+ /* @var $_weeeHelper Mage_Weee_Helper_Data */
41
+ /* @var $_taxHelper Mage_Tax_Helper_Data */
42
+
43
+ $_product = $this->getProduct();
44
+ $_storeId = $_product->getStoreId();
45
+ $_id = $_product->getId();
46
+ $_weeeSeparator = '';
47
+ $_simplePricesTax = ($_taxHelper->displayPriceIncludingTax() || $_taxHelper->displayBothPrices());
48
+ $_minimalPriceValue = $_product->getMinimalPrice();
49
+ $_minimalPrice = $_taxHelper->getPrice($_product, $_minimalPriceValue, $_simplePricesTax);
50
+ ?>
51
+
52
+ <?php if (!$_product->isGrouped()): ?>
53
+ <?php $_weeeTaxAmount = $_weeeHelper->getAmountForDisplay($_product); ?>
54
+ <?php if ($_weeeHelper->typeOfDisplay($_product, array(Mage_Weee_Model_Tax::DISPLAY_INCL_DESCR, Mage_Weee_Model_Tax::DISPLAY_EXCL_DESCR_INCL, 4))): ?>
55
+ <?php $_weeeTaxAmount = $_weeeHelper->getAmount($_product); ?>
56
+ <?php $_weeeTaxAttributes = $_weeeHelper->getProductWeeeAttributesForDisplay($_product); ?>
57
+ <?php endif; ?>
58
+ <?php $_weeeTaxAmountInclTaxes = $_weeeTaxAmount; ?>
59
+ <?php if ($_weeeHelper->isTaxable() && !$_taxHelper->priceIncludesTax($_storeId)): ?>
60
+ <?php $_attributes = $_weeeHelper->getProductWeeeAttributesForRenderer($_product, null, null, null, true); ?>
61
+ <?php $_weeeTaxAmountInclTaxes = $_weeeHelper->getAmountInclTaxes($_attributes); ?>
62
+ <?php endif; ?>
63
+
64
+ <div class="price-box">
65
+ <?php $_price = $_taxHelper->getPrice($_product, $_product->getPrice()) ?>
66
+ <?php $_regularPrice = $_taxHelper->getPrice($_product, $_product->getPrice(), $_simplePricesTax) ?>
67
+ <?php $_finalPrice = $_taxHelper->getPrice($_product, $_product->getFinalPrice()) ?>
68
+ <?php $_finalPriceInclTax = $_taxHelper->getPrice($_product, $_product->getFinalPrice(), true) ?>
69
+ <?php $_weeeDisplayType = $_weeeHelper->getPriceDisplayType(); ?>
70
+ <?php if ($_finalPrice >= $_price): ?>
71
+ <?php if ($_taxHelper->displayBothPrices()): ?>
72
+ <?php if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 0)): // including ?>
73
+ <span class="price-excluding-tax">
74
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
75
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
76
+ <?php echo $_coreHelper->currency($_price + $_weeeTaxAmount, true, false) ?>
77
+ </span>
78
+ </span>
79
+ <span class="price-including-tax">
80
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
81
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
82
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
83
+ </span>
84
+ </span>
85
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 1)): // incl. + weee ?>
86
+ <span class="price-excluding-tax">
87
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
88
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
89
+ <?php echo $_coreHelper->currency($_price + $_weeeTaxAmount, true, false) ?>
90
+ </span>
91
+ </span>
92
+ <span class="price-including-tax">
93
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
94
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
95
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
96
+ </span>
97
+ <span class="weee">(
98
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
99
+ <?php echo $_weeeSeparator; ?>
100
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount(), true, true); ?>
101
+ <?php $_weeeSeparator = ' + '; ?>
102
+ <?php endforeach; ?>
103
+ )</span>
104
+ </span>
105
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 4)): // incl. + weee ?>
106
+ <span class="price-excluding-tax">
107
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
108
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
109
+ <?php echo $_coreHelper->currency($_price + $_weeeTaxAmount, true, false) ?>
110
+ </span>
111
+ </span>
112
+ <span class="price-including-tax">
113
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
114
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
115
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
116
+ </span>
117
+ <span class="weee">(
118
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
119
+ <?php echo $_weeeSeparator; ?>
120
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount() + $_weeeTaxAttribute->getTaxAmount(), true, true); ?>
121
+ <?php $_weeeSeparator = ' + '; ?>
122
+ <?php endforeach; ?>
123
+ )</span>
124
+ </span>
125
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 2)): // excl. + weee + final ?>
126
+ <span class="price-excluding-tax">
127
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
128
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
129
+ <?php echo $_coreHelper->currency($_price, true, false) ?>
130
+ </span>
131
+ </span>
132
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
133
+ <span class="weee">
134
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount(), true, true); ?>
135
+ </span>
136
+ <?php endforeach; ?>
137
+ <span class="price-including-tax">
138
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
139
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
140
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
141
+ </span>
142
+ </span>
143
+ <?php else: ?>
144
+ <span class="price-excluding-tax">
145
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
146
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
147
+ <?php if ($_finalPrice == $_price): ?>
148
+ <?php echo $_coreHelper->currency($_price, true, false) ?>
149
+ <?php else: ?>
150
+ <?php echo $_coreHelper->currency($_finalPrice, true, false) ?>
151
+ <?php endif; ?>
152
+ </span>
153
+ </span>
154
+ <span class="price-including-tax">
155
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
156
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
157
+ <?php echo $_coreHelper->currency($_finalPriceInclTax, true, false) ?>
158
+ </span>
159
+ </span>
160
+ <?php endif; ?>
161
+ <?php else: ?>
162
+ <?php if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 0)): // including ?>
163
+ <span class="regular-price" id="product-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
164
+ <?php echo $_coreHelper->currency($_price + $_weeeTaxAmount, true, true) ?>
165
+ </span>
166
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 1)): // incl. + weee ?>
167
+ <span class="regular-price" id="product-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
168
+ <?php echo $_coreHelper->currency($_price + $_weeeTaxAmount, true, true) ?>
169
+ </span>
170
+ <span class="weee">(
171
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
172
+ <?php echo $_weeeSeparator; ?>
173
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount(), true, true); ?>
174
+ <?php $_weeeSeparator = ' + '; ?>
175
+ <?php endforeach; ?>
176
+ )</span>
177
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 4)): // incl. + weee ?>
178
+ <span class="regular-price" id="product-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
179
+ <?php echo $_coreHelper->currency($_price + $_weeeTaxAmount, true, true) ?>
180
+ </span>
181
+ <span class="weee">(
182
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
183
+ <?php echo $_weeeSeparator; ?>
184
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount() + $_weeeTaxAttribute->getTaxAmount(), true, true); ?>
185
+ <?php $_weeeSeparator = ' + '; ?>
186
+ <?php endforeach; ?>
187
+ )</span>
188
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 2)): // excl. + weee + final ?>
189
+ <span class="regular-price"><?php echo $_coreHelper->currency($_price,true,true) ?></span><br />
190
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
191
+ <span class="weee">
192
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount(), true, true); ?>
193
+ </span>
194
+ <?php endforeach; ?>
195
+ <span class="regular-price" id="product-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
196
+ <?php echo $_coreHelper->currency($_price + $_weeeTaxAmount, true, true) ?>
197
+ </span>
198
+ <?php else: ?>
199
+ <span class="regular-price" id="product-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
200
+ <?php if ($_finalPrice == $_price): ?>
201
+ <?php echo $_coreHelper->currency($_price, true, true) ?>
202
+ <?php else: ?>
203
+ <?php echo $_coreHelper->currency($_finalPrice, true, true) ?>
204
+ <?php endif; ?>
205
+ </span>
206
+ <?php endif; ?>
207
+ <?php endif; ?>
208
+ <?php else: /* if ($_finalPrice == $_price): */ ?>
209
+ <?php $_originalWeeeTaxAmount = $_weeeHelper->getOriginalAmount($_product); ?>
210
+
211
+ <?php if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 0)): // including ?>
212
+ <p class="old-price">
213
+ <span class="price-label"><?php echo $this->__('Regular Price:') ?></span>
214
+ <span class="price" id="old-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
215
+ <?php echo $_coreHelper->currency($_regularPrice + $_originalWeeeTaxAmount, true, false) ?>
216
+ </span>
217
+ </p>
218
+
219
+ <?php if ($_taxHelper->displayBothPrices()): ?>
220
+ <p class="special-price">
221
+ <span class="price-label"><?php echo $this->__('Special Price:') ?></span>
222
+ <span class="price-excluding-tax">
223
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
224
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
225
+ <?php echo $_coreHelper->currency($_finalPrice + $_weeeTaxAmount, true, false) ?>
226
+ </span>
227
+ </span>
228
+ <span class="price-including-tax">
229
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
230
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
231
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
232
+ </span>
233
+ </span>
234
+ </p>
235
+ <?php else: ?>
236
+ <p class="special-price">
237
+ <span class="price-label"><?php echo $this->__('Special Price:') ?></span>
238
+ <span class="price" id="product-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
239
+ <?php echo $_coreHelper->currency($_finalPrice + $_weeeTaxAmountInclTaxes, true, false) ?>
240
+ </span>
241
+ </p>
242
+ <?php endif; ?>
243
+
244
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 1)): // incl. + weee ?>
245
+ <p class="old-price">
246
+ <span class="price-label"><?php echo $this->__('Regular Price:') ?></span>
247
+ <span class="price" id="old-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
248
+ <?php echo $_coreHelper->currency($_regularPrice + $_originalWeeeTaxAmount, true, false) ?>
249
+ </span>
250
+ </p>
251
+
252
+ <p class="special-price">
253
+ <span class="price-label"><?php echo $this->__('Special Price:') ?></span>
254
+ <span class="price-excluding-tax">
255
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
256
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
257
+ <?php echo $_coreHelper->currency($_finalPrice + $_weeeTaxAmount, true, false) ?>
258
+ </span>
259
+ </span>
260
+ <span class="weee">(
261
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
262
+ <?php echo $_weeeSeparator; ?>
263
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount(), true, true); ?>
264
+ <?php $_weeeSeparator = ' + '; ?>
265
+ <?php endforeach; ?>
266
+ )</span>
267
+ <span class="price-including-tax">
268
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
269
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
270
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
271
+ </span>
272
+ </span>
273
+ </p>
274
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 4)): // incl. + weee ?>
275
+ <p class="old-price">
276
+ <span class="price-label"><?php echo $this->__('Regular Price:') ?></span>
277
+ <span class="price" id="old-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
278
+ <?php echo $_coreHelper->currency($_regularPrice + $_originalWeeeTaxAmount, true, false) ?>
279
+ </span>
280
+ </p>
281
+
282
+ <p class="special-price">
283
+ <span class="price-label"><?php echo $this->__('Special Price:') ?></span>
284
+ <span class="price-excluding-tax">
285
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
286
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
287
+ <?php echo $_coreHelper->currency($_finalPrice + $_weeeTaxAmount, true, false) ?>
288
+ </span>
289
+ </span>
290
+ <span class="weee">(
291
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
292
+ <?php echo $_weeeSeparator; ?>
293
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount() + $_weeeTaxAttribute->getTaxAmount(), true, true); ?>
294
+ <?php $_weeeSeparator = ' + '; ?>
295
+ <?php endforeach; ?>
296
+ )</span>
297
+ <span class="price-including-tax">
298
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
299
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
300
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
301
+ </span>
302
+ </span>
303
+ </p>
304
+ <?php elseif ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, 2)): // excl. + weee + final ?>
305
+ <p class="old-price">
306
+ <span class="price-label"><?php echo $this->__('Regular Price:') ?></span>
307
+ <span class="price" id="old-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
308
+ <?php echo $_coreHelper->currency($_regularPrice, true, false) ?>
309
+ </span>
310
+ </p>
311
+
312
+ <p class="special-price">
313
+ <span class="price-label"><?php echo $this->__('Special Price:') ?></span>
314
+ <span class="price-excluding-tax">
315
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
316
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
317
+ <?php echo $_coreHelper->currency($_finalPrice, true, false) ?>
318
+ </span>
319
+ </span>
320
+ <?php foreach ($_weeeTaxAttributes as $_weeeTaxAttribute): ?>
321
+ <span class="weee">
322
+ <?php echo $_weeeTaxAttribute->getName(); ?>: <?php echo $_coreHelper->currency($_weeeTaxAttribute->getAmount(), true, true); ?>
323
+ </span>
324
+ <?php endforeach; ?>
325
+ <span class="price-including-tax">
326
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
327
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
328
+ <?php echo $_coreHelper->currency($_finalPriceInclTax + $_weeeTaxAmountInclTaxes, true, false) ?>
329
+ </span>
330
+ </span>
331
+ </p>
332
+ <?php else: // excl. ?>
333
+ <p class="old-price">
334
+ <span class="price-label"><?php echo $this->__('Regular Price:') ?></span>
335
+ <span class="price" id="old-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
336
+ <?php echo $_coreHelper->currency($_regularPrice, true, false) ?>
337
+ </span>
338
+ </p>
339
+
340
+ <?php if ($_taxHelper->displayBothPrices()): ?>
341
+ <p class="special-price">
342
+ <span class="price-label"><?php echo $this->__('Special Price:') ?></span>
343
+ <span class="price-excluding-tax">
344
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
345
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
346
+ <?php echo $_coreHelper->currency($_finalPrice, true, false) ?>
347
+ </span>
348
+ </span>
349
+ <span class="price-including-tax">
350
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
351
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
352
+ <?php echo $_coreHelper->currency($_finalPriceInclTax, true, false) ?>
353
+ </span>
354
+ </span>
355
+ </p>
356
+ <?php else: ?>
357
+ <p class="special-price">
358
+ <span class="price-label"><?php echo $this->__('Special Price:') ?></span>
359
+ <span class="price" id="product-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
360
+ <?php echo $_coreHelper->currency($_finalPrice, true, false) ?>
361
+ </span>
362
+ </p>
363
+ <?php endif; ?>
364
+ <?php endif; ?>
365
+
366
+ <?php endif; /* if ($_finalPrice == $_price): */ ?>
367
+
368
+ <?php if ($this->getDisplayMinimalPrice() && $_minimalPriceValue && $_minimalPriceValue < $_product->getFinalPrice()): ?>
369
+
370
+ <?php $_minimalPriceDisplayValue = $_minimalPrice; ?>
371
+ <?php if ($_weeeTaxAmount && $_weeeHelper->typeOfDisplay($_product, array(0, 1, 4))): ?>
372
+ <?php $_minimalPriceDisplayValue = $_minimalPrice + $_weeeTaxAmount; ?>
373
+ <?php endif; ?>
374
+
375
+ <?php if ($this->getUseLinkForAsLowAs()):?>
376
+ <a href="<?php echo $_product->getProductUrl(); ?>" class="minimal-price-link">
377
+ <?php else:?>
378
+ <span class="minimal-price-link">
379
+ <?php endif?>
380
+ <span class="label"><?php echo $this->__('As low as:') ?></span>
381
+ <span class="price" id="product-minimal-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
382
+ <?php echo $_coreHelper->currency($_minimalPriceDisplayValue, true, false) ?>
383
+ </span>
384
+ <?php if ($this->getUseLinkForAsLowAs()):?>
385
+ </a>
386
+ <?php else:?>
387
+ </span>
388
+ <?php endif?>
389
+ <?php endif; /* if ($this->getDisplayMinimalPrice() && $_minimalPrice && $_minimalPrice < $_finalPrice): */ ?>
390
+ </div>
391
+
392
+ <?php else: /* if (!$_product->isGrouped()): */ ?>
393
+ <?php
394
+ $_exclTax = $_taxHelper->getPrice($_product, $_minimalPriceValue);
395
+ $_inclTax = $_taxHelper->getPrice($_product, $_minimalPriceValue, true);
396
+ ?>
397
+ <?php if ($this->getDisplayMinimalPrice() && $_minimalPriceValue): ?>
398
+ <div class="price-box">
399
+ <p class="minimal-price">
400
+ <span class="price-label"><?php echo $this->__('Starting at:') ?></span>
401
+ <?php if ($_taxHelper->displayBothPrices()): ?>
402
+ <span class="price-excluding-tax">
403
+ <span class="label"><?php echo $this->helper('tax')->__('Excl. Tax:') ?></span>
404
+ <span class="price" id="price-excluding-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
405
+ <?php echo $_coreHelper->currency($_exclTax, true, false) ?>
406
+ </span>
407
+ </span>
408
+ <span class="price-including-tax">
409
+ <span class="label"><?php echo $this->helper('tax')->__('Incl. Tax:') ?></span>
410
+ <span class="price" id="price-including-tax-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
411
+ <?php echo $_coreHelper->currency($_inclTax, true, false) ?>
412
+ </span>
413
+ </span>
414
+ <?php else: ?>
415
+ <?php
416
+ $_showPrice = $_inclTax;
417
+ if (!$_taxHelper->displayPriceIncludingTax()) {
418
+ $_showPrice = $_exclTax;
419
+ }
420
+ ?>
421
+ <span class="price" id="product-minimal-price-<?php echo $_id ?><?php echo $this->getIdSuffix() ?>">
422
+ <?php echo $_coreHelper->currency($_showPrice, true, false) ?>
423
+ </span>
424
+ <?php endif; ?>
425
+ </p>
426
+ </div>
427
+ <?php endif; /* if ($this->getDisplayMinimalPrice() && $_minimalPrice): */ ?>
428
+ <?php endif; /* if (!$_product->isGrouped()): */ ?>
app/design/frontend/base/default/template/connector/roi_code.phtml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ if(Mage::getStoreConfig('connector_roi_page_tracking_settings/roi_tracking/enabled')):?>
4
+
5
+ <?php
6
+ $order = Mage::getModel('sales/order')->loadByIncrementId($this->getOrderId());
7
+ $orderId = $this->getOrderId();
8
+ $items = $order->getAllItems();
9
+ $total = number_format($order->getBaseGrandTotal(), 2);
10
+
11
+ ?>
12
+ <script type="text/javascript">
13
+ <?php foreach ($items as $item):?>
14
+
15
+ <?php if($item->getParentItemId() != null)
16
+ continue;?>
17
+ _dmTrack("product", <?php echo $item->getName()?>;
18
+
19
+ <?php endforeach;?>
20
+ _dmTrack("CheckOutAmount", <?php echo $total;?>);
21
+ </script>
22
+
23
+ <?php endif;?>
app/design/frontend/base/default/template/connector/tracking_code.phtml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php
2
+ if(Mage::getStoreConfig('connector_roi_page_tracking_settings/page_tracking/enabled')) :?>
3
+ <script src="http://t.trackedlink.net/_dmpt.js" type="text/javascript"></script>
4
+ <?php endif;?>
app/design/frontend/base/default/template/page/blank.phtml ADDED
@@ -0,0 +1 @@
 
1
+ <?php echo $this->getChildHtml('content');?>
app/design/frontend/base/default/template/page/connector/products.phtml ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php $productCollection = $this->getRecommendedProducts();?>
2
+
3
+
4
+ <?php
5
+ $listMode = $this->getMode();
6
+
7
+ ?>
8
+
9
+ <?php $i = 0;foreach ($productCollection as $key => $_product) :?>
10
+ <?php $_product = Mage::getModel('catalog/product')->load($_product->getEntityId());?>
11
+ <?php if($i == 0):?>
12
+ <table border="0" bordercolor="#FFCC00" width="147" cellpadding="0" cellspacing="0" style='font-family:arial; border-collapse: collapse; font-size:12;'><tr>
13
+ <?php endif;?>
14
+ <?php
15
+ //LIST MODE
16
+ if($listMode == 'list'){
17
+ echo '</tr><tr>';
18
+ }?>
19
+
20
+ <td style="vertical-align: text-top; padding-right: 2px;">
21
+
22
+
23
+ <a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" class="product-image"><img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->resize(135); ?>" width="140" height="135" alt="<?php echo $this->stripTags($this->getImageLabel($_product, 'small_image'), null, true) ?>" align="middle" /></a>
24
+
25
+ <div align="center"><b><?php echo substr($_product->getName(), 0, 40);?></b></div>
26
+
27
+ <div align="center"><?php echo $this->getPriceHtml($_product, true);?></div>
28
+ <div align="center"><a href="<?php echo $_product->getProductUrl();?>">View Now</a></div>
29
+ </td>
30
+
31
+ <?php if($i++ % 4 ==3 && $listMode == 'grid') echo '</tr><tr>'?>
32
+
33
+ <?php endforeach;?>
34
+
35
+ </table>
36
+
37
+
app/etc/modules/Dotdigitalgroup_Email.xml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Dotdigitalgroup_Email>
5
+ <active>true</active>
6
+ <codePool>local</codePool>
7
+ </Dotdigitalgroup_Email>
8
+ </modules>
9
+ </config>
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>dotmailermagento</name>
4
+ <version>1.5.1</version>
5
+ <stability>stable</stability>
6
+ <license uri="http://opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Integrate your ecommerce with dotMailer's powerful triggered email marketing and convert more visits to sales.</summary>
10
+ <description>Connector Integration for Magento, allows to manage and synchronise customer data and lost baskets.</description>
11
+ <notes>Product recommendation and dynamic content for connector.</notes>
12
+ <authors><author><name>Calin Diacon</name><user>cdiacon</user><email>cdiacon@gmail.com</email></author></authors>
13
+ <date>2013-10-23</date>
14
+ <time>10:14:57</time>
15
+ <contents><target name="magelocal"><dir name="Dotdigitalgroup"><dir name="Email"><dir name="Block"><dir name="Adminhtml"><dir name="System"><file name="Bestsellers.php" hash="3712d5b267bcb960ab61ea4c2f7780fd"/><dir name="Config"><file name="Gridlist.php" hash="4022c4af28efa8b521eae76da8781417"/><file name="Insertvariable.php" hash="16efa5b30d69f1a87ba73a39c30d526b"/><file name="Messagedefault.php" hash="316850603c3aba812e34955f4e6ea1ad"/><file name="Password.php" hash="3065946d4e092e6fe0d31cbb4b52edee"/><file name="Smsmessagefour.php" hash="6764248cd2dd0a1df8f8546ef581cefd"/><file name="Smsmessageone.php" hash="f99c4598125f337f5d02003e381466b0"/><file name="Smsmessagethree.php" hash="5deb67df50db7c640c7d8438cad05df6"/><file name="Smsmessagetwo.php" hash="ef33d2f8c780dba2fa71e3723192ed74"/><file name="Validator.php" hash="03288ddcb5cbf3234231d8af8f7723ff"/><file name="Waitingfield.php" hash="fb25e0d81a2067a2d8f6cabff4277f84"/><file name="Wrapper.php" hash="cf5319d175c585354c2d9ebfe30d41e6"/></dir><file name="Couponinfo.php" hash="ede44a34e922becad72a5b3c1c0fc633"/><file name="Crosssell.php" hash="e2f2f5436d3ea902cd40a03795d5e456"/><file name="Lostbasket.php" hash="923a64cb4759f3c1a6bac37437612a7c"/><file name="Mostviewed.php" hash="e6ecfc239e55d4f3781ae8d6e7da15ce"/><file name="Productpush.php" hash="9c243d149366577f47383935892f58d5"/><file name="Recentlyviewed.php" hash="2351cd33be3f670809a72774989b149a"/><file name="Related.php" hash="69a352f8d5c2b397f19cf2a3f1eac9d7"/><file name="Upsell.php" hash="20e8adb20d3bb7e31dfce13e616cd195"/></dir></dir><file name="Basket.php" hash="850034be56ab609ca8345781520148ae"/><file name="Coupon.php" hash="6aaec59401eb7a4602dcb29db9d8c03d"/><dir name="Debug"><file name="Countcontacts.php" hash="59d8d74a82aac88d3cb0f4ed9ffecfef"/><file name="Deletecontacts.php" hash="f2b3f787467ff337331e554117e48408"/><file name="Forcecustomersync.php" hash="d5738efb228c7ba430bf2156941b93a7"/><file name="Forcelostbasketsync.php" hash="f12e28f29b7e1c56edf6464b5af7ead4"/><file name="Forcesuppressedsync.php" hash="cfda0355fae3284853259f3f292dd742"/><file name="Initialsync.php" hash="118b2c178a22fa3cd2301d4d9bbec5f2"/><file name="Rescuenow.php" hash="f20a18a3fe2803c7d71924ec04bc4f50"/><file name="Testcredentials.php" hash="660ca7d025c51974bec5307518649506"/><file name="Transactionalsync.php" hash="7cce60182af6603fa0a082bf02752be8"/></dir><file name="Products.php" hash="091bd0a56391c7fc1b94e96e11ea636c"/></dir><dir name="Helper"><dir name="Api"><file name="DotNetExample.php" hash="cdefe297bf38b6c49ec0acdf9f43264a"/><file name="Restrequest.php" hash="dbd90bdcc12a90bcc875e6c88842e8be"/></dir><file name="Data.php" hash="042d65513fc63e89ff8093e5cb932ec1"/><file name="File.php" hash="7b13d5ce553d5c0442694a9ad2d46016"/><file name="Recommended.php" hash="e14f6657e3243816e8f7d4aae214499e"/></dir><dir name="Model"><dir name="Account"><file name="Test.php" hash="71095642bfae08183962007d59ef028c"/></dir><dir name="Api"><file name="Rest.php" hash="c91400b9e9d21cef977b95479752ad90"/></dir><dir name="Connector"><file name="Account.php" hash="b232ee04f222c3e61a6e6494d13a11b4"/><file name="Customer.php" hash="1f201b107ced31b9bad9b9884f8c4a28"/><file name="Order.php" hash="4baaed26cb6efb7de3dfdf8550acc6fe"/><file name="Quote.php" hash="74cb4c28351223c213889d00552712a7"/><file name="Wishlist.php" hash="7f02a04debb6d6a8971d5e696142b1c7"/></dir><file name="Cron.php" hash="23942f32f5cfeae44479fec3e4ca0294"/><dir name="Customer"><file name="Customer.php" hash="4b853783ed303a61dd5808f0fc368c3a"/><file name="Suppressed.php" hash="639382b91fe82328548429c5d7d48a7e"/><dir name="Wishlist"><file name="Item.php" hash="7087ac6edf465a88a5dd96af483459d9"/></dir></dir><dir name="Dynamic"><dir name="Product"><file name="Mapper.php" hash="63451cbd3d11523ba6d60f71a88d10f6"/></dir><file name="Recommended.php" hash="6588de609b5bc87ed1a51b25f7243858"/></dir><dir name="Newsletter"><file name="Subscriber.php" hash="aa06389101532308e6aa14da6cef2c99"/></dir><file name="Observer.php" hash="b3106c169860a62263e3aa92230f9f16"/><file name="Order.php" hash="df951471328bb27f35babb337e527851"/><dir name="Sales"><file name="Order.php" hash="2cb28b4a209825331ea01d6b45576d08"/><file name="Quote.php" hash="c97137d259868f7a44aaaa95e2130674"/><file name="Sms.php" hash="ea05d7b33f140fd308a60215fa5f7baa"/></dir><dir name="System"><dir name="Config"><dir name="Backend"><dir name="Syncschedule"><file name="Customer.php" hash="d421b5ac07c5bb71051edfda1cc4dcdb"/><file name="Suppressed.php" hash="6eb9b26bbac6c6ce86a7981a20f604ad"/></dir></dir><dir name="Source"><file name="Activebasket.php" hash="1ec34cf0f073f40c36f1918d4f38cbb0"/><file name="Addressbooks.php" hash="e482c8e6d64520eed38110005b6f44ea"/><file name="Campaigns.php" hash="221e817a4796d3754b6230f8e71a91e5"/><file name="Datafields.php" hash="e8d219b3170bf5e416bdf479874f0304"/><file name="Displayifnot.php" hash="175ec822880b9c21bdde7697e90da2d8"/><file name="Displaytype.php" hash="6025a5b7b08908819ec20263b0715b8b"/><file name="Gridview.php" hash="6c9a24e47167cabaa9c749670372e4ed"/><file name="Lostbasket.php" hash="02c5254bd7aeab58253f38e6ee401ee7"/><file name="Orderlimit.php" hash="db8cc03eb2259ce07900b5d2a45eedbc"/><file name="Orderstatus.php" hash="62446aebcb422acce53641412c0fd98f"/><file name="Sendcampain.php" hash="207c467eb35319e26437be126716fc72"/><file name="Syncfrequency.php" hash="19181d66a5688d6da78da9b8b0c639b0"/><file name="Timeperiod.php" hash="6f3d5907f6e6bdff3a6e0fae196fa78c"/></dir></dir></dir></dir><dir name="Test"><dir name="Model"><file name="Product.php" hash="590f024e6ae4a33044897004e81d5a33"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="DebugController.php" hash="0b58c42b842da871181f19ca97d69a13"/></dir><file name="EmailController.php" hash="af67b1470e5f33767d2fbf80c8d2725f"/></dir><dir name="etc"><file name="adminhtml.xml" hash="5f8fdbfa276d01622117b1a5a7ac4bf4"/><file name="config.xml" hash="10fd0f57b91292c12737b83b9244240c"/><file name="system.xml" hash="2ff93941b9d0336a602bbe410a377282"/></dir><dir name="sql"><dir name="connector_setup"><file name="mysql4-install-0.1.0.php" hash="c33e49225f3974f784f8b7b12f609102"/><file name="mysql4-upgrade-1.1.1-1.1.2.php" hash="7fae25a8ae47fe0ba692076ac04237a4"/></dir></dir></dir></dir><dir name="Varien"><dir name="Data"><file name="Collection.php" hash="a925107e95454d0e6609138b00f972aa"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="connector.xml" hash="d86fe05590ffbcbd4fe671da9cdb2979"/></dir><dir name="template"><dir name="connector"><file name="basket.phtml" hash="2dadd9e056a5a0267fb5a84e8d711fce"/><file name="coupon.phtml" hash="0e39fce43a6b3c4b45130996f1de90ff"/><file name="price.phtml" hash="3600de0d5573415628823b3d1f397cca"/><file name="roi_code.phtml" hash="72b38638e7105a4375cf22d662d67fab"/><file name="tracking_code.phtml" hash="4dcec68640a76074eced63d054a701eb"/></dir><dir name="page"><dir name="connector"><file name="products.phtml" hash="3c8bf292c14da73cd513498978323724"/></dir><file name="blank.phtml" hash="7bf34446254428a5c42740731127b435"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Dotdigitalgroup_Email.xml" hash="9b9b2dbb1f62fe025fe35da89171b658"/></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>1.5.2</min><max>6.0.0</max></php><extension><name>curl</name><min>7.15.1</min><max>7.30.0</max></extension></required></dependencies>
18
+ </package>