recapture - Version 1.0.0

Version Notes

Initial production release

Download this release

Release Info

Developer David Webber
Extension recapture
Version 1.0.0
Comparing to
See all releases


Version 1.0.0

app/code/local/Recapture/Connector/Block/Adminhtml/System/Config/Authenticate.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ class Recapture_Connector_Block_Adminhtml_System_Config_Authenticate extends Mage_Adminhtml_Block_System_Config_Form_Field
3
+ implements Varien_Data_Form_Element_Renderer_Interface {
4
+
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element){
6
+
7
+ $buttonBlock = Mage::app()->getLayout()->createBlock('adminhtml/widget_button');
8
+
9
+ $data = array(
10
+ 'label' => Mage::helper('adminhtml')->__('Authenticate Account'),
11
+ 'onclick' => 'setLocation(\''.Mage::helper('adminhtml')->getUrl("recapture_admin/authenticate") . '\' )',
12
+ 'class' => '',
13
+ );
14
+
15
+ $html = $buttonBlock->setData($data)->toHtml();
16
+
17
+ return $html;
18
+ }
19
+ }
app/code/local/Recapture/Connector/Block/Adminhtml/System/Config/Key.php ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Recapture_Connector_Block_Adminhtml_System_Config_Key extends Mage_Adminhtml_Block_System_Config_Form_Field {
4
+
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
6
+
7
+ $element->setDisabled('disabled');
8
+ return parent::_getElementHtml($element);
9
+
10
+ }
11
+
12
+ }
app/code/local/Recapture/Connector/Block/Adminhtml/System/Config/Status.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Recapture_Connector_Block_Adminhtml_System_Config_Status extends Mage_Adminhtml_Block_System_Config_Form_Field {
4
+
5
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element) {
6
+
7
+ $authenticated = Mage::getStoreConfig('recapture/configuration/authenticated');
8
+
9
+ $image = $this->getSkinUrl('images/' . ($authenticated ? 'success' : 'error') . '_msg_icon.gif');
10
+ $text = '<img style="float: left; margin-right: 6px;" src="' . $image . '" /> ';
11
+ $text .= '<span class="' . ($authenticated ? 'success' : 'error') . '">';
12
+ $text .= $authenticated ? 'Authenticated!' : 'Not Authenticated';
13
+ $text .= '</span>';
14
+
15
+ return $text;
16
+
17
+ }
18
+
19
+ }
app/code/local/Recapture/Connector/Helper/Data.php ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Recapture_Connector_Helper_Data extends Mage_Core_Helper_Abstract {
4
+
5
+ public function isEnabled(){
6
+
7
+ return Mage::getStoreConfig('recapture/configuration/enabled');
8
+
9
+ }
10
+
11
+ public function getApiKey(){
12
+
13
+ return Mage::getStoreConfig('recapture/configuration/api_key');
14
+
15
+ }
16
+
17
+ }
app/code/local/Recapture/Connector/Helper/Transport.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Recapture_Connector_Helper_Transport extends Mage_Core_Helper_Abstract {
4
+
5
+ public function dispatch($route = '', $data = array()){
6
+
7
+ if (!Mage::helper('recapture')->isEnabled()) return false;
8
+ if (empty($route)) return false;
9
+
10
+ $adapter = new Zend_Http_Client_Adapter_Curl();
11
+ $client = new Zend_Http_Client('http://www.recapture.io/beacon/' . $route, array(
12
+ 'timeout' => 1
13
+ ));
14
+
15
+ $client->setParameterPost($data);
16
+ $client->setAdapter($adapter);
17
+ $client->setHeaders('Api-Key', Mage::helper('recapture')->getApiKey());
18
+ $response = $client->request('POST');
19
+
20
+ return $response;
21
+
22
+ }
23
+
24
+ }
app/code/local/Recapture/Connector/Model/Observer.php ADDED
@@ -0,0 +1,105 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Recapture_Connector_Model_Observer {
4
+
5
+ public function itemUpdate($observer){
6
+
7
+ return $this->_updateQuote($observer->getEvent()->getQuoteItem()->getQuote());
8
+
9
+ }
10
+
11
+ public function quoteUpdate($observer){
12
+
13
+ return $this->_updateQuote($observer->getEvent()->getQuote());
14
+
15
+ }
16
+
17
+ protected function _updateQuote(Mage_Sales_Model_Quote $quote){
18
+
19
+ if (!Mage::helper('recapture')->isEnabled()) return $this;
20
+
21
+ if (!$quote->getId()) return;
22
+
23
+ //sales_quote_save_before gets called like 5 times on some page loads, we don't want to do 5 updates per page load
24
+ if (Mage::registry('recapture_has_posted')) return;
25
+
26
+ Mage::register('recapture_has_posted', true);
27
+
28
+ $transportData = array(
29
+ 'email' => $quote->getCustomerEmail(),
30
+ 'external_id' => $quote->getId(),
31
+ 'grand_total' => $quote->getGrandTotal(),
32
+ 'products' => array(),
33
+ 'totals' => array()
34
+ );
35
+
36
+ $cartItems = $quote->getAllVisibleItems();
37
+
38
+ foreach ($cartItems as $item){
39
+
40
+ $product = array(
41
+ 'name' => $item->getName(),
42
+ 'sku' => $item->getSku(),
43
+ 'price' => $item->getPrice(),
44
+ 'qty' => $item->getQty(),
45
+ 'image' => (string)Mage::helper('catalog/image')->init($item->getProduct(), 'thumbnail')
46
+ );
47
+
48
+ $transportData['products'][] = $product;
49
+
50
+ }
51
+
52
+ $totals = $quote->getTotals();
53
+
54
+ foreach ($totals as $total){
55
+
56
+ //we pass grand total on the top level
57
+ if ($total->getCode() == 'grand_total') continue;
58
+
59
+ $total = array(
60
+ 'name' => $total->getTitle(),
61
+ 'amount' => $total->getValue()
62
+ );
63
+
64
+ $transportData['totals'][] = $total;
65
+
66
+ }
67
+
68
+ Mage::helper('recapture/transport')->dispatch('cart', $transportData);
69
+
70
+ return $this;
71
+
72
+ }
73
+
74
+ public function quoteDelete($observer){
75
+
76
+ if (!Mage::helper('recapture')->isEnabled()) return $this;
77
+
78
+ $quote = $observer->getEvent()->getQuote();
79
+
80
+ $transportData = array(
81
+ 'external_id' => $quote->getId()
82
+ );
83
+
84
+ Mage::helper('recapture/transport')->dispatch('cart/remove', $transportData);
85
+
86
+ return $this;
87
+
88
+ }
89
+
90
+ public function cartConversion($observer){
91
+
92
+ if (!Mage::helper('recapture')->isEnabled()) return $this;
93
+
94
+ $order = $observer->getEvent()->getOrder();
95
+
96
+ $transportData = array(
97
+ 'external_id' => $order->getQuoteId()
98
+ );
99
+
100
+ Mage::helper('recapture/transport')->dispatch('conversion', $transportData);
101
+
102
+ return $this;
103
+
104
+ }
105
+ }
app/code/local/Recapture/Connector/controllers/Adminhtml/AuthenticateController.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Recapture_Connector_Adminhtml_AuthenticateController extends Mage_Adminhtml_Controller_Action {
4
+
5
+ public function indexAction(){
6
+
7
+ $query = http_build_query(array(
8
+ 'return' => Mage::helper('adminhtml')->getUrl('recapture_admin/authenticate/return'),
9
+ 'recapture' => Mage::getUrl('recapture/cart/index')
10
+ ));
11
+
12
+ $authenticateUrl = 'http://recapture.io/account/auth?' . $query;
13
+ return $this->_redirectUrl($authenticateUrl);
14
+
15
+ }
16
+
17
+ public function returnAction(){
18
+
19
+ $apiKey = $this->getRequest()->getParam('api_key');
20
+
21
+ if ($apiKey){
22
+
23
+ $config = new Mage_Core_Model_Config();
24
+ $config->saveConfig('recapture/configuration/authenticated', true, 'default', 0);
25
+ $config->saveConfig('recapture/configuration/api_key', $apiKey, 'default', 0);
26
+
27
+ Mage::getSingleton('adminhtml/session')->addSuccess('Your account has been authenticated successfully!');
28
+
29
+ } else {
30
+
31
+ Mage::getSingleton('adminhtml/session')->addError('Unable to authenticate your account. Please ensure you are logged in to your Recapture account.');
32
+
33
+ }
34
+
35
+ return $this->_redirect('adminhtml/system_config/edit', array('section' => 'recapture'));
36
+
37
+ }
38
+
39
+ }
app/code/local/Recapture/Connector/controllers/ExportController.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Soshify_Connector_ExportController extends Mage_Core_Controller_Front_Action {
4
+
5
+ public function indexAction(){
6
+
7
+ $resource = Mage::getSingleton('core/resource');
8
+ $readConnection = $resource->getConnection('core_read');
9
+ $productResource = Mage::getModel('catalog/product')->getResource();
10
+
11
+ $name = $productResource->getAttribute('name');
12
+ $visibility = $productResource->getAttribute('visibility');
13
+ $status = $productResource->getAttribute('status');
14
+
15
+ $nameId = $name->getId();
16
+ $visibilityId = $visibility->getId();
17
+ $statusId = $status->getId();
18
+
19
+ $select = $readConnection->select();
20
+ $select = $select->from(array('e' => $resource->getTableName('catalog/product')), array('sku'))->where(new Zend_Db_Expr('sku IS NOT NULL'));
21
+
22
+ //is active
23
+ $select->joinLeft(array('table_status' => $status->getBackendTable()), "(table_status.entity_id = e.entity_id AND table_status.attribute_id = $statusId)", null)->where("table_status.value = '" . Mage_Catalog_Model_Product_Status::STATUS_ENABLED . "'");
24
+
25
+ //name
26
+ $select->joinLeft(array('table_name' => $name->getBackendTable()), "(table_name.entity_id = e.entity_id AND table_name.attribute_id = $nameId)", array('name' => 'value'));
27
+
28
+ //visibility
29
+ $select->joinLeft(array('table_visibility' => $visibility->getBackendTable()), "(table_visibility.entity_id = e.entity_id AND table_visibility.attribute_id = $visibilityId)", array('visibility' => 'value'))->where("table_visibility.value != '" . Mage_Catalog_Model_Product_Visibility::VISIBILITY_NOT_VISIBLE . "'");
30
+
31
+ $query = $select->query();
32
+
33
+ $dir = Mage::getBaseDir('var') . '/soshify/';
34
+ $file = 'soshify.csv';
35
+
36
+ mkdir($dir, 0777, true);
37
+
38
+ $fh = fopen($dir . '/' . $file, 'w');
39
+ $csv = new Varien_File_Csv();
40
+
41
+ while ($product = $query->fetch()){
42
+
43
+ $csv->fputcsv($fh, $product);
44
+
45
+ }
46
+
47
+ fclose($fh);
48
+
49
+ }
50
+
51
+ public function exportAction(){
52
+
53
+ $resource = Mage::getSingleton('core/resource');
54
+ $readConnection = $resource->getConnection('core_read');
55
+ $productResource = Mage::getModel('catalog/product')->getResource();
56
+
57
+ $name = $productResource->getAttribute('name');
58
+ $photos = $productResource->getAttribute('instagram_photos');
59
+
60
+ $nameId = $name->getId();
61
+ $photosId = $photos->getId();
62
+
63
+ $select = $readConnection->select();
64
+ $select = $select->from(array('e' => $resource->getTableName('catalog/product')), array('sku'))->where(new Zend_Db_Expr('sku IS NOT NULL'));
65
+
66
+ //name
67
+ $select->joinLeft(array('table_name' => $name->getBackendTable()), "(table_name.entity_id = e.entity_id AND table_name.attribute_id = $nameId)", array('name' => 'value'));
68
+
69
+ //name
70
+ $select->joinLeft(array('table_photos' => $photos->getBackendTable()), "(table_photos.entity_id = e.entity_id AND table_photos.attribute_id = $photosId)", array('photos' => 'value'));
71
+
72
+ $query = $select->query();
73
+
74
+ $ids = array();
75
+
76
+ while ($product = $query->fetch()){
77
+
78
+ $theseIds = explode(',', $product['photos']);
79
+
80
+ if (count($theseIds)){
81
+
82
+ foreach ($theseIds as $id){
83
+
84
+ if (empty($id)) continue;
85
+
86
+ if (!isset($ids[$id])) $ids[$id] = array();
87
+
88
+ $ids[$id][] = $product['sku'];
89
+
90
+ }
91
+
92
+ }
93
+
94
+ }
95
+
96
+ $dir = Mage::getBaseDir('var') . '/soshify/';
97
+ $file = 'soshify-photos.csv';
98
+
99
+ $fh = fopen($dir . '/' . $file, 'w');
100
+ $csv = new Varien_File_Csv();
101
+
102
+ foreach ($ids as $id => $products){
103
+
104
+ $csv->fputcsv($fh, array(
105
+ 'code' => $id,
106
+ 'products' => implode(',', $products)
107
+ ));
108
+
109
+ }
110
+
111
+ fclose($fh);
112
+
113
+ }
114
+
115
+ }
app/code/local/Recapture/Connector/etc/config.xml ADDED
@@ -0,0 +1,114 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Recapture_Connector>
5
+ <version>0.1.0</version>
6
+ </Recapture_Connector>
7
+ </modules>
8
+
9
+ <global>
10
+
11
+ <blocks>
12
+ <recapture>
13
+ <class>Recapture_Connector_Block</class>
14
+ </recapture>
15
+ </blocks>
16
+
17
+ <helpers>
18
+ <recapture>
19
+ <class>Recapture_Connector_Helper</class>
20
+ </recapture>
21
+ </helpers>
22
+
23
+ <events>
24
+
25
+ <sales_quote_save_after>
26
+ <observers>
27
+ <recapture_cart_update>
28
+ <type>singleton</type>
29
+ <class>Recapture_Connector_Model_Observer</class>
30
+ <method>quoteUpdate</method>
31
+ </recapture_cart_update>
32
+ </observers>
33
+ </sales_quote_save_after>
34
+
35
+ <sales_quote_delete_after>
36
+ <observers>
37
+ <recapture_cart_update>
38
+ <type>singleton</type>
39
+ <class>Recapture_Connector_Model_Observer</class>
40
+ <method>quoteDelete</method>
41
+ </recapture_cart_update>
42
+ </observers>
43
+ </sales_quote_delete_after>
44
+
45
+ <sales_order_place_after>
46
+ <observers>
47
+ <recapture_cart_conversion>
48
+ <type>singleton</type>
49
+ <class>Recapture_Connector_Model_Observer</class>
50
+ <method>cartConversion</method>
51
+ </recapture_cart_conversion>
52
+ </observers>
53
+ </sales_order_place_after>
54
+ </events>
55
+
56
+ </global>
57
+
58
+ <frontend>
59
+ <routers>
60
+ <recapture>
61
+ <use>standard</use>
62
+ <args>
63
+ <module>Recapture_Connector</module>
64
+ <frontName>recapture</frontName>
65
+ </args>
66
+ </recapture>
67
+ </routers>
68
+ <layout>
69
+ <updates>
70
+ <recapture>
71
+ <file>recapture.xml</file>
72
+ </recapture>
73
+ </updates>
74
+ </layout>
75
+ </frontend>
76
+
77
+ <admin>
78
+ <routers>
79
+ <recapture_admin>
80
+ <use>admin</use>
81
+ <args>
82
+ <module>Recapture_Connector_Adminhtml</module>
83
+ <frontName>recapture_admin</frontName>
84
+ </args>
85
+ </recapture_admin>
86
+ </routers>
87
+ </admin>
88
+
89
+ <adminhtml>
90
+ <acl>
91
+ <resources>
92
+ <all>
93
+ <title>Allow Everything</title>
94
+ </all>
95
+ <admin>
96
+ <children>
97
+ <system>
98
+ <children>
99
+ <config>
100
+ <children>
101
+ <recapture>
102
+ <title>Recapture Connector - All</title>
103
+ </recapture>
104
+ </children>
105
+ </config>
106
+ </children>
107
+ </system>
108
+ </children>
109
+ </admin>
110
+ </resources>
111
+ </acl>
112
+ </adminhtml>
113
+
114
+ </config>
app/code/local/Recapture/Connector/etc/system.xml ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <config>
3
+ <tabs>
4
+ <recapture translate="label" module="recapture">
5
+ <label>Recapture Connector</label>
6
+ <sort_order>100</sort_order>
7
+ </recapture>
8
+ </tabs>
9
+ <sections>
10
+ <recapture translate="label" module="soshify">
11
+ <label>Extension Options</label>
12
+ <tab>recapture</tab>
13
+ <sort_order>1000</sort_order>
14
+ <show_in_default>1</show_in_default>
15
+ <show_in_website>1</show_in_website>
16
+ <show_in_store>1</show_in_store>
17
+
18
+ <groups>
19
+ <configuration translate="label" module="soshify">
20
+ <label>Configuration</label>
21
+ <frontend_type>text</frontend_type>
22
+ <sort_order>1000</sort_order>
23
+ <show_in_default>1</show_in_default>
24
+ <show_in_website>1</show_in_website>
25
+ <show_in_store>1</show_in_store>
26
+
27
+ <fields>
28
+ <status translate="label">
29
+ <label>Authentication Status</label>
30
+ <sort_order>0</sort_order>
31
+ <type>text</type>
32
+ <show_in_default>1</show_in_default>
33
+ <show_in_website>1</show_in_website>
34
+ <show_in_store>1</show_in_store>
35
+ <frontend_model>recapture/adminhtml_system_config_status</frontend_model>
36
+ </status>
37
+ <authenticate translate="label">
38
+ <label>Authenticate Account</label>
39
+ <sort_order>1</sort_order>
40
+ <type>button</type>
41
+ <show_in_default>1</show_in_default>
42
+ <show_in_website>1</show_in_website>
43
+ <show_in_store>1</show_in_store>
44
+ <frontend_model>recapture/adminhtml_system_config_authenticate</frontend_model>
45
+ </authenticate>
46
+ <enabled translate="label">
47
+ <label>Enabled</label>
48
+ <frontend_type>select</frontend_type>
49
+ <sort_order>2</sort_order>
50
+ <show_in_default>1</show_in_default>
51
+ <show_in_website>1</show_in_website>
52
+ <show_in_store>1</show_in_store>
53
+ <source_model>adminhtml/system_config_source_yesno</source_model>
54
+ </enabled>
55
+ <api_key translate="label">
56
+ <label>API Key</label>
57
+ <frontend_type>text</frontend_type>
58
+ <frontend_model>recapture/adminhtml_system_config_key</frontend_model>
59
+ <sort_order>20</sort_order>
60
+ <show_in_default>1</show_in_default>
61
+ <show_in_website>1</show_in_website>
62
+ <show_in_store>1</show_in_store>
63
+ </api_key>
64
+ </fields>
65
+ </configuration>
66
+ </groups>
67
+ </recapture>
68
+ </sections>
69
+ </config>
app/etc/modules/Recapture_Connector.xml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <Recapture_Connector>
5
+ <active>true</active>
6
+ <codePool>local</codePool>
7
+ </Recapture_Connector>
8
+ </modules>
9
+ </config>
package.xml ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>recapture</name>
4
+ <version>1.0.0</version>
5
+ <stability>stable</stability>
6
+ <license>OSL</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Free analytics dashboard for abandoned carts. Set up automated cart recovery email campaigns in minutes.</summary>
10
+ <description>Free analytics dashboard for abandoned carts. Set up automated cart recovery email campaigns in minutes.</description>
11
+ <notes>Initial production release</notes>
12
+ <authors><author><name>David Webber</name><user>Adstream</user><email>david@adstreaminc.com</email></author></authors>
13
+ <date>2015-07-09</date>
14
+ <time>22:53:31</time>
15
+ <contents><target name="magelocal"><dir name="Recapture"><dir name="Connector"><dir name="Block"><dir name="Adminhtml"><dir name="System"><dir name="Config"><file name="Authenticate.php" hash="b4def4c279d801f7e9c327d8ee87c414"/><file name="Key.php" hash="f95c74992894b0a823793ef605c103e1"/><file name="Status.php" hash="003133a47fb37e6f522314778eec9632"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="AuthenticateController.php" hash="1c5ad4701f9fc353c1f387212ea0c0c5"/></dir><file name="ExportController.php" hash="6da6668ecd201d5dbc627b831c3b37ba"/></dir><dir name="etc"><file name="config.xml" hash="76f5b73047cb0efbec06b847f55a0d00"/><file name="system.xml" hash="45be095b48cbb0c6f24003d5db492e71"/></dir><dir name="Helper"><file name="Data.php" hash="a20da6edda255919ade055203ac459ac"/><file name="Transport.php" hash="a13bf58b13e207f5260fe2bdbe86fb5e"/></dir><dir name="Model"><file name="Observer.php" hash="3dbcbfc25944aedb3cc6658c495bb70b"/></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Recapture_Connector.xml" hash="e8fea9dc4237af6b34219c7f52bd02d8"/></dir></target></contents>
16
+ <compatible/>
17
+ <dependencies><required><php><min>5.1.0</min><max>6.0.0</max></php></required></dependencies>
18
+ </package>