Swift_Swiftplugin - Version 1.6.0

Version Notes

Revamp of order feed and product to rely on parameters from the SwiftERM system.

Download this release

Release Info

Developer Simon Cooper
Extension Swift_Swiftplugin
Version 1.6.0
Comparing to
See all releases


Code changes from version 1.5.0 to 1.6.0

app/code/community/Swift/Swiftplugin/Helper/Data.php CHANGED
@@ -62,8 +62,24 @@ class Swift_Swiftplugin_Helper_Data extends Mage_Core_Helper_Abstract {
62
  $arr['plugin_version'] = (string)Mage::getConfig()->getNode()->modules->Swift_Swiftplugin->version;
63
  $arr['host'] = $_SERVER['HTTP_HOST'];
64
  $arr['magento_version'] = Mage::getVersion();
 
65
 
66
- return json_encode($arr);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
67
  }
68
  }
69
 
62
  $arr['plugin_version'] = (string)Mage::getConfig()->getNode()->modules->Swift_Swiftplugin->version;
63
  $arr['host'] = $_SERVER['HTTP_HOST'];
64
  $arr['magento_version'] = Mage::getVersion();
65
+ $arr['php'] = phpversion();
66
 
67
+ $modules = Mage::getConfig()->getNode('modules')->children();
68
+ $modulesArray = (array)$modules;
69
+ $module_output = array();
70
+ foreach($modulesArray as $module_name => $module) {
71
+ $module_output[$module_name] = $module->is('active');
72
+ }
73
+ $arr['modules'] = $module_output;
74
+
75
+ $api_version = new SwiftAPI_Request_Version($_SERVER['HTTP_HOST'],$arr);
76
+ $key = hex2bin(Mage::helper('swift/Data')->getSwiftPrivateKey());
77
+ if (!is_bool($key) && !is_null($key)) {
78
+ echo SwiftAPI::Encode($api_version, hex2bin(Mage::helper('swift/Data')->getSwiftPrivateKey()));
79
+ }
80
+ else {
81
+ json_encode($arr);
82
+ }
83
  }
84
  }
85
 
app/code/community/Swift/Swiftplugin/Model/XmlProduct.php CHANGED
@@ -12,8 +12,11 @@ class Swift_Swiftplugin_Model_XmlProduct {
12
 
13
  protected $offset;
14
 
 
 
15
  public function __construct() {
16
  $this->offset = 1;
 
17
  }
18
 
19
  public function setOffset($offset = 1) {
@@ -22,18 +25,23 @@ class Swift_Swiftplugin_Model_XmlProduct {
22
  }
23
  }
24
 
 
 
 
 
 
 
25
  /**
26
  * Retrieves product details and generates the appropriate response to the request
27
  *
28
  */
29
  public function generate_xml() {
30
  //limit the data parsed
31
- $limit = 100;
32
  $productCollection = Mage::getModel('catalog/product')->getCollection()
33
  ->addAttributeToSelect(array('product_id','name','description', 'short_description','price','url_path','image','thumbnail', 'small_image','special_price','sku','special_to_date', 'special_from_date'))
34
  ->addAttributeToFilter('status', array('eq' => Mage_Catalog_Model_Product_Status::STATUS_ENABLED))
35
  ->setCurPage($this->offset)
36
- ->setPageSize($limit);
37
 
38
  $xmlRow = array();
39
  $xml = new xml();
12
 
13
  protected $offset;
14
 
15
+ protected $limit;
16
+
17
  public function __construct() {
18
  $this->offset = 1;
19
+ $this->limit = 100;
20
  }
21
 
22
  public function setOffset($offset = 1) {
25
  }
26
  }
27
 
28
+ public function setLimit($limit = 100) {
29
+ if (is_numeric($limit)) {
30
+ $this->limit = $limit;
31
+ }
32
+ }
33
+
34
  /**
35
  * Retrieves product details and generates the appropriate response to the request
36
  *
37
  */
38
  public function generate_xml() {
39
  //limit the data parsed
 
40
  $productCollection = Mage::getModel('catalog/product')->getCollection()
41
  ->addAttributeToSelect(array('product_id','name','description', 'short_description','price','url_path','image','thumbnail', 'small_image','special_price','sku','special_to_date', 'special_from_date'))
42
  ->addAttributeToFilter('status', array('eq' => Mage_Catalog_Model_Product_Status::STATUS_ENABLED))
43
  ->setCurPage($this->offset)
44
+ ->setPageSize($this->limit);
45
 
46
  $xmlRow = array();
47
  $xml = new xml();
app/code/community/Swift/Swiftplugin/controllers/OrdersController.php CHANGED
@@ -18,7 +18,9 @@ class Swift_Swiftplugin_OrdersController extends Mage_Core_Controller_Front_Acti
18
  $domain = $_SERVER['HTTP_HOST'];
19
  $user = Mage::helper('swift/Data')->generateUserId();
20
  $url = 'http:'.SwiftApi::SWIFTAPI_CRM_URL;
21
- $limit = 1000;
 
 
22
 
23
  $orderCollection = Mage::getModel('sales/order')->getCollection()
24
  ->addFieldToSelect(array(
@@ -28,51 +30,60 @@ class Swift_Swiftplugin_OrdersController extends Mage_Core_Controller_Front_Acti
28
  'customer_lastName',
29
  'created_at'
30
  ))
31
- ->addAttributeToFilter('created_at' , array('gt' => date('Y-m-d H:i:s', strtotime('-2 years'))))
32
- ->setCurPage($this->getRequest()->getParam('offset'))
33
- ->setPageSize($limit);
 
34
 
35
- $orders_present = false;
36
- foreach($orderCollection as $order) {
37
 
38
- $visibleItems = $order->getAllVisibleItems();
39
- $orders_present = true;
40
-
41
- $products = array();
42
- foreach($visibleItems as $order_item_key => $orderItem) {
43
- $products[] = array('product' => $orderItem->getId(), 'price' => $orderItem->getPrice(), 'quantity' => $orderItem->getData('qty_ordered'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
45
- $request = new SwiftAPI_Request_PastOrder($domain, $user, $order->getCustomerEmail(), $order->getCustomerFirstname(), $order->getCustomerLastname(), $products, $order->getId(), null, null, $order->getCreatedAt());
46
-
47
- $options = array (
48
- 'http' => array(
49
- 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
50
- 'method' => 'POST',
51
- 'content' => SwiftAPI::Query($request, $key)
52
- )
53
- );
54
-
55
- $context = stream_context_create($options);
56
- file_get_contents($url, false, $context);
57
 
58
- }
59
-
60
- if ($limit > $orderCollection->count()) {
61
- $response = array();
62
- $response['status'] = 2;
63
- $response['message'] = 'No more orders to send';
 
 
 
 
64
  }
65
  else {
66
  $response = array();
67
- $response['status'] = $orders_present ? 1 : 0;
68
- $response['message'] = $orders_present ? 'Past orders successfully sent to swift' : 'No more orders to send';
69
  }
70
  }
71
  else {
72
  $response = array();
73
  $response['status'] = 0;
74
  $response['message'] = 'You cannot perform this operation as you have not registered your private key with swift';
75
- }
 
76
  echo json_encode($response);
77
 
78
  }
18
  $domain = $_SERVER['HTTP_HOST'];
19
  $user = Mage::helper('swift/Data')->generateUserId();
20
  $url = 'http:'.SwiftApi::SWIFTAPI_CRM_URL;
21
+ $limit = is_numeric($this->getRequest()->getParam('limit')) ? $this->getRequest()->getParam('limit') : 500;
22
+ $offset = is_numeric($this->getRequest()->getParam('offset')) ? $this->getRequest()->getParam('offset') : 1;
23
+ $date = $this->getRequest()->getParam('date') ? $this->getRequest()->getParam('date') : date('Y-m-d');
24
 
25
  $orderCollection = Mage::getModel('sales/order')->getCollection()
26
  ->addFieldToSelect(array(
30
  'customer_lastName',
31
  'created_at'
32
  ))
33
+ ->addAttributeToFilter('created_at' , array('gt' => date('Y-m-d', strtotime($date.'-2 years'))))
34
+ ->setCurPage($offset)
35
+ ->setPageSize($limit)
36
+ ->setOrder('created_at', 'ASC');
37
 
38
+ if ($offset <= $orderCollection->getLastPageNumber()) {
 
39
 
40
+ foreach($orderCollection as $order) {
41
+
42
+ $visibleItems = $order->getAllVisibleItems();
43
+ $products = array();
44
+
45
+ foreach($visibleItems as $order_item_key => $orderItem) {
46
+ $products[] = array('product' => $orderItem->getId(), 'price' => $orderItem->getPrice(), 'quantity' => $orderItem->getData('qty_ordered'));
47
+ }
48
+
49
+ $request = new SwiftAPI_Request_PastOrder($domain, $user, $order->getCustomerEmail(), $order->getCustomerFirstname(), $order->getCustomerLastname(), $products, $order->getId(), null, null, $order->getCreatedAt());
50
+
51
+ $options = array (
52
+ 'http' => array(
53
+ 'header' => "Content-type: application/x-www-form-urlencoded\r\n",
54
+ 'method' => 'POST',
55
+ 'content' => SwiftAPI::Query($request, $key)
56
+ )
57
+ );
58
+
59
+ $context = stream_context_create($options);
60
+ file_get_contents($url, false, $context);
61
+
62
  }
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
+ if ($limit > $orderCollection->count()) {
65
+ $response = array();
66
+ $response['status'] = 3;
67
+ $response['message'] = 'No more orders to send at this time, but has not fetched a full '. $limit;
68
+ }
69
+ else {
70
+ $response = array();
71
+ $response['status'] = 1;
72
+ $response['message'] = 'Past orders successfully sent to swift';
73
+ }
74
  }
75
  else {
76
  $response = array();
77
+ $response['status'] = 2;
78
+ $response['message'] = 'No more orders to send at this time';
79
  }
80
  }
81
  else {
82
  $response = array();
83
  $response['status'] = 0;
84
  $response['message'] = 'You cannot perform this operation as you have not registered your private key with swift';
85
+ }
86
+
87
  echo json_encode($response);
88
 
89
  }
app/code/community/Swift/Swiftplugin/controllers/XmlController.php CHANGED
@@ -5,6 +5,7 @@ class Swift_Swiftplugin_XmlController extends Mage_Core_Controller_Front_Action
5
  public function feedAction() {
6
  $obj = new Swift_Swiftplugin_Model_XmlProduct();
7
  $obj->setOffset($this->getRequest()->getParam('offset'));
 
8
  $obj->generate_xml();
9
  }
10
  }
5
  public function feedAction() {
6
  $obj = new Swift_Swiftplugin_Model_XmlProduct();
7
  $obj->setOffset($this->getRequest()->getParam('offset'));
8
+ $obj->setLimit($this->getRequest()->getParam('limit'));
9
  $obj->generate_xml();
10
  }
11
  }
app/code/community/Swift/Swiftplugin/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Swift_Swiftplugin>
5
- <version>1.5.0</version>
6
  </Swift_Swiftplugin>
7
  </modules>
8
  <frontend>
2
  <config>
3
  <modules>
4
  <Swift_Swiftplugin>
5
+ <version>1.6.0</version>
6
  </Swift_Swiftplugin>
7
  </modules>
8
  <frontend>
lib/SwiftAPI/SwiftAPI.php CHANGED
@@ -13,20 +13,21 @@ class SwiftAPI
13
 
14
  const VERSION = 3;
15
 
16
- const OPERATION_HOME = 'home';
17
- const OPERATION_PRODUCT = 'product';
18
- const OPERATION_CART = 'cart';
19
- const OPERATION_ORDER = 'order';
20
- const OPERATION_PASTORDER = 'pastorder';
21
- const OPERATION_SUBSCRIPTION= 'subscription';
22
- const OPERATION_VIEWMAIL = 'viewmail';
23
- const OPERATION_SENDMAIL = 'sendmail';
24
- const OPERATION_UNSUBSCRIBE = 'unsubscribe';
 
25
  const OPERATION_PING = 'ping';
26
- const OPERATION_EMAILPACKAGE = 'emailpackage';
27
- const OPERATION_ORDERPACKAGE = 'orderpackage';
28
 
29
- const SWIFTAPI_CRM_URL = '//api.swiftcrm.net';
30
 
31
 
32
  //////////////////////////////////////////////////////////////////////////////
@@ -79,8 +80,9 @@ class SwiftAPI
79
  $json = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv), "\0");
80
 
81
  // Decode json object.
82
- if(!($fields = json_decode($json)))
83
  throw new SwiftAPI_Exception('SwiftAPI::Decode(): ' . json_last_error_msg());
 
84
 
85
  // Create a SwiftAPI_Request object.
86
  $request = SwiftAPI_Request::Create($fields);
13
 
14
  const VERSION = 3;
15
 
16
+ const OPERATION_HOME = 'home';
17
+ const OPERATION_PRODUCT = 'product';
18
+ const OPERATION_CART = 'cart';
19
+ const OPERATION_ORDER = 'order';
20
+ const OPERATION_PASTORDER = 'pastorder';
21
+ const OPERATION_SUBSCRIPTION = 'subscription';
22
+ const OPERATION_VIEWMAIL = 'viewmail';
23
+ const OPERATION_SENDMAIL = 'sendmail';
24
+ const OPERATION_UNSUBSCRIBE = 'unsubscribe';
25
+ const OPERATION_EMAILPACKAGE = 'emailpackage';
26
  const OPERATION_PING = 'ping';
27
+ const OPERATION_ORDERPACKAGE = 'orderpackage';
28
+ const OPERATION_VERSION = 'version';
29
 
30
+ const SWIFTAPI_CRM_URL = '//api.swiftcrm.net';
31
 
32
 
33
  //////////////////////////////////////////////////////////////////////////////
80
  $json = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_MODE_CBC, $iv), "\0");
81
 
82
  // Decode json object.
83
+ if(!($fields = json_decode($json))) {
84
  throw new SwiftAPI_Exception('SwiftAPI::Decode(): ' . json_last_error_msg());
85
+ }
86
 
87
  // Create a SwiftAPI_Request object.
88
  $request = SwiftAPI_Request::Create($fields);
lib/SwiftAPI/SwiftAPI_Request.php CHANGED
@@ -14,6 +14,7 @@ require_once('SwiftAPI_Request_ViewMail.php');
14
  require_once('SwiftAPI_Request_SendMail.php');
15
  require_once('SwiftAPI_Request_EmailPackage.php');
16
  require_once('SwiftAPI_Request_OrderPackage.php');
 
17
 
18
 
19
  abstract class SwiftAPI_Request
@@ -44,7 +45,14 @@ abstract class SwiftAPI_Request
44
  $this -> operation = $operation;
45
  $this -> user = $user;
46
  $this -> version = $version ? $version : SwiftAPI::VERSION;
47
- $this -> date = $date ? $date : date('Y-m-d H:i:s');
 
 
 
 
 
 
 
48
  }
49
 
50
 
@@ -88,6 +96,8 @@ abstract class SwiftAPI_Request
88
  return SwiftAPI_Request_EmailPackage::Create($fields);
89
  case SwiftAPI::OPERATION_ORDERPACKAGE:
90
  return SwiftAPI_Request_OrderPackage::Create($fields);
 
 
91
  default:
92
  throw new SwiftAPI_Exception('SwiftAPI_Request::Create(): Invalid operation: "' . $fields -> operation . '".');
93
  }
14
  require_once('SwiftAPI_Request_SendMail.php');
15
  require_once('SwiftAPI_Request_EmailPackage.php');
16
  require_once('SwiftAPI_Request_OrderPackage.php');
17
+ require_once('SwiftAPI_Request_Version.php');
18
 
19
 
20
  abstract class SwiftAPI_Request
45
  $this -> operation = $operation;
46
  $this -> user = $user;
47
  $this -> version = $version ? $version : SwiftAPI::VERSION;
48
+ try {
49
+ $dateTime = new DateTime();
50
+ }
51
+ catch(Exception $ex) {
52
+ $dateTime = new DateTime('UTC');
53
+ }
54
+
55
+ $this -> date = $date ? $date : $dateTime->format('Y-m-d H:i:s');
56
  }
57
 
58
 
96
  return SwiftAPI_Request_EmailPackage::Create($fields);
97
  case SwiftAPI::OPERATION_ORDERPACKAGE:
98
  return SwiftAPI_Request_OrderPackage::Create($fields);
99
+ case SwiftAPI::OPERATION_VERSION:
100
+ return SwiftAPI_Request_Version::Create($fields);
101
  default:
102
  throw new SwiftAPI_Exception('SwiftAPI_Request::Create(): Invalid operation: "' . $fields -> operation . '".');
103
  }
lib/SwiftAPI/SwiftAPI_Request_Order.php CHANGED
@@ -36,7 +36,6 @@ class SwiftAPI_Request_Order extends SwiftAPI_Request
36
  $this -> orderId = $orderId;
37
  $this -> orderStatus = $orderStatus;
38
 
39
-
40
  parent::__construct($domain, SwiftAPI::OPERATION_ORDER, $user, $version, $date);
41
  }
42
 
36
  $this -> orderId = $orderId;
37
  $this -> orderStatus = $orderStatus;
38
 
 
39
  parent::__construct($domain, SwiftAPI::OPERATION_ORDER, $user, $version, $date);
40
  }
41
 
lib/SwiftAPI/SwiftAPI_Request_OrderPackage.php CHANGED
@@ -32,11 +32,11 @@ class SwiftAPI_Request_OrderPackage extends SwiftAPI_Request {
32
  parent::Validate($fields);
33
 
34
  if(!is_array($fields -> orderPackage))
35
- throw new SwiftAPI_Exception('SwiftAPI_Request_OrderPackage::Create(): "emailPackage" field is missing.');
36
 
37
  foreach ($fields -> orderPackage as $email_content) {
38
  if (!(is_object($email_content))) {
39
- throw new SwiftAPI_Exception('SwiftAPI_Request_OrderPackage::Create(): "emailPackage" does not contain the class SwiftAPI_Request_Order.');
40
  }
41
  }
42
 
32
  parent::Validate($fields);
33
 
34
  if(!is_array($fields -> orderPackage))
35
+ throw new SwiftAPI_Exception('SwiftAPI_Request_OrderPackage::Create(): "orderPackage" field is missing.');
36
 
37
  foreach ($fields -> orderPackage as $email_content) {
38
  if (!(is_object($email_content))) {
39
+ throw new SwiftAPI_Exception('SwiftAPI_Request_OrderPackage::Create(): "orderPackage" does not contain the class SwiftAPI_Request_Order.');
40
  }
41
  }
42
 
lib/SwiftAPI/SwiftAPI_Request_Version.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ ////////////////////////////////////////////////////////////////////////////////
4
+ // Class: SwiftAPI_Request_Version
5
+ ////////////////////////////////////////////////////////////////////////////////
6
+
7
+
8
+ class SwiftAPI_Request_Version extends SwiftAPI_Request
9
+ {
10
+
11
+ //////////////////////////////////////////////////////////////////////////////
12
+ // Public properties.
13
+ //////////////////////////////////////////////////////////////////////////////
14
+
15
+ public $data;
16
+
17
+ //////////////////////////////////////////////////////////////////////////////
18
+ // Public functions
19
+ //////////////////////////////////////////////////////////////////////////////
20
+
21
+ ////////////////////////
22
+ // Public: __construct()
23
+ ////////////////////////
24
+
25
+ public function __construct($domain, $data) {
26
+ $this -> data = $data;
27
+ parent::__construct($domain, SwiftAPI::OPERATION_VERSION, null, null, null);
28
+ }
29
+
30
+ ///////////////////
31
+ // Public: Create()
32
+ ///////////////////
33
+
34
+ public static function Create(stdClass $fields) {
35
+
36
+ if(empty($fields -> data))
37
+ throw new SwiftAPI_Exception('SwiftAPI_Request_Version::Create(): "data" field is missing or empty.');
38
+
39
+ return new self
40
+ (
41
+ $fields -> domain,
42
+ $fields -> data
43
+ );
44
+
45
+ }
46
+
47
+ }
lib/SwiftAPI/doc/SwiftAPI-Specification.html CHANGED
@@ -79,20 +79,12 @@
79
  </tr>
80
  <tr>
81
  <td>sendmail</td>
82
- <td>The Swift system has generated an email to be sent by a clients site. <strong>Not</strong> for sending to the swift system, this is what is sent to the clients website.</td>
83
  </tr>
84
  <tr>
85
  <td>unsubscribe</td>
86
  <td>A user unsubscribes from the Swift system.</td>
87
  </tr>
88
- <tr>
89
- <td>ping</td>
90
- <td>To confirm to the Swift system the plugin is sending data.</td>
91
- </tr>
92
- <tr>
93
- <td>emailpackage</td>
94
- <td>Packages a group of emails to send to the clients website. <strong>Not</strong> for sending to the swift system, this is what is sent to the clients website.</td>
95
- </tr>
96
  </tbody>
97
  </table>
98
 
@@ -222,34 +214,6 @@
222
  <td></td>
223
  <td>Message content for a swift email.</td>
224
  </tr>
225
- <tr>
226
- <td>key</td>
227
- <td>String</td>
228
- <td>ping</td>
229
- <td></td>
230
- <td>The Swift system key recieved upon registration.</td>
231
- </tr>
232
- <tr>
233
- <td>monitor</td>
234
- <td>Boolean</td>
235
- <td>sendmail</td>
236
- <td></td>
237
- <td>A flag to indicate an email is being monitored.</td>
238
- </tr>
239
- <tr>
240
- <td>emailId</td>
241
- <td>String</td>
242
- <td>sendmail, viewmail</td>
243
- <td></td>
244
- <td>A unique identifier from Swift system for logging.</td>
245
- </tr>
246
- <tr>
247
- <td>emailPackage</td>
248
- <td>Array</td>
249
- <td>emailpackage</td>
250
- <td></td>
251
- <td>An array of JSON objects containing the fields sendmail required fields</td>
252
- </tr>
253
  </tbody>
254
  </table>
255
 
@@ -280,39 +244,6 @@
280
  </tr>
281
  </tbody>
282
  </table>
283
-
284
- <h2>Transfer Methods</h2>
285
- <p>You can send the data string across different transfer methods such as SOAP. Here is an example request via JS:</p>
286
- <pre>&lt;script language=&quot;javascript&quot; type=&quot;text/javascript&quot;&gt;
287
- window.onload = function()
288
- {
289
- // notice the version, domain and data attributes in the request
290
- var query = &quot;version=3&amp;domain=test_magento.clients.netready.biz&amp;data=ypyiyeQE8Ve3FGNySm9YQ2t%2BGFOnwzPrs3Eh%2Bo9bAu9BgnNVqEPSU%2FGt1CwwvV6WdezRSm%2FKp2OK7nt95A1oYLkIt7LPdA0mX%2F2pucHHoiriBtdL%2F4lAk%2BdE4T0i7VcXb4OKZWMczv7n2%2FMygvBD03w%2F1kVNFHWAlQGhDYP5fDg16%2FhKGHB6jUdRTfUavWR7GG8jIv2obzLZs%2FXVoO%2BSFyB6Q%2FGNJ1hNZBgkqb6Zq7%2ByyjpcVc20s%2FB1%2BmUPOqHPTklu6GINtwsxq4tFANU7OHL10nS8fcYVUuDAOfav98o%3D&quot;;
291
- var http;
292
-
293
- // IE7+, Firefox, Chrome, Opera, Safari.
294
- if(window.XMLHttpRequest)
295
- http=new XMLHttpRequest();
296
-
297
- // IE6, IE5.
298
- else
299
- http=new ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);
300
-
301
- http.open(&quot;POST&quot;,&quot;//api.swiftcrm.net&quot;, true);
302
-
303
- http.setRequestHeader(&quot;Content-type&quot;, &quot;application/x-www-form-urlencoded&quot;);
304
- http.setRequestHeader(&quot;Content-length&quot;, query.length);
305
- http.setRequestHeader(&quot;Connection&quot;, &quot;close&quot;);
306
-
307
- http.onreadystatechange= function()
308
- {
309
- if (http.readyState==4 &amp;&amp; http.status==200)
310
- console.log(&quot;success&quot;);
311
- }
312
-
313
- http.send(query);
314
- }
315
- &lt;/script&gt;</pre>
316
 
317
  </body>
318
 
79
  </tr>
80
  <tr>
81
  <td>sendmail</td>
82
+ <td>The Swift system has generated an email to be sent by a clients site.</td>
83
  </tr>
84
  <tr>
85
  <td>unsubscribe</td>
86
  <td>A user unsubscribes from the Swift system.</td>
87
  </tr>
 
 
 
 
 
 
 
 
88
  </tbody>
89
  </table>
90
 
214
  <td></td>
215
  <td>Message content for a swift email.</td>
216
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
  </tbody>
218
  </table>
219
 
244
  </tr>
245
  </tbody>
246
  </table>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
 
248
  </body>
249
 
lib/SwiftAPI/doc/SwiftAPI-Specification_v3.html ADDED
@@ -0,0 +1,326 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <html>
2
+
3
+ <head>
4
+ <title>SwiftAPI Specification</title>
5
+
6
+ <style>
7
+ body
8
+ {
9
+ font-family: sans-serif;
10
+ color: #333;
11
+ }
12
+
13
+ table
14
+ {
15
+ border-collapse: collapse;
16
+ }
17
+
18
+ thead
19
+ {
20
+ background-color: LightSteelBlue;
21
+ border-bottom: 3px double Gray;
22
+ }
23
+
24
+ td, th
25
+ {
26
+ border:1px solid Gray;
27
+ padding: 0.2em;
28
+ }
29
+ </style>
30
+
31
+ </head>
32
+
33
+ <body>
34
+
35
+ <h1>SwiftAPI Specification</h1>
36
+
37
+ <h2>Version</h2>
38
+ <p>3</p>
39
+
40
+ <h2>Overview</h2>
41
+ <p>This document details the operations, transfer method, fields, and encryption scheme used to implement the SwiftAPI.</p>
42
+
43
+ <h2 id="Operations">Operations</h2>
44
+ <table>
45
+ <thead>
46
+ <tr>
47
+ <th>Operation</th>
48
+ <th>Incoming / Outgoing to Plugin Operation</th>
49
+ <th>Description</th>
50
+ </tr>
51
+ </thead>
52
+ <tbody>
53
+ <tr>
54
+ <td>home</td>
55
+ <td>outgoing</td>
56
+ <td>A user visits the website's homepage.</td>
57
+ </tr>
58
+ <tr>
59
+ <td>product</td>
60
+ <td>outgoing</td>
61
+ <td>A user visits a product details page - a page that lists all information about a single product.</td>
62
+ </tr>
63
+ <tr>
64
+ <td>cart</td>
65
+ <td>outgoing</td>
66
+ <td>A user adds products to the shopping cart.</td>
67
+ </tr>
68
+ <tr>
69
+ <td>order</td>
70
+ <td>outgoing</td>
71
+ <td>A user successfully places an order on the website.</td>
72
+ </tr>
73
+ <tr>
74
+ <td>pastorder</td>
75
+ <td>outgoing</td>
76
+ <td>When a client first sets up the plugin on their website it will send all historical order data to the Swift system, unless the client decides to opt out.</td>
77
+ </tr>
78
+ <tr>
79
+ <td>subscription</td>
80
+ <td>outgoing</td>
81
+ <td>A user submits their email address to join a newsletter using Magento's standard newsletter subscription feature.</td>
82
+ </tr>
83
+ <tr>
84
+ <td>viewmail</td>
85
+ <td>n/a</td>
86
+ <td>A user accesses the website via a link in one of the SwiftERM system's emails.</td>
87
+ </tr>
88
+ <tr>
89
+ <td>unsubscribe</td>
90
+ <td>n/a</td>
91
+ <td>A user unsubscribes from the SwiftERM system the system will not send them anymore emails.</td>
92
+ </tr>
93
+ <tr>
94
+ <td>emailpackage</td>
95
+ <td>incoming</td>
96
+ <td>The SwiftERM system has generated a series of emails to be sent by a client's site.</td>
97
+ </tr>
98
+ <tr>
99
+ <td>sendmail</td>
100
+ <td>incoming via emailpackage</td>
101
+ <td>The Swift system has generated an email to be sent by a client's site.</td>
102
+ </tr>
103
+ <tr>
104
+ <td>ping</td>
105
+ <td>outgoing</td>
106
+ <td>Upon registration, it tells SwiftERM that the plugin is ready to send data.</td>
107
+ </tr>
108
+ </tbody>
109
+ </table>
110
+
111
+ <h2>Transfer Method</h2>
112
+ <p>Requests to the API will be send via <strong>HTTPS POST</strong>.</p>
113
+
114
+ <h2>POST Format</h2>
115
+ <table>
116
+ <thead>
117
+ <tr>
118
+ <th>Key</th>
119
+ <th>Data Type</th>
120
+ <th>Description</th>
121
+ </tr>
122
+ </thead>
123
+ <tbody>
124
+ <tr>
125
+ <td>version</td>
126
+ <td>Integer</td>
127
+ <td>The API version number.</td>
128
+ </tr>
129
+ <tr>
130
+ <td>domain</td>
131
+ <td>String</td>
132
+ <td>The domain name of the SwiftERM clients site.</td>
133
+ </tr>
134
+ <tr>
135
+ <td>data</td>
136
+ <td>String</td>
137
+ <td>A <strong>base64</strong> encoded string containing an <strong>AES-256</strong> initialization vector followed by a <strong>AES-256</strong> encrypted <strong>JSON</strong> object comprised of the <a href="#DataFields">Data Fields</a> listed below.</td>
138
+ </tr>
139
+ </tbody>
140
+ </table>
141
+
142
+ <h2 id="DataFields">Data Fields</h2>
143
+ <table>
144
+ <thead>
145
+ <tr>
146
+ <th>Field</th>
147
+ <th>Data Type</th>
148
+ <th>Required for Operations</th>
149
+ <th>Optional for Operations</th>
150
+ <th>Description</th>
151
+ </tr>
152
+ </thead>
153
+ <tbody>
154
+ <tr>
155
+ <td>domain</td>
156
+ <td>String</td>
157
+ <td>ALL</td>
158
+ <td></td>
159
+ <td>The domain name of the SwiftERM clients site. (This is required to be duplicated in the data section to prevent forged requests.)</td>
160
+ </tr>
161
+ <tr>
162
+ <td>date</td>
163
+ <td>String - <a href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601 Date</a></td>
164
+ <td>ALL</td>
165
+ <td></td>
166
+ <td>An ISO Date when the request was generated in the format YYYY-MM-DDThh:mm e.g. 2007-04-05T14:30</td>
167
+ </tr>
168
+ <tr>
169
+ <td>operation</td>
170
+ <td>String - <a href="#Operations">SwiftAPI Operation ID</a></td>
171
+ <td>ALL</td>
172
+ <td></td>
173
+ <td>One of the <a href="#Operations">SwiftAPI operation ID's</a></td>
174
+ </tr>
175
+ <tr>
176
+ <td>user</td>
177
+ <td>String - <a href="http://en.wikipedia.org/wiki/Universally_unique_identifier">UUID</a></td>
178
+ <td>ALL</td>
179
+ <td></td>
180
+ <td>A universally unique identifier generated by the SwiftERM client site/plugin used to identify a user over the duration of their visit to a site.</td>
181
+ </tr>
182
+ <tr>
183
+ <td>url</td>
184
+ <td>String</td>
185
+ <td>home</td>
186
+ <td></td>
187
+ <td>The URL of the page where the API request was triggered.</td>
188
+ </tr>
189
+ <tr>
190
+ <td>email</td>
191
+ <td>String</td>
192
+ <td>order, pastorder, subscription, viewmail, sendmail, unsubscribe</td>
193
+ <td>home, product, cart</td>
194
+ <td>The users email address.</td>
195
+ </tr>
196
+ <tr>
197
+ <td>forename</td>
198
+ <td>String</td>
199
+ <td>order, pastorder</td>
200
+ <td></td>
201
+ <td>The users forename.</td>
202
+ </tr>
203
+ <tr>
204
+ <td>surname</td>
205
+ <td>String</td>
206
+ <td>order, pastorder</td>
207
+ <td></td>
208
+ <td>The users surname.</td>
209
+ <tr>
210
+ <td>product</td>
211
+ <td>String</td>
212
+ <td>product, viewmail</td>
213
+ <td></td>
214
+ <td>A site specific product identifier (Should correspond to ID's provided in the sites 'product XML file').</td>
215
+ </tr>
216
+ <tr>
217
+ <td>products</td>
218
+ <td>Array</td>
219
+ <td>cart, order, pastorder</td>
220
+ <td></td>
221
+ <td>An array of JSON objects containing <a href="#ProductFields">Product Fields</a>.</td>
222
+ </tr>
223
+ <tr>
224
+ <td>subject</td>
225
+ <td>String</td>
226
+ <td>sendmail</td>
227
+ <td></td>
228
+ <td>Message subject for a swift email.</td>
229
+ </tr>
230
+ <tr>
231
+ <td>body</td>
232
+ <td>String</td>
233
+ <td>sendmail</td>
234
+ <td></td>
235
+ <td>Message content for a swift email.</td>
236
+ </tr>
237
+ <tr>
238
+ <td>orderId</td>
239
+ <td>String</td>
240
+ <td>order, pastorder</td>
241
+ <td></td>
242
+ <td>The client system's unique order identifier, typically an order Id</td>
243
+ </tr>
244
+ <tr>
245
+ <td>orderStatus</td>
246
+ <td>String</td>
247
+ <td>order, pastorder</td>
248
+ <td></td>
249
+ <td>The client system order's current status of an order</td>
250
+ </tr>
251
+ <tr>
252
+ <td>emailId</td>
253
+ <td>String</td>
254
+ <td>viewmail, sendmail</td>
255
+ <td></td>
256
+ <td>The system identifier to identify what email was clicked on.</td>
257
+ </tr>
258
+ <tr>
259
+ <td>monitor</td>
260
+ <td>String</td>
261
+ <td>sendmail</td>
262
+ <td></td>
263
+ <td>If present, the client site shall also send an email to the email address specified in the field.</td>
264
+ </tr>
265
+ <tr>
266
+ <td>key</td>
267
+ <td>String</td>
268
+ <td>ping</td>
269
+ <td></td>
270
+ <td>The Site Key that the SwiftERM has generated.</td>
271
+ </tr>
272
+ <tr>
273
+ <td>emailPackage</td>
274
+ <td>String</td>
275
+ <td>emailpackage</td>
276
+ <td></td>
277
+ <td>Contains a collection of sendmail packages that were sent from the SwiftERM system.</td>
278
+ </tr>
279
+ <tr>
280
+ <td>site</td>
281
+ <td>String</td>
282
+ <td>emailpackage</td>
283
+ <td></td>
284
+ <td>Contains a site unique identifier in the SwiftERM system.</td>
285
+ </tr>
286
+ <tr>
287
+ <td>is_mail_function</td>
288
+ <td>String</td>
289
+ <td>emailpackage</td>
290
+ <td></td>
291
+ <td>Tells the plugin to use mail function rather than smtp, if present.</td>
292
+ </tr>
293
+ </tbody>
294
+ </table>
295
+
296
+ <h2 id="ProductFields">Product Fields</h2>
297
+ <table>
298
+ <thead>
299
+ <tr>
300
+ <th>Field</th>
301
+ <th>Data Type</th>
302
+ <th>Description</th>
303
+ </tr>
304
+ </thead>
305
+ <tbody>
306
+ <tr>
307
+ <td>product</td>
308
+ <td>String</td>
309
+ <td>A site specific product identifier (Should correspond to ID's provided in the sites 'product XML file').</td>
310
+ </tr>
311
+ <tr>
312
+ <td>quantity</td>
313
+ <td>Integer</td>
314
+ <td>The number of products in the order.</td>
315
+ </tr>
316
+ <tr>
317
+ <td>price</td>
318
+ <td>String</td>
319
+ <td>The product price (May potentially differ from the value specified in the sites 'product XML file').</td>
320
+ </tr>
321
+ </tbody>
322
+ </table>
323
+
324
+ </body>
325
+
326
+ </html>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Swift_Swiftplugin</name>
4
- <version>1.5.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/LGPL-3.0">LGPL</license>
7
  <channel>community</channel>
@@ -18,11 +18,11 @@ The extension uses background JavaScript calls to collect and store the customer
18
  &lt;p&gt;&#xD;
19
  The extension is easy to set up and uses Magento&#x2019;s built in features to collect information and send emails to the customers. Visit swiftcrm.net for prices and free trails.&#xD;
20
  &lt;/p&gt;</description>
21
- <notes>Fetches products in chunks rather than one big xml to save memory.</notes>
22
  <authors><author><name>Simon Cooper</name><user>Netready</user><email>simon@netready.biz</email></author></authors>
23
- <date>2016-08-26</date>
24
- <time>15:58:50</time>
25
- <contents><target name="magelib"><dir name="libXML"><file name="xml.php" hash="c20ca4a39971acf4605247712186b9ec"/></dir><dir name="SwiftAPI"><file name="SwiftAPI.php" hash="4a3e384d05e8113c34f7251841b0dcbc"/><file name="SwiftAPI_Exception.php" hash="879b899a7961f4de1212b7296ccafb16"/><file name="SwiftAPI_Product.php" hash="063922cccb485d81c6022de5c4e8e044"/><file name="SwiftAPI_Request.php" hash="bbd113950c050532ea131738fb8432cb"/><file name="SwiftAPI_Request_Cart.php" hash="f8955c78200ddb0512adb5214fd64bb2"/><file name="SwiftAPI_Request_EmailPackage.php" hash="1574f461582500a524160d3db8371d37"/><file name="SwiftAPI_Request_Home.php" hash="9268da121dd10db50d5c2675afd1c65e"/><file name="SwiftAPI_Request_Order.php" hash="6e938a92e9949809653e2207a8c5a5c7"/><file name="SwiftAPI_Request_OrderPackage.php" hash="91724705e976182c0bb1d7d7d6fc786f"/><file name="SwiftAPI_Request_PastOrder.php" hash="90ac5fb44bd1ad61f39d277d268e3575"/><file name="SwiftAPI_Request_Ping.php" hash="e5e13b71682f8230711d5d2f28f9a534"/><file name="SwiftAPI_Request_Product.php" hash="e5fab27bb2dd45946ed8c143a18fe3c4"/><file name="SwiftAPI_Request_SendMail.php" hash="ba04382a3df6b3e179aed5fe3e809de7"/><file name="SwiftAPI_Request_Subscription.php" hash="5545738b941d8ca4dca69b6059a0cce4"/><file name="SwiftAPI_Request_Unsubscribe.php" hash="78aa37cc0ecb98d501674350a4a409c9"/><file name="SwiftAPI_Request_ViewMail.php" hash="f0eb0236c7f6e1fa194d8f05f865a7d8"/><dir name="doc"><file name="SwiftAPI-Specification.html" hash="3be495e89f1555d138a9314052e2c627"/></dir><file name="index.php" hash="82886bb98883bd5868ea04c7d8c88ba5"/><file name="php.ini" hash="ef29c923925a1d1bbc8879c22297daa4"/></dir></target><target name="magecommunity"><dir name="Swift"><dir name="Swiftplugin"><dir name="Block"><dir name="Adminhtml"><dir name="Swift"><dir name="Edit"><file name="Form.php" hash="bd80ab8170f7f2286f13ac579e5249d9"/><dir name="Tab"><file name="Form.php" hash="3d15c45cb2205acabc20376f41a9bd5b"/><file name="Instruct.php" hash="9f34075cc9cdfa92b7876c33fda514de"/></dir><file name="Tabs.php" hash="993769f682fad7d28df79ff3acea97cc"/></dir><file name="Edit.php" hash="d93f75dbaaa7266d91e828b3208fbf2d"/></dir></dir><file name="Swiftblock.php" hash="8b4f72297c8af67374c695b44003867d"/></dir><dir name="Helper"><file name="Data.php" hash="4281667b622843620ef59e990b551cec"/></dir><dir name="Model"><dir name="Mysql4"><dir name="Swift"><file name="Collection.php" hash="82de0fe56cd875d3e78c8fc690424ee1"/></dir><file name="Swift.php" hash="252d5f2ecb1119804b415758d2db6800"/></dir><file name="Observer.php" hash="8bb4dd498a57f1166ed1c85a2b8ab0e0"/><file name="Swift.php" hash="1f9e49d4db7f8987cfd8858061fedc6a"/><file name="XmlProduct.php" hash="0ce1132295a312791e0374886b886dab"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="IndexController.php" hash="92604a30880c89fbe7885780520096cc"/></dir><file name="MailController.php" hash="af10fe5d485b1742ba5095510f2deea4"/><file name="OrdersController.php" hash="8e9f8bc8f669ab30fc1793e31a149053"/><file name="VersionController.php" hash="b9bebb51f946430a2dc7bfc82f96bf36"/><file name="XmlController.php" hash="d25b7c6c4fa165211a00b18f108b624a"/></dir><dir name="etc"><file name="config.xml" hash="1bd6f1a7856cacbc24efffbe816e7f33"/></dir><dir name="sql"><dir name="swift_setup"><file name="install-1.1.13.php" hash="2447b5645fc36738373678473cec88dc"/><file name="install-1.1.2.php" hash="00832a00c34cb4c997a96330cb28cbfb"/><file name="upgrade-1.1.2-1.1.12.php" hash="cbe3c3fa07facb7b720d7dd518acbeca"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="swift.xml" hash="d80a5229e30cf4b76f5a5150ac1c27c3"/></dir><dir name="template"><dir name="swift"><file name="swiftplugin.phtml" hash="d4d25148e09529e457b6436d7655627b"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Swift_all.xml" hash="0ae5a788c805a9fc79b402fe7a02e54d"/></dir></target></contents>
26
  <compatible/>
27
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php><extension><name>mcrypt</name><min/><max/></extension></required></dependencies>
28
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Swift_Swiftplugin</name>
4
+ <version>1.6.0</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/LGPL-3.0">LGPL</license>
7
  <channel>community</channel>
18
  &lt;p&gt;&#xD;
19
  The extension is easy to set up and uses Magento&#x2019;s built in features to collect information and send emails to the customers. Visit swiftcrm.net for prices and free trails.&#xD;
20
  &lt;/p&gt;</description>
21
+ <notes>Revamp of order feed and product to rely on parameters from the SwiftERM system.</notes>
22
  <authors><author><name>Simon Cooper</name><user>Netready</user><email>simon@netready.biz</email></author></authors>
23
+ <date>2016-09-07</date>
24
+ <time>11:13:36</time>
25
+ <contents><target name="magelib"><dir name="libXML"><file name="xml.php" hash="c20ca4a39971acf4605247712186b9ec"/></dir><dir name="SwiftAPI"><file name="SwiftAPI.php" hash="8bb2f97586dbd62da6fd0d6781b67ae6"/><file name="SwiftAPI_Exception.php" hash="879b899a7961f4de1212b7296ccafb16"/><file name="SwiftAPI_Product.php" hash="063922cccb485d81c6022de5c4e8e044"/><file name="SwiftAPI_Request.php" hash="f072a4c42fe3767d769f8e9f9c824ecd"/><file name="SwiftAPI_Request_Cart.php" hash="f8955c78200ddb0512adb5214fd64bb2"/><file name="SwiftAPI_Request_EmailPackage.php" hash="1574f461582500a524160d3db8371d37"/><file name="SwiftAPI_Request_Home.php" hash="9268da121dd10db50d5c2675afd1c65e"/><file name="SwiftAPI_Request_Order.php" hash="49ff0d4c501b075f11ef94727d729a75"/><file name="SwiftAPI_Request_OrderPackage.php" hash="45ad4af3b24bfab66f96b493c830ceab"/><file name="SwiftAPI_Request_PastOrder.php" hash="90ac5fb44bd1ad61f39d277d268e3575"/><file name="SwiftAPI_Request_Ping.php" hash="e5e13b71682f8230711d5d2f28f9a534"/><file name="SwiftAPI_Request_Product.php" hash="e5fab27bb2dd45946ed8c143a18fe3c4"/><file name="SwiftAPI_Request_SendMail.php" hash="ba04382a3df6b3e179aed5fe3e809de7"/><file name="SwiftAPI_Request_Subscription.php" hash="5545738b941d8ca4dca69b6059a0cce4"/><file name="SwiftAPI_Request_Unsubscribe.php" hash="78aa37cc0ecb98d501674350a4a409c9"/><file name="SwiftAPI_Request_Version.php" hash="21cebd7eb59698bb0aae55bdeaa23660"/><file name="SwiftAPI_Request_ViewMail.php" hash="f0eb0236c7f6e1fa194d8f05f865a7d8"/><dir name="doc"><file name="SwiftAPI-Specification.html" hash="a31d6c9f13198d017f9f50ac787bea23"/><file name="SwiftAPI-Specification_v3.html" hash="17f8207291313730a72286901c61e44f"/></dir><file name="index.php" hash="82886bb98883bd5868ea04c7d8c88ba5"/><file name="php.ini" hash="ef29c923925a1d1bbc8879c22297daa4"/></dir></target><target name="magecommunity"><dir name="Swift"><dir name="Swiftplugin"><dir name="Block"><dir name="Adminhtml"><dir name="Swift"><dir name="Edit"><file name="Form.php" hash="bd80ab8170f7f2286f13ac579e5249d9"/><dir name="Tab"><file name="Form.php" hash="3d15c45cb2205acabc20376f41a9bd5b"/><file name="Instruct.php" hash="9f34075cc9cdfa92b7876c33fda514de"/></dir><file name="Tabs.php" hash="993769f682fad7d28df79ff3acea97cc"/></dir><file name="Edit.php" hash="d93f75dbaaa7266d91e828b3208fbf2d"/></dir></dir><file name="Swiftblock.php" hash="8b4f72297c8af67374c695b44003867d"/></dir><dir name="Helper"><file name="Data.php" hash="08be234d9cbc17ed98f67a5fd0ca9002"/></dir><dir name="Model"><dir name="Mysql4"><dir name="Swift"><file name="Collection.php" hash="82de0fe56cd875d3e78c8fc690424ee1"/></dir><file name="Swift.php" hash="252d5f2ecb1119804b415758d2db6800"/></dir><file name="Observer.php" hash="8bb4dd498a57f1166ed1c85a2b8ab0e0"/><file name="Swift.php" hash="1f9e49d4db7f8987cfd8858061fedc6a"/><file name="XmlProduct.php" hash="f48e73024a4f1774f0f565d8c480534f"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="IndexController.php" hash="92604a30880c89fbe7885780520096cc"/></dir><file name="MailController.php" hash="af10fe5d485b1742ba5095510f2deea4"/><file name="OrdersController.php" hash="834b71ae87da73b7485535677c337620"/><file name="VersionController.php" hash="b9bebb51f946430a2dc7bfc82f96bf36"/><file name="XmlController.php" hash="e78cc03f619a75d43752e8bde42b0798"/></dir><dir name="etc"><file name="config.xml" hash="059d19d08acabd3d2af72295afa4247c"/></dir><dir name="sql"><dir name="swift_setup"><file name="install-1.1.13.php" hash="2447b5645fc36738373678473cec88dc"/><file name="install-1.1.2.php" hash="00832a00c34cb4c997a96330cb28cbfb"/><file name="upgrade-1.1.2-1.1.12.php" hash="cbe3c3fa07facb7b720d7dd518acbeca"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="swift.xml" hash="d80a5229e30cf4b76f5a5150ac1c27c3"/></dir><dir name="template"><dir name="swift"><file name="swiftplugin.phtml" hash="d4d25148e09529e457b6436d7655627b"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Swift_all.xml" hash="0ae5a788c805a9fc79b402fe7a02e54d"/></dir></target></contents>
26
  <compatible/>
27
  <dependencies><required><php><min>5.2.0</min><max>6.0.0</max></php><extension><name>mcrypt</name><min/><max/></extension></required></dependencies>
28
  </package>