Signifyd_Connect - Version 3.5.3

Version Notes

Supports all versions of Magento

Download this release

Release Info

Developer Magento Core Team
Extension Signifyd_Connect
Version 3.5.3
Comparing to
See all releases


Code changes from version 3.5.2 to 3.5.3

app/code/community/Signifyd/Connect/Model/Link.php CHANGED
@@ -4,6 +4,6 @@ class Signifyd_Connect_Model_Link
4
  {
5
  public function getCommentText()
6
  {
7
- return "Turn this on if you would like to receive signifyd scores. Visit this url to confirm the callback functionality is working: <a href=\"" . Mage::getUrl('signifyd/connect/api') . "\" target=\"_blank\">" . Mage::getUrl('signifyd/connect/api') . "</a>";
8
  }
9
  }
4
  {
5
  public function getCommentText()
6
  {
7
+ return "Turn this on if you would like to receive Signifyd scores. Visit this url to confirm the callback functionality is working: <a href=\"" . Mage::getUrl('signifyd/connect/api') . "\" target=\"_blank\">" . Mage::getUrl('signifyd/connect/api') . "</a>";
8
  }
9
  }
app/code/community/Signifyd/Connect/Model/Observer.php CHANGED
@@ -1,666 +1,688 @@
1
- <?php
2
-
3
- class Signifyd_Connect_Model_Observer extends Varien_Object
4
- {
5
- public $customer = null;
6
- public $order = null;
7
- public $payment = null;
8
- public $quote = null;
9
- public $shipping_address = null;
10
- public $billing_address = null;
11
-
12
- public $joins = 0;
13
-
14
- public function getProducts()
15
- {
16
- $products = array();
17
- $helper = Mage::helper('signifyd_connect');
18
-
19
- foreach ($this->quote->getAllItems() as $item) {
20
- if (!$item->getProductType() || $item->getProductType() == 'simple') {
21
- $product_object = $item->getData('product');
22
-
23
- if (!$product_object || !$product_object->getId()) {
24
- $product_object = Mage::getModel('catalog/product')->load($item->getProductId());
25
- }
26
-
27
- if ($product_object) {
28
- $product = array();
29
-
30
- $product['itemId'] = $item->getSku();
31
- $product['itemName'] = $item->getName();
32
- $product['itemUrl'] = $helper->getProductUrl($product_object);
33
- $product['itemImage'] = $helper->getProductImage($product_object);
34
-
35
- $qty = 1;
36
- if ($item->getQty()) {
37
- $qty = $item->getQty();
38
- } else if ($item->getQtyOrdered()) {
39
- $qty = $item->getQtyOrdered();
40
- }
41
-
42
- $price = 0;
43
- if ($item->getBasePrice() > 0) {
44
- $price = $item->getBasePrice();
45
- } else if ($item->getPrice() > 0) {
46
- $price = $item->getPrice();
47
- } else if ($product_object->getData('price') > 0) {
48
- $price = $product_object->getData('price');
49
- } else {
50
- $parent = $item->getData('parent');
51
-
52
- if (!$parent) {
53
- $parent = $item->getParentItem();
54
- }
55
-
56
- if ($parent) {
57
- if ($parent->getBasePrice() > 0) {
58
- $price = $parent->getBasePrice();
59
- } else if ($parent->getPrice()) {
60
- $price = $parent->getPrice();
61
- }
62
- }
63
- }
64
-
65
- $weight = 0;
66
- if ($item->hasWeight()) {
67
- $weight = $item->getWeight();
68
- } else if ($product_object->hasWeight()) {
69
- $weight = $product_object->getWeight();
70
- }
71
-
72
- $product['itemQuantity'] = intval($qty);
73
- $product['itemPrice'] = floatval($price);
74
- $product['itemWeight'] = floatval($weight);
75
-
76
- $products[] = $product;
77
- }
78
- }
79
- }
80
-
81
- return $products;
82
- }
83
-
84
- public function getIPAddress()
85
- {
86
- if ($this->order->getRemoteIp()) {
87
- if ($this->order->getXForwardedFor()) {
88
- return $this->filterIp($this->order->getXForwardedFor());
89
- }
90
-
91
- return $this->filterIp($this->order->getRemoteIp());
92
- }
93
-
94
- // Checks each configured value in app/etc/local.xml & falls back to REMOTE_ADDR. See app/etc/local.xml.additional for examples.
95
- return $this->filterIp(Mage::helper('core/http')->getRemoteAddr(false));
96
- }
97
-
98
- public function filterIp($ip)
99
- {
100
- $matches = array();
101
-
102
- if (preg_match('/[0-9]{1,3}(?:\.[0-9]{1,3}){3}/', $ip, $matches)) { //ipv4
103
- return current($matches);
104
- }
105
-
106
- if (preg_match('/[a-f0-9]{0,4}(?:\:[a-f0-9]{0,4}){2,7}/', strtolower($ip), $matches)) { //ipv6
107
- return current($matches);
108
- }
109
-
110
- return preg_replace('/[^0-9a-zA-Z:\.]/', '', strtok(str_replace($ip, ',', "\n"), "\n"));
111
- }
112
-
113
- public function formatAvs($value)
114
- {
115
- // http://www.emsecommerce.net/avs_cvv2_response_codes.htm
116
- $codes = array('X', 'Y', 'A', 'W', 'Z', 'N', 'U', 'R', 'E', 'S', 'D', 'M', 'B', 'P', 'C', 'I', 'G');
117
-
118
- if ($value) {
119
- $value = strtoupper($value);
120
-
121
- if (strlen($value) > 1) {
122
- if (preg_match('/\([A-Z]\)/', $value)) {
123
- $matches = array();
124
-
125
- preg_match('/\([A-Z]\)/', $value, $matches);
126
-
127
- foreach ($matches as $match) {
128
- $match = preg_replace('/[^A-Z]/', '', $match);
129
-
130
- if (in_array($match, $codes)) {
131
- $value = $match;
132
- }
133
- }
134
- }
135
- }
136
-
137
- if (strlen($value) > 1) {
138
- $value = substr($value, 0, 1);
139
- }
140
-
141
- if (!in_array($value, $codes)) {
142
- $value = null;
143
- }
144
- }
145
-
146
- return $value;
147
- }
148
-
149
- public function getAvsResponse()
150
- {
151
- $payment = $this->payment;
152
-
153
- $value = null;
154
-
155
- if ($payment->getAdditionalInformation('paypal_avs_code')) {
156
- $value = $payment->getAdditionalInformation('paypal_avs_code');
157
- } else if ($payment->getAdditionalInformation('cc_avs_status')) {
158
- $value = $payment->getAdditionalInformation('cc_avs_status');
159
- }
160
-
161
- return $this->formatAvs($value);
162
- }
163
-
164
- public function getCvvResponse()
165
- {
166
- $payment = $this->payment;
167
-
168
- if ($payment->getAdditionalInformation('paypal_cvv2_match')) {
169
- return $payment->getAdditionalInformation('paypal_cvv2_match');
170
- }
171
-
172
- return null;
173
- }
174
-
175
- public function getPaymentMethod()
176
- {
177
- return $this->payment->getMethod();
178
- }
179
-
180
- public function getPurchase()
181
- {
182
- $purchase = array();
183
-
184
- $purchase['browserIpAddress'] = $this->getIpAddress();
185
- $purchase['orderId'] = $this->order->getIncrementId();
186
- $purchase['createdAt'] = date('c', strtotime($this->order->getCreatedAt())); // e.g: 2004-02-12T15:19:21+00:00
187
- $purchase['currency'] = $this->order->getBaseCurrencyCode();
188
- $purchase['totalPrice'] = floatval($this->order->getGrandTotal());
189
- $purchase['shippingPrice'] = floatval($this->order->getShippingAmount());
190
- $purchase['products'] = $this->getProducts();
191
- $purchase['paymentGateway'] = $this->getPaymentMethod();
192
-
193
- $purchase['avsResponseCode'] = $this->getAvsResponse();
194
- $purchase['cvvResponseCode'] = $this->getCvvResponse();
195
-
196
- return $purchase;
197
- }
198
-
199
- public function getCard()
200
- {
201
- $payment = $this->payment;
202
- $billing = $this->billing_address;
203
-
204
- $card = array();
205
-
206
- $card['cardHolderName'] = null;
207
- $card['bin'] = null;
208
- $card['last4'] = null;
209
- $card['expiryMonth'] = null;
210
- $card['expiryYear'] = null;
211
- $card['hash'] = null;
212
-
213
- $card['billingAddress'] = $this->getBillingAddress();
214
-
215
- if ($payment->getData('cc_last4')) {
216
- $card['last4'] = $payment->getData('cc_last4');
217
- }
218
-
219
- if ($payment->getData('cc_exp_year')) {
220
- $card['expiryYear'] = $payment->getData('cc_exp_year');
221
- }
222
-
223
- if ($payment->getData('cc_exp_month')) {
224
- $card['expiryMonth'] = $payment->getData('cc_exp_month');
225
- }
226
-
227
- if ($payment->getData('cc_number_enc')) {
228
- $card['hash'] = $payment->getData('cc_number_enc');
229
- }
230
-
231
- if ($payment->getData('cc_number') && is_numeric($payment->getData('cc_number')) && strlen((string)$payment->getData('cc_number')) > 6) {
232
- $card['bin'] = substr((string)$payment->getData('cc_number'), 0, 6);
233
- }
234
-
235
- if ($payment->getCcOwner()) {
236
- $card['cardHolderName'] = $payment->getCcOwner();
237
- } else {
238
- $card['cardHolderName'] = $billing->getFirstname() . ' ' . $billing->getLastname();
239
- }
240
-
241
- return $card;
242
- }
243
-
244
- public function getAddress($address_object)
245
- {
246
- $address = array();
247
-
248
- $address['streetAddress'] = $address_object->getStreet1();
249
- $address['unit'] = null;
250
-
251
- if ($address_object->getStreet2()) {
252
- $address['unit'] = $address_object->getStreet2();
253
- }
254
-
255
- $address['city'] = $address_object->getCity();
256
-
257
- $address['provinceCode'] = $address_object->getRegionCode();
258
- $address['postalCode'] = $address_object->getPostcode();
259
- $address['countryCode'] = $address_object->getCountryId();
260
-
261
- $address['latitude'] = null;
262
- $address['longitude'] = null;
263
-
264
- return $address;
265
- }
266
-
267
- public function getBillingAddress()
268
- {
269
- return $this->getAddress($this->billing_address);
270
- }
271
-
272
- public function getShippingAddress()
273
- {
274
- return $this->getAddress($this->shipping_address);
275
- }
276
-
277
- public function getRecipient()
278
- {
279
- $recipient = array();
280
-
281
- $recipient['fullName'] = $this->shipping_address->getFirstname() . ' ' . $this->shipping_address->getLastname();
282
- // Email: Note that this field is always the same for both addresses
283
- $recipient['confirmationEmail'] = $this->shipping_address->getEmail();
284
- if (!$recipient['confirmationEmail']) {
285
- $recipient['confirmationEmail'] = $this->order->getCustomerEmail();
286
- }
287
- $recipient['confirmationPhone'] = $this->shipping_address->getTelephone();
288
-
289
- $recipient['deliveryAddress'] = $this->getShippingAddress();
290
-
291
- return $recipient;
292
- }
293
-
294
- public function getUserAccount()
295
- {
296
- $customer = $this->customer;
297
-
298
- $user = array(
299
- "emailAddress" => null,
300
- "username" => null,
301
- "phone" => null,
302
- "createdDate" => null,
303
- "accountNumber" => null,
304
- "lastOrderId" => null,
305
- "aggregateOrderCount" => null,
306
- "aggregateOrderDollars" => null,
307
- "lastUpdateDate" => null
308
- );
309
-
310
- if ($customer && $customer->getId()) {
311
- $user['emailAddress'] = $customer->getEmail();
312
-
313
- $user['phone'] = $this->billing_address->getTelephone();
314
-
315
- $user['createdDate'] = date('c', strtotime($customer->getCreatedAt()));
316
- $user['lastUpdateDate'] = date('c', strtotime($customer->getUpdatedAt()));
317
-
318
- $user['accountNumber'] = $customer->getId();
319
-
320
- $last_order_id = null;
321
-
322
- $orders = Mage::getModel('sales/order')->getCollection()->addFieldToFilter('customer_id', $customer->getId());
323
- $orders->getSelect()->order('created_at DESC');
324
-
325
- $aggregate_total = 0.;
326
- $order_count = 0;
327
-
328
- foreach ($orders as $order) {
329
- if ($last_order_id === null) {
330
- $last_order_id = $order->getIncrementId();
331
- }
332
-
333
- $aggregate_total += floatval($order->getGrandTotal());
334
- $order_count += 1;
335
- }
336
-
337
- $user['lastOrderId'] = $last_order_id;
338
- $user['aggregateOrderCount'] = $order_count;
339
- $user['aggregateOrderDollars'] = floatval($aggregate_total);
340
- }
341
-
342
- return $user;
343
- }
344
-
345
- public function getUrl()
346
- {
347
- if ($this->hasData('url')) {
348
- return $this->getData('url');
349
- }
350
-
351
- return Mage::getStoreConfig('signifyd_connect/settings/url') . '/cases';
352
- }
353
-
354
- public function getAuth()
355
- {
356
- if ($this->hasData('auth')) {
357
- return $this->getData('auth');
358
- }
359
-
360
- return Mage::getStoreConfig('signifyd_connect/settings/key');
361
- }
362
-
363
- public function submitCase($case)
364
- {
365
- $case = json_encode($case);
366
-
367
- return Mage::helper('signifyd_connect')->request($this->getUrl(), $case, $this->getAuth(), 'application/json');
368
- }
369
-
370
- public function generateCase()
371
- {
372
- $case = array();
373
-
374
- $case['purchase'] = $this->getPurchase();
375
- $case['recipient'] = $this->getRecipient();
376
- $case['card'] = $this->getCard();
377
- $case['userAccount'] = $this->getUserAccount();
378
-
379
- return $case;
380
- }
381
-
382
- public function getInvoiced($order)
383
- {
384
- $collection = $order->getInvoiceCollection();
385
-
386
- foreach ($collection as $invoice) {
387
- return true;
388
- }
389
-
390
- return false;
391
- }
392
-
393
- public function openCase($observer)
394
- {
395
- try {
396
- if (!Mage::getStoreConfig('signifyd_connect/settings/enabled') && !$this->getEnabled()) {
397
- return;
398
- }
399
-
400
- $event = $observer->getEvent();
401
-
402
- if ($event->hasOrder()) {
403
- $order = $event->getOrder();
404
- } else if ($event->hasObject()) {
405
- $order = $event->getObject();
406
- }
407
-
408
- $order_model = get_class(Mage::getModel('sales/order'));
409
-
410
- if (!($order instanceof $order_model)) {
411
- return;
412
- }
413
-
414
- if ($order && $order->getId()) {
415
- if (Mage::helper('signifyd_connect')->isProcessed($order) && !$this->getForceProcess()) {
416
- return;
417
- }
418
-
419
- $payments = $order->getPaymentsCollection();
420
-
421
- foreach ($payments as $payment) {
422
- $this->payment = $payment;
423
- }
424
-
425
- $method = $this->payment->getMethod();
426
-
427
- $state = $order->getState();
428
-
429
- if (!$state || $state == Mage_Sales_Model_Order::STATE_PENDING_PAYMENT) {
430
- return;
431
- }
432
-
433
- $this->order = $order;
434
- $this->billing_address = $order->getBillingAddress();
435
- $this->shipping_address = $order->getShippingAddress();
436
-
437
- if (!$this->shipping_address) {
438
- $this->shipping_address = $this->billing_address;
439
- }
440
-
441
- if ($order->getCustomer()) {
442
- $this->customer = $order->getCustomer();
443
- }
444
-
445
- $this->quote = $order->getQuote();
446
-
447
- if (!$this->quote) {
448
- $this->quote = $order;
449
- }
450
-
451
- $case = $this->generateCase();
452
-
453
- $case_object = Mage::helper('signifyd_connect')->markProcessed($order);
454
-
455
- $response = $this->submitCase($case);
456
-
457
- try {
458
- $response_code = $response->getHttpCode();
459
-
460
- if (substr($response_code, 0, 1) == '2') {
461
- $response_data = json_decode($response->getRawResponse(), true);
462
-
463
- $case_object = Mage::getModel('signifyd_connect/case')->load($case_object->getId());
464
- $case_object->setUpdated(strftime('%Y-%m-%d %H:%M:%S', time()));
465
- $case_object->setCode($response_data['investigationId']);
466
- $case_object->save();
467
- }
468
- } catch (Exception $e) {
469
-
470
- }
471
- }
472
- } catch (Exception $e) {
473
- Mage::log($e->__toString(), null, 'signifyd_connect.log');
474
- }
475
- }
476
-
477
- public function logData()
478
- {
479
- // Used to capture data for testing with
480
-
481
- $order_data = json_encode($this->order->getData());
482
- $billing_data = json_encode($this->order->getBillingAddress()->getData());
483
- $shipping_data = json_encode($this->order->getShippingAddress()->getData());
484
- $customer_data = json_encode($this->customer->getData());
485
- $payment_data = json_encode($this->payment->getData());
486
- $quote_data = json_encode($this->quote->getData());
487
- $items = array();
488
- $products = array();
489
-
490
- foreach ($this->quote->getAllItems() as $item) {
491
- $items[$item->getId()] = $item->getData();
492
- $product = Mage::getModel('catalog/product')->load($item->getProductId());
493
- $products[$item->getId()] = $product->getData();
494
- }
495
-
496
- $items = json_encode($items);
497
- $products = json_encode($products);
498
-
499
- Mage::log("Order:\n $order_data", null, 'signifyd_connect_objects.log');
500
- Mage::log("Billing:\n $billing_data", null, 'signifyd_connect_objects.log');
501
- Mage::log("Shipping:\n $shipping_data", null, 'signifyd_connect_objects.log');
502
- Mage::log("Customer:\n $customer_data", null, 'signifyd_connect_objects.log');
503
- Mage::log("Payment:\n $payment_data", null, 'signifyd_connect_objects.log');
504
- Mage::log("Quote:\n $quote_data", null, 'signifyd_connect_objects.log');
505
- Mage::log("Items:\n $items", null, 'signifyd_connect_objects.log');
506
- Mage::log("Products:\n $products", null, 'signifyd_connect_objects.log');
507
- }
508
-
509
- public function getAdminRoute()
510
- {
511
- $route = false;
512
-
513
- try {
514
- // 1.4.0.0 support means we need to hard code these paths
515
- if ((bool)(string)Mage::getConfig()->getNode('default/admin/url/use_custom_path')) {
516
- $route = Mage::getConfig()->getNode('default/admin/url/custom_path');
517
- } else {
518
- $route = Mage::getConfig()->getNode('admin/routers/adminhtml/args/frontName');
519
- }
520
- } catch (Exception $e) {
521
-
522
- }
523
-
524
- if (!$route) {
525
- $route = 'admin';
526
- }
527
-
528
- return $route;
529
- }
530
-
531
- public function eavCollectionAbstractLoadBefore($observer)
532
- {
533
- $x = $observer->getCollection();
534
-
535
- $request = Mage::app()->getRequest();
536
- $module = $request->getModuleName();
537
- $controller = $request->getControllerName();
538
- $action = $request->getActionName();
539
-
540
- if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
541
- return;
542
- }
543
-
544
- $clss = get_class($x);
545
- if ($clss == 'Mage_Sales_Model_Mysql4_Order_Collection' || $clss == 'Mage_Sales_Model_Mysql4_Order_Grid_Collection') {
546
- $observer->setOrderGridCollection($x);
547
- return $this->salesOrderGridCollectionLoadBefore($observer);
548
- }
549
- }
550
-
551
- public function coreCollectionAbstractLoadBefore($observer)
552
- {
553
- $x = $observer->getCollection();
554
-
555
- $request = Mage::app()->getRequest();
556
- $module = $request->getModuleName();
557
- $controller = $request->getControllerName();
558
- $action = $request->getActionName();
559
-
560
- if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
561
- return;
562
- }
563
-
564
- $clss = get_class($x);
565
-
566
- if ($clss == 'Mage_Sales_Model_Mysql4_Order_Collection' || $clss == 'Mage_Sales_Model_Mysql4_Order_Grid_Collection') {
567
- $observer->setOrderGridCollection($x);
568
- return $this->salesOrderGridCollectionLoadBefore($observer);
569
- }
570
- }
571
-
572
- public function isCe()
573
- {
574
- return !@class_exists('Enterprise_Cms_Helper_Data');
575
- }
576
-
577
- public function oldSupport()
578
- {
579
- $version = Mage::getVersion();
580
-
581
- if ($this->isCe()) {
582
- return version_compare($version, '1.4.1.0', '<');
583
- } else {
584
- return version_compare($version, '1.10.0.0', '<');
585
- }
586
-
587
- return false;
588
- }
589
-
590
- public function belowSix()
591
- {
592
- $version = Mage::getVersion();
593
-
594
- if ($this->isCe()) {
595
- return version_compare($version, '1.6.0.0', '<');
596
- } else {
597
- return version_compare($version, '1.11.0.0', '<');
598
- }
599
-
600
- return false;
601
- }
602
-
603
- public function salesOrderGridCollectionLoadBefore($observer)
604
- {
605
- if ($this->joins === 0) {
606
- $request = Mage::app()->getRequest();
607
- $module = $request->getModuleName();
608
- $controller = $request->getControllerName();
609
- $action = $request->getActionName();
610
-
611
- if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
612
- return;
613
- }
614
-
615
- $collection = $observer->getOrderGridCollection();
616
- $select = $collection->getSelect();
617
-
618
- if (Mage::getStoreConfig('signifyd_connect/advanced/show_scores')) {
619
- if ($this->oldSupport()) {
620
- $select->joinLeft(array('signifyd'=>$collection->getTable('signifyd_connect/case')), 'signifyd.order_increment=e.increment_id', array('score'=>'score'));
621
- $this->joins++;
622
- } else {
623
- $select->joinLeft(array('signifyd'=>$collection->getTable('signifyd_connect/case')), 'signifyd.order_increment=main_table.increment_id', array('score'=>'score'));
624
- $this->joins++;
625
- }
626
-
627
- Mage::log('joined');
628
- }
629
- }
630
- }
631
-
632
- public function coreBlockAbstractToHtmlBefore(Varien_Event_Observer $observer)
633
- {
634
- if (Mage::getStoreConfig('signifyd_connect/advanced/show_scores')) {
635
- $request = Mage::app()->getRequest();
636
- $module = $request->getModuleName();
637
- $controller = $request->getControllerName();
638
- $action = $request->getActionName();
639
-
640
- if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
641
- return;
642
- }
643
-
644
- $helper = Mage::helper('signifyd_connect');
645
- $block = $observer->getEvent()->getBlock();
646
-
647
- if ($block->getId() == 'sales_order_grid') {
648
- $block->addColumnAfter(
649
- 'score',
650
- array(
651
- 'header' => $helper->__('Signifyd Score'),
652
- 'align' => 'left',
653
- 'type' => 'text',
654
- 'index' => 'score',
655
- 'filter' => false,
656
- 'renderer' => 'signifyd_connect/renderer',
657
- 'width' => '100px',
658
- ),
659
- 'status'
660
- );
661
-
662
- $block->sortColumnsByOrder();
663
- }
664
- }
665
- }
666
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Signifyd_Connect_Model_Observer extends Varien_Object
4
+ {
5
+ public $customer = null;
6
+ public $order = null;
7
+ public $payment = null;
8
+ public $quote = null;
9
+ public $shipping_address = null;
10
+ public $billing_address = null;
11
+
12
+ public $joins = 0;
13
+
14
+ public function getProducts()
15
+ {
16
+ $products = array();
17
+ $helper = Mage::helper('signifyd_connect');
18
+
19
+ foreach ($this->quote->getAllItems() as $item) {
20
+ if (!$item->getProductType() || $item->getProductType() == 'simple') {
21
+ $product_object = $item->getData('product');
22
+
23
+ if (!$product_object || !$product_object->getId()) {
24
+ $product_object = Mage::getModel('catalog/product')->load($item->getProductId());
25
+ }
26
+
27
+ if ($product_object) {
28
+ $product = array();
29
+
30
+ $product['itemId'] = $item->getSku();
31
+ $product['itemName'] = $item->getName();
32
+ $product['itemUrl'] = $helper->getProductUrl($product_object);
33
+ $product['itemImage'] = $helper->getProductImage($product_object);
34
+
35
+ $qty = 1;
36
+ if ($item->getQty()) {
37
+ $qty = $item->getQty();
38
+ } else if ($item->getQtyOrdered()) {
39
+ $qty = $item->getQtyOrdered();
40
+ }
41
+
42
+ $price = 0;
43
+ if ($item->getBasePrice() > 0) {
44
+ $price = $item->getBasePrice();
45
+ } else if ($item->getPrice() > 0) {
46
+ $price = $item->getPrice();
47
+ } else if ($product_object->getData('price') > 0) {
48
+ $price = $product_object->getData('price');
49
+ } else {
50
+ $parent = $item->getData('parent');
51
+
52
+ if (!$parent) {
53
+ $parent = $item->getParentItem();
54
+ }
55
+
56
+ if ($parent) {
57
+ if ($parent->getBasePrice() > 0) {
58
+ $price = $parent->getBasePrice();
59
+ } else if ($parent->getPrice()) {
60
+ $price = $parent->getPrice();
61
+ }
62
+ }
63
+ }
64
+
65
+ $weight = 0;
66
+ if ($item->hasWeight()) {
67
+ $weight = $item->getWeight();
68
+ } else if ($product_object->hasWeight()) {
69
+ $weight = $product_object->getWeight();
70
+ }
71
+
72
+ $product['itemQuantity'] = intval($qty);
73
+ $product['itemPrice'] = floatval($price);
74
+ $product['itemWeight'] = floatval($weight);
75
+
76
+ $products[] = $product;
77
+ }
78
+ }
79
+ }
80
+
81
+ return $products;
82
+ }
83
+
84
+ public function getIPAddress()
85
+ {
86
+ if ($this->order->getRemoteIp()) {
87
+ if ($this->order->getXForwardedFor()) {
88
+ return $this->filterIp($this->order->getXForwardedFor());
89
+ }
90
+
91
+ return $this->filterIp($this->order->getRemoteIp());
92
+ }
93
+
94
+ // Checks each configured value in app/etc/local.xml & falls back to REMOTE_ADDR. See app/etc/local.xml.additional for examples.
95
+ return $this->filterIp(Mage::helper('core/http')->getRemoteAddr(false));
96
+ }
97
+
98
+ public function filterIp($ip)
99
+ {
100
+ $matches = array();
101
+
102
+ if (preg_match('/[0-9]{1,3}(?:\.[0-9]{1,3}){3}/', $ip, $matches)) { //ipv4
103
+ return current($matches);
104
+ }
105
+
106
+ if (preg_match('/[a-f0-9]{0,4}(?:\:[a-f0-9]{0,4}){2,7}/', strtolower($ip), $matches)) { //ipv6
107
+ return current($matches);
108
+ }
109
+
110
+ return preg_replace('/[^0-9a-zA-Z:\.]/', '', strtok(str_replace($ip, ',', "\n"), "\n"));
111
+ }
112
+
113
+ public function formatAvs($value)
114
+ {
115
+ // http://www.emsecommerce.net/avs_cvv2_response_codes.htm
116
+ $codes = array('X', 'Y', 'A', 'W', 'Z', 'N', 'U', 'R', 'E', 'S', 'D', 'M', 'B', 'P', 'C', 'I', 'G');
117
+
118
+ if ($value) {
119
+ $value = strtoupper($value);
120
+
121
+ if (strlen($value) > 1) {
122
+ if (preg_match('/\([A-Z]\)/', $value)) {
123
+ $matches = array();
124
+
125
+ preg_match('/\([A-Z]\)/', $value, $matches);
126
+
127
+ foreach ($matches as $match) {
128
+ $match = preg_replace('/[^A-Z]/', '', $match);
129
+
130
+ if (in_array($match, $codes)) {
131
+ $value = $match;
132
+ }
133
+ }
134
+ }
135
+ }
136
+
137
+ if (strlen($value) > 1) {
138
+ $value = substr($value, 0, 1);
139
+ }
140
+
141
+ if (!in_array($value, $codes)) {
142
+ $value = null;
143
+ }
144
+ }
145
+
146
+ return $value;
147
+ }
148
+
149
+ public function getAvsResponse()
150
+ {
151
+ $payment = $this->payment;
152
+
153
+ $value = null;
154
+
155
+ if ($payment->getAdditionalInformation('paypal_avs_code')) {
156
+ $value = $payment->getAdditionalInformation('paypal_avs_code');
157
+ } else if ($payment->getAdditionalInformation('cc_avs_status')) {
158
+ $value = $payment->getAdditionalInformation('cc_avs_status');
159
+ }
160
+
161
+ return $this->formatAvs($value);
162
+ }
163
+
164
+ public function getCvvResponse()
165
+ {
166
+ $payment = $this->payment;
167
+
168
+ if ($payment->getAdditionalInformation('paypal_cvv2_match')) {
169
+ return $payment->getAdditionalInformation('paypal_cvv2_match');
170
+ }
171
+
172
+ return null;
173
+ }
174
+
175
+ public function getPaymentMethod()
176
+ {
177
+ return $this->payment->getMethod();
178
+ }
179
+
180
+ public function getPurchase()
181
+ {
182
+ $purchase = array();
183
+
184
+ // T715: Send null rather than false when we can't get the IP Address
185
+ $purchase['browserIpAddress'] = ($this->getIpAddress() ? $this->getIpAddress() : null);
186
+ $purchase['orderId'] = $this->order->getIncrementId();
187
+ $purchase['createdAt'] = date('c', strtotime($this->order->getCreatedAt())); // e.g: 2004-02-12T15:19:21+00:00
188
+ $purchase['currency'] = $this->order->getBaseCurrencyCode();
189
+ $purchase['totalPrice'] = floatval($this->order->getGrandTotal());
190
+ $purchase['shippingPrice'] = floatval($this->order->getShippingAmount());
191
+ $purchase['products'] = $this->getProducts();
192
+ $purchase['paymentGateway'] = $this->getPaymentMethod();
193
+
194
+ $purchase['avsResponseCode'] = $this->getAvsResponse();
195
+ $purchase['cvvResponseCode'] = $this->getCvvResponse();
196
+
197
+ return $purchase;
198
+ }
199
+
200
+ public function isPaymentCC($payment)
201
+ {
202
+ // Although the payment structure only has the entity data for the payment
203
+ // the original payment method object is stored within the entity data.
204
+ // It's not a requirement, but every CC handler I've found subclasses
205
+ // from Mage_Payment_Model_Method_Cc, so we are using that as an
206
+ // assumption for whether a method is based on CC data
207
+ $method = $payment->getData('method_instance');
208
+ if($method)
209
+ {
210
+ return is_subclass_of($method, 'Mage_Payment_Model_Method_Cc');
211
+ }
212
+ return false;
213
+ }
214
+
215
+ public function getCard()
216
+ {
217
+ $payment = $this->payment;
218
+ $billing = $this->billing_address;
219
+
220
+ $card = array();
221
+
222
+ $card['cardHolderName'] = null;
223
+ $card['bin'] = null;
224
+ $card['last4'] = null;
225
+ $card['expiryMonth'] = null;
226
+ $card['expiryYear'] = null;
227
+ $card['hash'] = null;
228
+
229
+ $card['billingAddress'] = $this->getBillingAddress();
230
+
231
+ if ($payment->getCcOwner()) {
232
+ $card['cardHolderName'] = $payment->getCcOwner();
233
+ } else {
234
+ $card['cardHolderName'] = $billing->getFirstname() . ' ' . $billing->getLastname();
235
+ }
236
+
237
+ // Card data may be set on payment even if payment was not with card.
238
+ // If it is, we want to ignore the data
239
+ if(!$this->isPaymentCC($payment)) return $card;
240
+
241
+ if ($payment->getData('cc_last4')) {
242
+ $card['last4'] = $payment->getData('cc_last4');
243
+ }
244
+
245
+ if ($payment->getData('cc_exp_year')) {
246
+ $card['expiryYear'] = $payment->getData('cc_exp_year');
247
+ }
248
+
249
+ if ($payment->getData('cc_exp_month')) {
250
+ $card['expiryMonth'] = $payment->getData('cc_exp_month');
251
+ }
252
+
253
+ if ($payment->getData('cc_number_enc')) {
254
+ $card['hash'] = $payment->getData('cc_number_enc');
255
+ }
256
+
257
+ if ($payment->getData('cc_number') && is_numeric($payment->getData('cc_number')) && strlen((string)$payment->getData('cc_number')) > 6) {
258
+ $card['bin'] = substr((string)$payment->getData('cc_number'), 0, 6);
259
+ }
260
+
261
+ return $card;
262
+ }
263
+
264
+ public function getAddress($address_object)
265
+ {
266
+ $address = array();
267
+
268
+ $address['streetAddress'] = $address_object->getStreet1();
269
+ $address['unit'] = null;
270
+
271
+ if ($address_object->getStreet2()) {
272
+ $address['unit'] = $address_object->getStreet2();
273
+ }
274
+
275
+ $address['city'] = $address_object->getCity();
276
+
277
+ $address['provinceCode'] = $address_object->getRegionCode();
278
+ $address['postalCode'] = $address_object->getPostcode();
279
+ $address['countryCode'] = $address_object->getCountryId();
280
+
281
+ $address['latitude'] = null;
282
+ $address['longitude'] = null;
283
+
284
+ return $address;
285
+ }
286
+
287
+ public function getBillingAddress()
288
+ {
289
+ return $this->getAddress($this->billing_address);
290
+ }
291
+
292
+ public function getShippingAddress()
293
+ {
294
+ return $this->getAddress($this->shipping_address);
295
+ }
296
+
297
+ public function getRecipient()
298
+ {
299
+ $recipient = array();
300
+
301
+ // In the case of non-shipped (ex: downloadable) orders, shipping address will be null so
302
+ // in that case, we need to avoid the exception.
303
+ if($this->shipping_address) {
304
+ $recipient['deliveryAddress'] = $this->getShippingAddress();
305
+ $recipient['fullName'] = $this->shipping_address->getFirstname() . ' ' . $this->shipping_address->getLastname();
306
+ $recipient['confirmationPhone'] = $this->shipping_address->getTelephone();
307
+ // Email: Note that this field is always the same for both addresses
308
+ $recipient['confirmationEmail'] = $this->shipping_address->getEmail();
309
+ }
310
+ // Some customers have reported seeing "n/a@na.na" come through instead of a valid or null address
311
+ // We suspect that it is due to an older version of Magento. If it becomes unnecessary, do remove the extra check.
312
+ if (!$recipient['confirmationEmail'] || $recipient['confirmationEmail'] == 'n/a@na.na') {
313
+ $recipient['confirmationEmail'] = $this->order->getCustomerEmail();
314
+ }
315
+
316
+
317
+ return $recipient;
318
+ }
319
+
320
+ public function getUserAccount()
321
+ {
322
+ $customer = $this->customer;
323
+
324
+ $user = array(
325
+ "emailAddress" => null,
326
+ "username" => null,
327
+ "phone" => null,
328
+ "createdDate" => null,
329
+ "accountNumber" => null,
330
+ "lastOrderId" => null,
331
+ "aggregateOrderCount" => null,
332
+ "aggregateOrderDollars" => null,
333
+ "lastUpdateDate" => null
334
+ );
335
+
336
+ if ($customer && $customer->getId()) {
337
+ $user['emailAddress'] = $customer->getEmail();
338
+
339
+ $user['phone'] = $this->billing_address->getTelephone();
340
+
341
+ $user['createdDate'] = date('c', strtotime($customer->getCreatedAt()));
342
+ $user['lastUpdateDate'] = date('c', strtotime($customer->getUpdatedAt()));
343
+
344
+ $user['accountNumber'] = $customer->getId();
345
+
346
+ $last_order_id = null;
347
+
348
+ $orders = Mage::getModel('sales/order')->getCollection()->addFieldToFilter('customer_id', $customer->getId());
349
+ $orders->getSelect()->order('created_at DESC');
350
+
351
+ $aggregate_total = 0.;
352
+ $order_count = 0;
353
+
354
+ foreach ($orders as $order) {
355
+ if ($last_order_id === null) {
356
+ $last_order_id = $order->getIncrementId();
357
+ }
358
+
359
+ $aggregate_total += floatval($order->getGrandTotal());
360
+ $order_count += 1;
361
+ }
362
+
363
+ $user['lastOrderId'] = $last_order_id;
364
+ $user['aggregateOrderCount'] = $order_count;
365
+ $user['aggregateOrderDollars'] = floatval($aggregate_total);
366
+ }
367
+
368
+ return $user;
369
+ }
370
+
371
+ public function getUrl()
372
+ {
373
+ if ($this->hasData('url')) {
374
+ return $this->getData('url');
375
+ }
376
+
377
+ return Mage::getStoreConfig('signifyd_connect/settings/url') . '/cases';
378
+ }
379
+
380
+ public function getAuth()
381
+ {
382
+ if ($this->hasData('auth')) {
383
+ return $this->getData('auth');
384
+ }
385
+
386
+ return Mage::getStoreConfig('signifyd_connect/settings/key');
387
+ }
388
+
389
+ public function submitCase($case)
390
+ {
391
+ $case = json_encode($case);
392
+
393
+ return Mage::helper('signifyd_connect')->request($this->getUrl(), $case, $this->getAuth(), 'application/json');
394
+ }
395
+
396
+ public function generateCase()
397
+ {
398
+ $case = array();
399
+
400
+ $case['purchase'] = $this->getPurchase();
401
+ $case['recipient'] = $this->getRecipient();
402
+ $case['card'] = $this->getCard();
403
+ $case['userAccount'] = $this->getUserAccount();
404
+
405
+ return $case;
406
+ }
407
+
408
+ public function getInvoiced($order)
409
+ {
410
+ $collection = $order->getInvoiceCollection();
411
+
412
+ foreach ($collection as $invoice) {
413
+ return true;
414
+ }
415
+
416
+ return false;
417
+ }
418
+
419
+ public function openCase($observer)
420
+ {
421
+ try {
422
+ if (!Mage::getStoreConfig('signifyd_connect/settings/enabled') && !$this->getEnabled()) {
423
+ return;
424
+ }
425
+
426
+ $event = $observer->getEvent();
427
+
428
+ if ($event->hasOrder()) {
429
+ $order = $event->getOrder();
430
+ } else if ($event->hasObject()) {
431
+ $order = $event->getObject();
432
+ }
433
+
434
+ $order_model = get_class(Mage::getModel('sales/order'));
435
+
436
+ if (!($order instanceof $order_model)) {
437
+ return;
438
+ }
439
+
440
+ if ($order && $order->getId()) {
441
+ if (Mage::helper('signifyd_connect')->isProcessed($order) && !$this->getForceProcess()) {
442
+ return;
443
+ }
444
+
445
+ $payments = $order->getPaymentsCollection();
446
+
447
+ foreach ($payments as $payment) {
448
+ $this->payment = $payment;
449
+ }
450
+
451
+ $method = $this->payment->getMethod();
452
+
453
+ $state = $order->getState();
454
+
455
+ if (!$state || $state == Mage_Sales_Model_Order::STATE_PENDING_PAYMENT) {
456
+ return;
457
+ }
458
+
459
+ $this->order = $order;
460
+ $this->billing_address = $order->getBillingAddress();
461
+ $this->shipping_address = $order->getShippingAddress();
462
+
463
+ if ($order->getCustomer()) {
464
+ $this->customer = $order->getCustomer();
465
+ }
466
+
467
+ $this->quote = $order->getQuote();
468
+
469
+ if (!$this->quote) {
470
+ $this->quote = $order;
471
+ }
472
+
473
+ $case = $this->generateCase();
474
+
475
+ $case_object = Mage::helper('signifyd_connect')->markProcessed($order);
476
+
477
+ $response = $this->submitCase($case);
478
+
479
+ try {
480
+ $response_code = $response->getHttpCode();
481
+
482
+ if (substr($response_code, 0, 1) == '2') {
483
+ $response_data = json_decode($response->getRawResponse(), true);
484
+
485
+ $case_object = Mage::getModel('signifyd_connect/case')->load($case_object->getId());
486
+ $case_object->setUpdated(strftime('%Y-%m-%d %H:%M:%S', time()));
487
+ $case_object->setCode($response_data['investigationId']);
488
+ $case_object->save();
489
+ }
490
+ } catch (Exception $e) {
491
+
492
+ }
493
+ }
494
+ } catch (Exception $e) {
495
+ Mage::log($e->__toString(), null, 'signifyd_connect.log');
496
+ }
497
+ }
498
+
499
+ public function logData()
500
+ {
501
+ // Used to capture data for testing with
502
+
503
+ $order_data = json_encode($this->order->getData());
504
+ $billing_data = json_encode($this->order->getBillingAddress()->getData());
505
+ $shipping_data = json_encode($this->order->getShippingAddress()->getData());
506
+ $customer_data = json_encode($this->customer->getData());
507
+ $payment_data = json_encode($this->payment->getData());
508
+ $quote_data = json_encode($this->quote->getData());
509
+ $items = array();
510
+ $products = array();
511
+
512
+ foreach ($this->quote->getAllItems() as $item) {
513
+ $items[$item->getId()] = $item->getData();
514
+ $product = Mage::getModel('catalog/product')->load($item->getProductId());
515
+ $products[$item->getId()] = $product->getData();
516
+ }
517
+
518
+ $items = json_encode($items);
519
+ $products = json_encode($products);
520
+
521
+ Mage::log("Order:\n $order_data", null, 'signifyd_connect_objects.log');
522
+ Mage::log("Billing:\n $billing_data", null, 'signifyd_connect_objects.log');
523
+ Mage::log("Shipping:\n $shipping_data", null, 'signifyd_connect_objects.log');
524
+ Mage::log("Customer:\n $customer_data", null, 'signifyd_connect_objects.log');
525
+ Mage::log("Payment:\n $payment_data", null, 'signifyd_connect_objects.log');
526
+ Mage::log("Quote:\n $quote_data", null, 'signifyd_connect_objects.log');
527
+ Mage::log("Items:\n $items", null, 'signifyd_connect_objects.log');
528
+ Mage::log("Products:\n $products", null, 'signifyd_connect_objects.log');
529
+ }
530
+
531
+ public function getAdminRoute()
532
+ {
533
+ $route = false;
534
+
535
+ try {
536
+ // 1.4.0.0 support means we need to hard code these paths
537
+ if ((bool)(string)Mage::getConfig()->getNode('default/admin/url/use_custom_path')) {
538
+ $route = Mage::getConfig()->getNode('default/admin/url/custom_path');
539
+ } else {
540
+ $route = Mage::getConfig()->getNode('admin/routers/adminhtml/args/frontName');
541
+ }
542
+ } catch (Exception $e) {
543
+
544
+ }
545
+
546
+ if (!$route) {
547
+ $route = 'admin';
548
+ }
549
+
550
+ return $route;
551
+ }
552
+
553
+ public function eavCollectionAbstractLoadBefore($observer)
554
+ {
555
+ $x = $observer->getCollection();
556
+
557
+ $request = Mage::app()->getRequest();
558
+ $module = $request->getModuleName();
559
+ $controller = $request->getControllerName();
560
+ $action = $request->getActionName();
561
+
562
+ if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
563
+ return;
564
+ }
565
+
566
+ $clss = get_class($x);
567
+ if ($clss == 'Mage_Sales_Model_Mysql4_Order_Collection' || $clss == 'Mage_Sales_Model_Mysql4_Order_Grid_Collection') {
568
+ $observer->setOrderGridCollection($x);
569
+ return $this->salesOrderGridCollectionLoadBefore($observer);
570
+ }
571
+ }
572
+
573
+ public function coreCollectionAbstractLoadBefore($observer)
574
+ {
575
+ $x = $observer->getCollection();
576
+
577
+ $request = Mage::app()->getRequest();
578
+ $module = $request->getModuleName();
579
+ $controller = $request->getControllerName();
580
+ $action = $request->getActionName();
581
+
582
+ if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
583
+ return;
584
+ }
585
+
586
+ $clss = get_class($x);
587
+
588
+ if ($clss == 'Mage_Sales_Model_Mysql4_Order_Collection' || $clss == 'Mage_Sales_Model_Mysql4_Order_Grid_Collection') {
589
+ $observer->setOrderGridCollection($x);
590
+ return $this->salesOrderGridCollectionLoadBefore($observer);
591
+ }
592
+ }
593
+
594
+ public function isCe()
595
+ {
596
+ return !@class_exists('Enterprise_Cms_Helper_Data');
597
+ }
598
+
599
+ public function oldSupport()
600
+ {
601
+ $version = Mage::getVersion();
602
+
603
+ if ($this->isCe()) {
604
+ return version_compare($version, '1.4.1.0', '<');
605
+ } else {
606
+ return version_compare($version, '1.10.0.0', '<');
607
+ }
608
+
609
+ return false;
610
+ }
611
+
612
+ public function belowSix()
613
+ {
614
+ $version = Mage::getVersion();
615
+
616
+ if ($this->isCe()) {
617
+ return version_compare($version, '1.6.0.0', '<');
618
+ } else {
619
+ return version_compare($version, '1.11.0.0', '<');
620
+ }
621
+
622
+ return false;
623
+ }
624
+
625
+ public function salesOrderGridCollectionLoadBefore($observer)
626
+ {
627
+ if ($this->joins === 0) {
628
+ $request = Mage::app()->getRequest();
629
+ $module = $request->getModuleName();
630
+ $controller = $request->getControllerName();
631
+ $action = $request->getActionName();
632
+
633
+ if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
634
+ return;
635
+ }
636
+
637
+ $collection = $observer->getOrderGridCollection();
638
+ $select = $collection->getSelect();
639
+
640
+ if (Mage::getStoreConfig('signifyd_connect/advanced/show_scores')) {
641
+ if ($this->oldSupport()) {
642
+ $select->joinLeft(array('signifyd'=>$collection->getTable('signifyd_connect/case')), 'signifyd.order_increment=e.increment_id', array('score'=>'score'));
643
+ $this->joins++;
644
+ } else {
645
+ $select->joinLeft(array('signifyd'=>$collection->getTable('signifyd_connect/case')), 'signifyd.order_increment=main_table.increment_id', array('score'=>'score'));
646
+ $this->joins++;
647
+ }
648
+
649
+ Mage::log('joined');
650
+ }
651
+ }
652
+ }
653
+
654
+ public function coreBlockAbstractToHtmlBefore(Varien_Event_Observer $observer)
655
+ {
656
+ if (Mage::getStoreConfig('signifyd_connect/advanced/show_scores')) {
657
+ $request = Mage::app()->getRequest();
658
+ $module = $request->getModuleName();
659
+ $controller = $request->getControllerName();
660
+ $action = $request->getActionName();
661
+
662
+ if ($module != $this->getAdminRoute() || $controller != 'sales_order') {
663
+ return;
664
+ }
665
+
666
+ $helper = Mage::helper('signifyd_connect');
667
+ $block = $observer->getEvent()->getBlock();
668
+
669
+ if ($block->getId() == 'sales_order_grid') {
670
+ $block->addColumnAfter(
671
+ 'score',
672
+ array(
673
+ 'header' => $helper->__('Signifyd Score'),
674
+ 'align' => 'left',
675
+ 'type' => 'text',
676
+ 'index' => 'score',
677
+ 'filter' => false,
678
+ 'renderer' => 'signifyd_connect/renderer',
679
+ 'width' => '100px',
680
+ ),
681
+ 'status'
682
+ );
683
+
684
+ $block->sortColumnsByOrder();
685
+ }
686
+ }
687
+ }
688
+ }
app/code/community/Signifyd/Connect/etc/config.xml CHANGED
@@ -3,7 +3,7 @@
3
  <config>
4
  <modules>
5
  <Signifyd_Connect>
6
- <version>3.5.1</version>
7
  </Signifyd_Connect>
8
  </modules>
9
  <global>
3
  <config>
4
  <modules>
5
  <Signifyd_Connect>
6
+ <version>3.4.8</version>
7
  </Signifyd_Connect>
8
  </modules>
9
  <global>
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Signifyd_Connect</name>
4
- <version>3.5.2</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">OSL</license>
7
  <channel>community</channel>
@@ -10,9 +10,9 @@
10
  <description>Supports all versions of Magento</description>
11
  <notes>Supports all versions of Magento</notes>
12
  <authors><author><name>signifyd</name><user>auto-converted</user><email>manelis@signifyd.com</email></author></authors>
13
- <date>2015-03-15</date>
14
- <time>23:22:11</time>
15
- <contents><target name="mageetc"><dir name="modules"><file name="Signifyd_Connect.xml" hash="bcd998a24567eba8a20423c40fba2adf"/></dir></target><target name="magecommunity"><dir name="Signifyd"><dir name="Connect"><dir name="Block"><dir name="Adminhtml"><dir name="Sales"><dir name="Order"><file name="Grid.php" hash="fcdcd4cb2933147e4b573b4fb7217992"/></dir><file name="Order.php" hash="e49f869c0aa5fb3ab6b70fb5752049ac"/></dir></dir><file name="Renderer.php" hash="5564e9c6926afbbdade26a6fe746948a"/></dir><dir name="Controllers"><dir name="Adminhtml"><file name="SignifydController.php" hash="937fa40bfd59857c738691e0fc6594e7"/></dir><file name="ConnectController.php" hash="4d5cf9c36b3a72e8f1d1f80aa4752b26"/></dir><dir name="Helper"><file name="Data.php" hash="2b4ecd3e91506eed6d155f8f6e299507"/></dir><dir name="Model"><dir name="Resource"><dir name="Case"><file name="Collection.php" hash="b7dac9979a0c81db56294d1548570fc2"/></dir><file name="Case.php" hash="621fb50264bd0cdeba720dee6949a0bf"/></dir><file name="Case.php" hash="92e044f7414eddfe084320b4a2098cee"/><file name="Cron.php" hash="51665978bd2bcf67b493f2a2b450d1b8"/><file name="Link.php" hash="0027fc75ef766aa1f51a004305987937"/><file name="Observer.php" hash="2215026284b8f4fe415380ea0cdb19f1"/><file name="Setup.php" hash="e803ffb4b86c7d8ec1d149e665d65877"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="SignifydController.php" hash="937fa40bfd59857c738691e0fc6594e7"/></dir><file name="ConnectController.php" hash="4d5cf9c36b3a72e8f1d1f80aa4752b26"/></dir><dir name="etc"><file name="adminhtml.xml" hash="894bd3f5ac76e9f602ab6ab592648b03"/><file name="config.xml" hash="ccc20c3f6832e2e85faa20855fcca529"/><file name="system.xml" hash="dc115570682f75c6666d5b4657db729f"/></dir><dir name="sql"><dir name="signifyd_connect_setup"><file name="mysql4-install-3.1.1.php" hash="7fb2ccaf8352eea26e626ace6de53d80"/><file name="mysql4-install-3.3.0.php" hash="f61d0c018b28ae04d8d14b38556d18ad"/><file name="mysql4-install-3.4.0.php" hash="109cc5ca60974d0c4755dcb0f5ade3e7"/><file name="mysql4-install-3.4.5.php" hash="401b92235c0e534c941a64c60d24b851"/><file name="mysql4-upgrade-3.2.0-3.2.1.php" hash="9e36c608afd6e30e3052334e085eeff4"/><file name="mysql4-upgrade-3.2.1-3.2.2.php" hash="efcc5d46a41e549e508a693f1e77bf44"/><file name="mysql4-upgrade-3.2.2-3.2.3.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.2.3-3.3.0.php" hash="94b907c2cacde5fb9831408ce9a06190"/><file name="mysql4-upgrade-3.3.0-3.4.0.php" hash="6eb18705081483bb8d9c14adcdefd095"/><file name="mysql4-upgrade-3.4.0-3.4.1.php" hash="79f2064f1fa20d646e66aa3e7912d2a0"/><file name="mysql4-upgrade-3.4.1-3.4.2.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.2-3.4.3.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.3-3.4.4.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.4-3.4.5.php" hash="5b7507d6bb97bf44d27b7a89c56924bb"/><file name="mysql4-upgrade-3.4.5-3.4.6.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.6-3.4.7.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.7-3.4.8.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.8-3.4.9.php" hash="3ceb86495f33475774d4fc8727254cfc"/></dir></dir></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies/>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Signifyd_Connect</name>
4
+ <version>3.5.3</version>
5
  <stability>stable</stability>
6
  <license uri="http://opensource.org/licenses/osl-3.0.php">OSL</license>
7
  <channel>community</channel>
10
  <description>Supports all versions of Magento</description>
11
  <notes>Supports all versions of Magento</notes>
12
  <authors><author><name>signifyd</name><user>auto-converted</user><email>manelis@signifyd.com</email></author></authors>
13
+ <date>2015-04-18</date>
14
+ <time>21:52:53</time>
15
+ <contents><target name="mageetc"><dir name="modules"><file name="Signifyd_Connect.xml" hash="bcd998a24567eba8a20423c40fba2adf"/></dir></target><target name="magecommunity"><dir name="Signifyd"><dir name="Connect"><dir name="Block"><dir name="Adminhtml"><dir name="Sales"><dir name="Order"><file name="Grid.php" hash="fcdcd4cb2933147e4b573b4fb7217992"/></dir><file name="Order.php" hash="e49f869c0aa5fb3ab6b70fb5752049ac"/></dir></dir><file name="Renderer.php" hash="5564e9c6926afbbdade26a6fe746948a"/></dir><dir name="Controllers"><dir name="Adminhtml"><file name="SignifydController.php" hash="937fa40bfd59857c738691e0fc6594e7"/></dir><file name="ConnectController.php" hash="4d5cf9c36b3a72e8f1d1f80aa4752b26"/></dir><dir name="Helper"><file name="Data.php" hash="2b4ecd3e91506eed6d155f8f6e299507"/></dir><dir name="Model"><dir name="Resource"><dir name="Case"><file name="Collection.php" hash="b7dac9979a0c81db56294d1548570fc2"/></dir><file name="Case.php" hash="621fb50264bd0cdeba720dee6949a0bf"/></dir><file name="Case.php" hash="92e044f7414eddfe084320b4a2098cee"/><file name="Cron.php" hash="51665978bd2bcf67b493f2a2b450d1b8"/><file name="Link.php" hash="ecaf4c403a586b4b5c8b67c77f6ac433"/><file name="Observer.php" hash="e22012acac76ced188fdeae1833b64b1"/><file name="Setup.php" hash="e803ffb4b86c7d8ec1d149e665d65877"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="SignifydController.php" hash="937fa40bfd59857c738691e0fc6594e7"/></dir><file name="ConnectController.php" hash="4d5cf9c36b3a72e8f1d1f80aa4752b26"/></dir><dir name="etc"><file name="adminhtml.xml" hash="894bd3f5ac76e9f602ab6ab592648b03"/><file name="config.xml" hash="7a18e7f7d5b395882c8bf90b56724d8a"/><file name="system.xml" hash="dc115570682f75c6666d5b4657db729f"/></dir><dir name="sql"><dir name="signifyd_connect_setup"><file name="mysql4-install-3.1.1.php" hash="7fb2ccaf8352eea26e626ace6de53d80"/><file name="mysql4-install-3.3.0.php" hash="f61d0c018b28ae04d8d14b38556d18ad"/><file name="mysql4-install-3.4.0.php" hash="109cc5ca60974d0c4755dcb0f5ade3e7"/><file name="mysql4-install-3.4.5.php" hash="401b92235c0e534c941a64c60d24b851"/><file name="mysql4-upgrade-3.2.0-3.2.1.php" hash="9e36c608afd6e30e3052334e085eeff4"/><file name="mysql4-upgrade-3.2.1-3.2.2.php" hash="efcc5d46a41e549e508a693f1e77bf44"/><file name="mysql4-upgrade-3.2.2-3.2.3.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.2.3-3.3.0.php" hash="94b907c2cacde5fb9831408ce9a06190"/><file name="mysql4-upgrade-3.3.0-3.4.0.php" hash="6eb18705081483bb8d9c14adcdefd095"/><file name="mysql4-upgrade-3.4.0-3.4.1.php" hash="79f2064f1fa20d646e66aa3e7912d2a0"/><file name="mysql4-upgrade-3.4.1-3.4.2.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.2-3.4.3.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.3-3.4.4.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.4-3.4.5.php" hash="5b7507d6bb97bf44d27b7a89c56924bb"/><file name="mysql4-upgrade-3.4.5-3.4.6.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.6-3.4.7.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.7-3.4.8.php" hash="3ceb86495f33475774d4fc8727254cfc"/><file name="mysql4-upgrade-3.4.8-3.4.9.php" hash="3ceb86495f33475774d4fc8727254cfc"/></dir></dir></dir></dir></target></contents>
16
  <compatible/>
17
  <dependencies/>
18
  </package>