riskified_magento - Version 1.0.8.3

Version Notes

* Beacon with FPC hole punching capabilities
* Better support for status transitions with order status sync
* Voiding payments at the gateway on decline when state set to canceled.

Download this release

Release Info

Developer Riskified_Mage
Extension riskified_magento
Version 1.0.8.3
Comparing to
See all releases


Code changes from version 1.0.8.0 to 1.0.8.3

Files changed (33) hide show
  1. app/code/community/Riskified/Full/Block/Beacon.php +16 -0
  2. app/code/community/Riskified/Full/Helper/Customer/Order.php +34 -0
  3. app/code/community/Riskified/Full/Helper/Data.php +47 -30
  4. app/code/community/Riskified/Full/Helper/Debug.php +3 -4
  5. app/code/community/Riskified/Full/Helper/Log.php +4 -4
  6. app/code/community/Riskified/Full/Helper/Order.php +216 -166
  7. app/code/community/Riskified/Full/Helper/Order/Invoice.php +22 -22
  8. app/code/community/Riskified/Full/Helper/Order/Status.php +23 -23
  9. app/code/community/Riskified/Full/Model/Authorizenet.php +4 -29
  10. app/code/community/Riskified/Full/Model/Container/Beacon.php +30 -0
  11. app/code/community/Riskified/Full/Model/Cron.php +15 -16
  12. app/code/community/Riskified/Full/Model/Observer.php +188 -151
  13. app/code/community/Riskified/Full/Model/System/Config/Source/ApprovedState.php +10 -10
  14. app/code/community/Riskified/Full/Model/System/Config/Source/CanceledStateStatuses.php +2 -2
  15. app/code/community/Riskified/Full/Model/System/Config/Source/CaptureCase.php +10 -10
  16. app/code/community/Riskified/Full/Model/System/Config/Source/DeclinedState.php +10 -10
  17. app/code/community/Riskified/Full/Model/System/Config/Source/Env.php +1 -1
  18. app/code/community/Riskified/Full/Model/System/Config/Source/HoldedStateStatuses.php +2 -2
  19. app/code/community/Riskified/Full/Model/System/Config/Source/ProcessingStateStatuses.php +2 -2
  20. app/code/community/Riskified/Full/controllers/Adminhtml/RiskifiedfullController.php +2 -2
  21. app/code/community/Riskified/Full/controllers/ResponseController.php +7 -7
  22. app/code/community/Riskified/Full/etc/adminhtml.xml +47 -0
  23. app/code/community/Riskified/Full/etc/cache.xml +10 -0
  24. app/code/community/Riskified/Full/etc/config.xml +18 -41
  25. app/code/community/Riskified/Full/etc/system.xml +6 -3
  26. app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-install-1.0.1.php +3 -3
  27. app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.2.0-1.0.2.1.php +3 -3
  28. app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.4-1.0.5.0.php +12 -13
  29. app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.5.5-1.0.6.0.php +3 -3
  30. app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.8.0-1.0.8.1.php +18 -0
  31. app/design/frontend/base/default/layout/full.xml +1 -1
  32. app/design/frontend/base/default/template/full/{riskified.phtml → beacon.phtml} +4 -6
  33. package.xml +7 -5
app/code/community/Riskified/Full/Block/Beacon.php ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Riskified_Full_Block_Beacon extends Mage_Core_Block_Template
4
+ {
5
+ protected $sessionId, $shopDomain, $extensionVersion, $beaconUrl, $time;
6
+
7
+ protected function _construct()
8
+ {
9
+ $this->setTemplate('full/beacon.phtml');
10
+ $helper = Mage::helper('full');
11
+ $this->sessionId = $helper->getSessionId();
12
+ $this->shopDomain = $helper->getShopDomain();
13
+ $this->extensionVersion = $helper->getExtensionVersion();
14
+ $this->beaconUrl = $helper->getConfigBeaconUrl();
15
+ }
16
+ }
app/code/community/Riskified/Full/Helper/Customer/Order.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Riskified_Full_Helper_Customer_Order extends Mage_Core_Helper_Abstract
4
+ {
5
+ private $_orders = array();
6
+
7
+ private function _prepare($customer_id) {
8
+ return Mage::getModel('sales/order')->getCollection()->addFieldToFilter('customer_id', $customer_id);
9
+ }
10
+
11
+ public function getCustomerOrders($customer_id) {
12
+ if(!isset($this->_orders[$customer_id])) {
13
+ $customer_orders = $this->_prepare($customer_id);
14
+ $size = $customer_orders->getSize();
15
+
16
+ if ($size) {
17
+ $last_id = $customer_orders->getLastItem()->getId();
18
+
19
+ $total = $customer_orders
20
+ ->addExpressionFieldToSelect('sum_total', 'SUM(base_grand_total)', 'base_grand_total')
21
+ ->addOrder('entity_id')
22
+ ->fetchItem()->getSumTotal();
23
+
24
+ $this->_orders[$customer_id] = array(
25
+ 'last_order_id' => $last_id,
26
+ 'total_spent' => $total,
27
+ 'orders_count' => $size,
28
+ );
29
+ }
30
+ }
31
+
32
+ return $this->_orders[$customer_id];
33
+ }
34
+ }
app/code/community/Riskified/Full/Helper/Data.php CHANGED
@@ -2,74 +2,91 @@
2
 
3
  require_once(Mage::getBaseDir('lib') . DIRECTORY_SEPARATOR . 'riskified_php_sdk' . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'Riskified' . DIRECTORY_SEPARATOR . 'autoloader.php');
4
 
5
- class Riskified_Full_Helper_Data extends Mage_Core_Helper_Abstract {
 
6
 
7
- public function getAdminUrl(){
8
- $out = null;
9
- $match = preg_match("/(.*)full\/response\/getresponse.*/i", Mage::helper('adminhtml')->getUrl('full/response/getresponse'),$out);
10
- if ($match){
11
- return $out[1];
12
- }else{
13
- return "";
14
- }
 
15
  }
16
 
17
- public function getAuthToken(){
18
- return Mage::getStoreConfig('fullsection/full/key',Mage::app()->getStore());
 
19
  }
20
 
21
- public function getConfigStatusControlActive(){
 
22
  return Mage::getStoreConfig('fullsection/full/order_status_sync');
23
  }
24
 
25
- public function getConfigEnv(){
 
26
  return 'Riskified\Common\Env::' . Mage::getStoreConfig('fullsection/full/env');
27
  }
28
 
29
- public function getConfigEnableAutoInvoice(){
 
30
  return Mage::getStoreConfig('fullsection/full/auto_invoice_enabled');
31
  }
32
 
33
- public function getConfigAutoInvoiceCaptureCase(){
 
34
  return Mage::getStoreConfig('fullsection/full/auto_invoice_capture_case');
35
  }
36
 
37
- public function getConfigBeaconUrl(){
 
38
  return Mage::getStoreConfig('fullsection/full/beaconurl');
39
  }
40
 
41
- public function getShopDomain(){
42
- return Mage::getStoreConfig('fullsection/full/domain');
 
43
  }
44
 
45
- public function getExtensionVersion(){
46
- return (string) Mage::getConfig()->getNode()->modules->Riskified_Full->version;
 
47
  }
48
 
49
- public function getDeclinedState() {
 
50
  return Mage::getStoreConfig('fullsection/full/declined_state');
51
  }
52
 
53
- public function getDeclinedStatus() {
 
54
  $state = $this->getDeclinedState();
55
- return Mage::getStoreConfig('fullsection/full/declined_status_'.$state);
56
  }
57
 
58
- public function getApprovedState() {
 
59
  return Mage::getStoreConfig('fullsection/full/approved_state');
60
  }
61
 
62
- public function getApprovedStatus() {
 
63
  $state = $this->getApprovedState();
64
- return Mage::getStoreConfig('fullsection/full/approved_status_'.$state);
65
  }
66
 
67
- public function isDebugLogsEnabled() {
68
- return (bool) Mage::getStoreConfig('fullsection/full/debug_logs');
 
69
  }
70
 
71
  public function getSessionId(){
72
- return Mage::getModel('core/cookie')->get('rCookie');
 
 
73
  }
74
 
75
  /**
@@ -87,4 +104,4 @@ class Riskified_Full_Helper_Data extends Mage_Core_Helper_Abstract {
87
  {
88
  return Riskified\Common\Riskified::API_VERSION;
89
  }
90
- }
2
 
3
  require_once(Mage::getBaseDir('lib') . DIRECTORY_SEPARATOR . 'riskified_php_sdk' . DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR . 'Riskified' . DIRECTORY_SEPARATOR . 'autoloader.php');
4
 
5
+ class Riskified_Full_Helper_Data extends Mage_Core_Helper_Abstract
6
+ {
7
 
8
+ public function getAdminUrl()
9
+ {
10
+ $out = null;
11
+ $match = preg_match("/(.*)full\/response\/getresponse.*/i", Mage::helper('adminhtml')->getUrl('full/response/getresponse'), $out);
12
+ if ($match) {
13
+ return $out[1];
14
+ } else {
15
+ return "";
16
+ }
17
  }
18
 
19
+ public function getAuthToken()
20
+ {
21
+ return Mage::getStoreConfig('fullsection/full/key', Mage::app()->getStore());
22
  }
23
 
24
+ public function getConfigStatusControlActive()
25
+ {
26
  return Mage::getStoreConfig('fullsection/full/order_status_sync');
27
  }
28
 
29
+ public function getConfigEnv()
30
+ {
31
  return 'Riskified\Common\Env::' . Mage::getStoreConfig('fullsection/full/env');
32
  }
33
 
34
+ public function getConfigEnableAutoInvoice()
35
+ {
36
  return Mage::getStoreConfig('fullsection/full/auto_invoice_enabled');
37
  }
38
 
39
+ public function getConfigAutoInvoiceCaptureCase()
40
+ {
41
  return Mage::getStoreConfig('fullsection/full/auto_invoice_capture_case');
42
  }
43
 
44
+ public function getConfigBeaconUrl()
45
+ {
46
  return Mage::getStoreConfig('fullsection/full/beaconurl');
47
  }
48
 
49
+ public function getShopDomain()
50
+ {
51
+ return Mage::getStoreConfig('fullsection/full/domain');
52
  }
53
 
54
+ public function getExtensionVersion()
55
+ {
56
+ return (string)Mage::getConfig()->getNode()->modules->Riskified_Full->version;
57
  }
58
 
59
+ public function getDeclinedState()
60
+ {
61
  return Mage::getStoreConfig('fullsection/full/declined_state');
62
  }
63
 
64
+ public function getDeclinedStatus()
65
+ {
66
  $state = $this->getDeclinedState();
67
+ return Mage::getStoreConfig('fullsection/full/declined_status_' . $state);
68
  }
69
 
70
+ public function getApprovedState()
71
+ {
72
  return Mage::getStoreConfig('fullsection/full/approved_state');
73
  }
74
 
75
+ public function getApprovedStatus()
76
+ {
77
  $state = $this->getApprovedState();
78
+ return Mage::getStoreConfig('fullsection/full/approved_status_' . $state);
79
  }
80
 
81
+ public function isDebugLogsEnabled()
82
+ {
83
+ return (bool)Mage::getStoreConfig('fullsection/full/debug_logs');
84
  }
85
 
86
  public function getSessionId(){
87
+ //return Mage::getSingleton("core/session")->getEncryptedSessionId();
88
+ //return Mage::getModel('core/cookie')->get('rCookie');
89
+ return Mage::getSingleton("core/session")->getSessionId();
90
  }
91
 
92
  /**
104
  {
105
  return Riskified\Common\Riskified::API_VERSION;
106
  }
107
+ }
app/code/community/Riskified/Full/Helper/Debug.php CHANGED
@@ -22,8 +22,7 @@ class Riskified_Full_Helper_Debug extends Mage_Core_Helper_Abstract
22
 
23
  try {
24
  $mail->send();
25
- }
26
- catch (Exception $e) {
27
  Mage::helper('full/log')->logException($e);
28
  }
29
  }
@@ -47,8 +46,8 @@ class Riskified_Full_Helper_Debug extends Mage_Core_Helper_Abstract
47
  // All Riskified config values
48
  $configGroups = Mage::getStoreConfig(self::CONFIG_SECTION);
49
 
50
- foreach($configGroups as $groupName => $group) {
51
- foreach($group as $fieldName => $field) {
52
  $data['magentoConfig-' . self::CONFIG_SECTION . '/' . $groupName . '/' . $fieldName] = $field;
53
  }
54
  }
22
 
23
  try {
24
  $mail->send();
25
+ } catch (Exception $e) {
 
26
  Mage::helper('full/log')->logException($e);
27
  }
28
  }
46
  // All Riskified config values
47
  $configGroups = Mage::getStoreConfig(self::CONFIG_SECTION);
48
 
49
+ foreach ($configGroups as $groupName => $group) {
50
+ foreach ($group as $fieldName => $field) {
51
  $data['magentoConfig-' . self::CONFIG_SECTION . '/' . $groupName . '/' . $fieldName] = $field;
52
  }
53
  }
app/code/community/Riskified/Full/Helper/Log.php CHANGED
@@ -2,10 +2,10 @@
2
 
3
  class Riskified_Full_Helper_Log extends Mage_Core_Helper_Abstract
4
  {
5
- public function log($message, $level = null)
6
- {
7
- Mage::log($message, $level, 'riskified_full.log');
8
- }
9
 
10
  public function logException($e)
11
  {
2
 
3
  class Riskified_Full_Helper_Log extends Mage_Core_Helper_Abstract
4
  {
5
+ public function log($message, $level = null)
6
+ {
7
+ Mage::log($message, $level, 'riskified_full.log');
8
+ }
9
 
10
  public function logException($e)
11
  {
app/code/community/Riskified/Full/Helper/Order.php CHANGED
@@ -9,13 +9,17 @@ use Riskified\OrderWebhook\Transport;
9
  use Riskified\DecisionNotification\Model\Notification as DecisionNotification;
10
 
11
 
12
- class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
 
13
  const ACTION_CREATE = 'create';
14
  const ACTION_UPDATE = 'update';
15
  const ACTION_SUBMIT = 'submit';
16
  const ACTION_CANCEL = 'cancel';
17
 
18
- public function __construct() {
 
 
 
19
  $this->initSdk();
20
  }
21
 
@@ -25,7 +29,8 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
25
  * @return stdClass
26
  * @throws Exception
27
  */
28
- public function updateMerchantSettings($settings) {
 
29
  $transport = $this->getTransport();
30
  Mage::helper('full/log')->log('updateMerchantSettings');
31
 
@@ -33,19 +38,18 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
33
  $response = $transport->updateMerchantSettings($settings);
34
 
35
  Mage::helper('full/log')->log('Merchant Settings posted successfully');
36
- } catch(\Riskified\OrderWebhook\Exception\UnsuccessfulActionException $uae) {
37
  if ($uae->statusCode == '401') {
38
  Mage::helper('full/log')->logException($uae);
39
  Mage::getSingleton('adminhtml/session')->addError('Make sure you have the correct Auth token as it appears in Riskified advanced settings.');
40
  }
41
  throw $uae;
42
- } catch(\Riskified\OrderWebhook\Exception\CurlException $curlException) {
43
  Mage::helper('full/log')->logException($curlException);
44
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $curlException->getMessage());
45
 
46
  throw $curlException;
47
- }
48
- catch (Exception $e) {
49
  Mage::helper('full/log')->logException($e);
50
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $e->getMessage());
51
 
@@ -54,6 +58,7 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
54
  return $response;
55
 
56
  }
 
57
  /**
58
  * Submit an order to Riskified.
59
  *
@@ -62,11 +67,12 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
62
  * @return stdClass
63
  * @throws Exception
64
  */
65
- public function postOrder($order, $action) {
 
66
  $transport = $this->getTransport();
67
  $headers = $this->getHeaders();
68
 
69
- Mage::helper('full/log')->log('postOrder ' . serialize($headers) . ' - ' . $action);
70
 
71
  $eventData = array(
72
  'order' => $order,
@@ -105,11 +111,11 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
105
  'riskified_full_post_order_success',
106
  $eventData
107
  );
108
- } catch(\Riskified\OrderWebhook\Exception\CurlException $curlException) {
109
  Mage::helper('full/log')->logException($curlException);
110
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $curlException->getMessage());
111
 
112
- $this->updateOrder($order, 'error',null, 'Error transferring order data to Riskified');
113
  $this->scheduleSubmissionRetry($order, $action);
114
 
115
  Mage::dispatchEvent(
@@ -118,8 +124,7 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
118
  );
119
 
120
  throw $curlException;
121
- }
122
- catch (Exception $e) {
123
  Mage::helper('full/log')->logException($e);
124
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $e->getMessage());
125
 
@@ -134,71 +139,76 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
134
  return $response;
135
  }
136
 
137
- public function postHistoricalOrders($models) {
 
138
  $orders = array();
139
  foreach ($models as $model) {
140
  $orders[] = $this->getOrder($model);
141
  }
142
 
143
  $msgs = $this->getTransport()->sendHistoricalOrders($orders);
144
- return "Successfully uploaded ".count($msgs)." orders.".PHP_EOL;
145
  }
146
 
147
- /**
148
- * Dispatch events for order update handling
149
- *
150
- * Possible events are:
151
- * - riskified_order_update
152
- * - riskified_order_update_approved
153
- * - riskified_order_update_declined
154
- * - riskified_order_update_submitted
155
- * - riskified_order_update_captured
156
  * - riskified_order_update_error
157
- * - riskified_order_update_?
158
- *
159
- * @param Mage_Sales_Model_Order $order
160
- * @param string $status
161
  * @param string $oldStatus
162
- * @param string $description
163
- * @return void
164
- */
165
- public function updateOrder($order, $status, $oldStatus, $description) {
166
- Mage::helper('full/log')->log('Dispatching event for order ' . $order->getId() . ' with status "' . $status .
 
167
  '" old status "' . $oldStatus . '" and description "' . $description . '"');
168
 
169
- $eventData = array(
170
- 'order' => $order,
171
- 'status' => $status,
172
  'old_status' => $oldStatus,
173
- 'description' => $description
174
- );
175
 
176
- // A generic event for all updates
177
- Mage::dispatchEvent(
178
- 'riskified_full_order_update',
179
- $eventData
180
- );
181
 
182
- // A status-specific event
183
- $eventIdentifier = preg_replace("/[^a-z]/", '_', strtolower($status));
184
 
185
- Mage::dispatchEvent(
186
- 'riskified_full_order_update_' . $eventIdentifier,
187
- $eventData
188
- );
189
 
190
- return;
191
  }
192
 
193
- public function getRiskifiedDomain() {
 
194
  return Riskified::getHostByEnv();
195
  }
196
 
197
- public function getRiskifiedApp() {
 
198
  return str_replace("wh", "app", $this->getRiskifiedDomain());
199
  }
200
 
201
- public function parseRequest($request) {
 
202
  $header_name = Signature\HttpDataSignature::HMAC_HEADER_NAME;
203
  $headers = array($header_name => $request->getHeader($header_name));
204
  $body = $request->getRawBody();
@@ -206,8 +216,9 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
206
  return new DecisionNotification(new Signature\HttpDataSignature(), $headers, $body);
207
  }
208
 
209
- public function getOrderOrigId($order) {
210
- if(!$order) {
 
211
  return null;
212
  }
213
  return $order->getId() . '_' . $order->getIncrementId();
@@ -215,7 +226,8 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
215
 
216
  private $version;
217
 
218
- private function initSdk() {
 
219
  $helper = Mage::helper('full');
220
  $authToken = $helper->getAuthToken();
221
  $env = constant($helper->getConfigEnv());
@@ -223,33 +235,37 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
223
  $this->version = $helper->getExtensionVersion();
224
  $sdkVersion = Riskified::VERSION;
225
 
226
- Mage::helper('full/log')->log("Riskified initSdk() - shop: $shopDomain, env: $env, token: $authToken, extension_version: $this->version, sdk_version: $sdkVersion");
227
  Riskified::init($shopDomain, $authToken, $env, Validations::SKIP);
228
  }
229
 
230
- private function getHeaders() {
231
- return array('headers' => array('X_RISKIFIED_VERSION:'.$this->version));
 
232
  }
233
 
234
- private function getTransport() {
 
235
  $transport = new Transport\CurlTransport(new Signature\HttpDataSignature());
236
  $transport->timeout = 15;
237
  return $transport;
238
  }
239
 
240
- private function getOrderCancellation($model) {
 
241
  $orderCancellation = new Model\OrderCancellation(array_filter(array(
242
  'id' => $this->getOrderOrigId($model),
243
  'cancelled_at' => $this->formatDateAsIso8601($this->getCancelledAt($model)),
244
  'cancel_reason' => 'Cancelled by merchant'
245
  )));
246
 
247
- Mage::helper('full/log')->log("getOrderCancellation(): ".PHP_EOL.json_encode(json_decode($orderCancellation->toJson())));
248
 
249
  return $orderCancellation;
250
  }
251
 
252
- private function getOrder($model) {
 
253
  $gateway = 'unavailable';
254
  if ($model->getPayment()) {
255
  $gateway = $model->getPayment()->getMethod();
@@ -269,7 +285,7 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
269
  'total_price' => $model->getGrandTotal(),
270
  'total_discounts' => $model->getDiscountAmount(),
271
  'subtotal_price' => $model->getBaseSubtotalInclTax(),
272
- 'discount_codes' =>$this->getDiscountCodes($model),
273
  'taxes_included' => true,
274
  'total_tax' => $model->getBaseTaxAmount(),
275
  'total_weight' => $model->getWeight(),
@@ -285,7 +301,7 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
285
  unset($order_array['cart_token']);
286
  }
287
 
288
- $order = new Model\Order(array_filter($order_array,'strlen'));
289
 
290
  $order->customer = $this->getCustomer($model);
291
  $order->shipping_address = $this->getShippingAddress($model);
@@ -298,12 +314,13 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
298
  $order->client_details = $this->getClientDetails($model);
299
  }
300
 
301
- Mage::helper('full/log')->log("getOrder(): ".PHP_EOL.json_encode(json_decode($order->toJson())));
302
 
303
  return $order;
304
  }
305
 
306
- private function getCustomer($model) {
 
307
  $customer_id = $model->getCustomerId();
308
  $customer_props = array(
309
  'id' => $customer_id,
@@ -315,112 +332,118 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
315
  );
316
 
317
  if ($customer_id) {
318
- $customer_details = Mage::getModel('customer/customer')->load($customer_id);
319
  $customer_props['created_at'] = $this->formatDateAsIso8601($customer_details->getCreatedAt());
320
  $customer_props['updated_at'] = $this->formatDateAsIso8601($customer_details->getUpdatedAt());
321
 
322
  try {
323
- $customer_orders = Mage::getModel('sales/order')->getCollection()->addFieldToFilter('customer_id', $customer_id);
324
- $customer_orders_count = $customer_orders->getSize();
325
-
326
- $customer_props['orders_count'] = $customer_orders_count;
327
- if ($customer_orders_count) {
328
- $customer_props['last_order_id'] = $customer_orders->getLastItem()->getId();
329
- $total_spent = $customer_orders
330
- ->addExpressionFieldToSelect('sum_total', 'SUM(base_grand_total)', 'base_grand_total')
331
- ->fetchItem()->getSumTotal();
332
- $customer_props['total_spent'] = $total_spent;
333
- }
334
  } catch (Exception $e) {
335
  Mage::helper('full/log')->logException($e);
336
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $e->getMessage());
337
  }
338
  }
339
 
340
- return new Model\Customer(array_filter($customer_props,'strlen'));
 
 
 
 
 
 
 
 
 
 
341
  }
342
 
343
- private function getShippingAddress($model) {
 
344
  $mageAddr = $model->getShippingAddress();
345
  return $this->getAddress($mageAddr);
346
  }
347
 
348
- private function getBillingAddress($model) {
 
349
  $mageAddr = $model->getBillingAddress();
350
  return $this->getAddress($mageAddr);
351
  }
352
 
353
- private function logPaymentData($model) {
 
354
  Mage::helper('full/log')->log("Payment info debug Logs:");
355
  try {
356
  $payment = $model->getPayment();
357
  $gatewayName = $payment->getMethod();
358
- Mage::helper('full/log')->log("Payment Gateway: ".$gatewayName);
359
- Mage::helper('full/log')->log("payment->getCcLast4(): ".$payment->getCcLast4());
360
- Mage::helper('full/log')->log("payment->getCcType(): ".$payment->getCcType());
361
- Mage::helper('full/log')->log("payment->getCcCidStatus(): ".$payment->getCcCidStatus());
362
- Mage::helper('full/log')->log("payment->getCcAvsStatus(): ".$payment->getCcAvsStatus());
363
- Mage::helper('full/log')->log("payment->getAdditionalInformation(): ".PHP_EOL.var_export($payment->getAdditionalInformation(), 1));
364
-
365
-
366
- Mage::helper('full/log')->log("payment->getAdyenPspReference(): ".$payment->getAdyenPspReference());
367
- Mage::helper('full/log')->log("payment->getAdyenKlarnaNumber(): ".$payment->getAdyenKlarnaNumber());
368
- Mage::helper('full/log')->log("payment->getAdyenAvsResult(): ".$payment->getAdyenAvsResult());
369
- Mage::helper('full/log')->log("payment->getAdyenCvcResult(): ".$payment->getAdyenCvcResult());
370
- Mage::helper('full/log')->log("payment->getAdyenBoletoPaidAmount(): ".$payment->getAdyenBoletoPaidAmount());
371
- Mage::helper('full/log')->log("payment->getAdyenTotalFraudScore(): ".$payment->getAdyenTotalFraudScore());
372
- Mage::helper('full/log')->log("payment->getAdyenRefusalReasonRaw(): ".$payment->getAdyenRefusalReasonRaw());
373
- Mage::helper('full/log')->log("payment->getAdyenAcquirerReference(): ".$payment->getAdyenAcquirerReference());
374
- Mage::helper('full/log')->log("payment->getAdyenAuthCode(): ".$payment->getAdyenAuthCode());
375
-
376
- Mage::helper('full/log')->log("payment->getInfo(): ".PHP_EOL.var_export($payment->getInfo(), 1));
377
 
378
  # paypal_avs_code,paypal_cvv2_match,paypal_fraud_filters,avs_result,cvv2_check_result,address_verification,
379
  # postcode_verification,payment_status,pending_reason,payer_id,payer_status,email,credit_card_cvv2,
380
  # cc_avs_status,cc_approval,cc_last4,cc_owner,cc_exp_month,cc_exp_year,
381
  $sage = $model->getSagepayInfo();
382
- if(is_object($sage)) {
383
  #####,postcode_result,avscv2,address_status,payer_status
384
- Mage::helper('full/log')->log("sagepay->getLastFourDigits(): ".$sage->getLastFourDigits());
385
- Mage::helper('full/log')->log("sagepay->last_four_digits: ".$sage->getData('last_four_digits'));
386
- Mage::helper('full/log')->log("sagepay->getCardType(): ".$sage->getCardType());
387
- Mage::helper('full/log')->log("sagepay->card_type: ".$sage->getData('card_type'));
388
- Mage::helper('full/log')->log("sagepay->getAvsCv2Status: ".$sage->getAvsCv2Status());
389
- Mage::helper('full/log')->log("sagepay->address_result: ".$sage->getData('address_result'));
390
- Mage::helper('full/log')->log("sagepay->getCv2result: ".$sage->getCv2result());
391
- Mage::helper('full/log')->log("sagepay->cv2result: ".$sage->getData('cv2result'));
392
- Mage::helper('full/log')->log("sagepay->getAvscv2: ".$sage->getAvscv2());
393
- Mage::helper('full/log')->log("sagepay->getAddressResult: ".$sage->getAddressResult());
394
- Mage::helper('full/log')->log("sagepay->getPostcodeResult: ".$sage->getPostcodeResult());
395
- Mage::helper('full/log')->log("sagepay->getDeclineCode: ".$sage->getDeclineCode());
396
- Mage::helper('full/log')->log("sagepay->getBankAuthCode: ".$sage->getBankAuthCode());
397
- Mage::helper('full/log')->log("sagepay->getPayerStatus: ".$sage->getPayerStatus());
398
  }
399
- if($gatewayName == "optimal_hosted") {
400
  $optimalTransaction = unserialize($payment->getAdditionalInformation('transaction'));
401
- if($optimalTransaction) {
402
  Mage::helper('full/log')->log("Optimal transaction: ");
403
- Mage::helper('full/log')->log("transaction->cvdVerification: ".$optimalTransaction->cvdVerification);
404
- Mage::helper('full/log')->log("transaction->houseNumberVerification: ".$optimalTransaction->houseNumberVerification);
405
- Mage::helper('full/log')->log("transaction->zipVerification: ".$optimalTransaction->zipVerification);
406
- }
407
- else {
408
  Mage::helper('full/log')->log("Optimal gateway but no transaction found");
409
  }
410
  }
411
 
412
- } catch(Exception $e) {
413
  Mage::helper('full/log')->logException($e);
414
  }
415
  }
416
 
417
- private function getPaymentDetails($model) {
 
418
  $payment = $model->getPayment();
419
- if(!$payment) {
420
  return null;
421
  }
422
 
423
- if(Mage::helper('full')->isDebugLogsEnabled()) {
424
  $this->logPaymentData($model);
425
  }
426
 
@@ -432,14 +455,22 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
432
  switch ($gatewayName) {
433
  case 'authorizenet':
434
  $authorize_data = $payment->getAdditionalInformation('authorize_cards');
435
- if($authorize_data && is_array($authorize_data)) {
436
  $cards_data = array_values($authorize_data);
437
  if ($cards_data && $cards_data[0]) {
438
  $card_data = $cards_data[0];
439
- if(isset($card_data['cc_last4'])) { $creditCardNumber = $card_data['cc_last4']; }
440
- if(isset($card_data['cc_type'])) { $creditCardCompany = $card_data['cc_type']; }
441
- if(isset($card_data['cc_avs_result_code'])) { $avsResultCode = $card_data['cc_avs_result_code']; }// getAvsResultCode
442
- if(isset($card_data['cc_response_code'])) { $cvvResultCode = $card_data['cc_response_code']; } // getCardCodeResponseCode
 
 
 
 
 
 
 
 
443
  }
444
  }
445
  break;
@@ -456,8 +487,8 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
456
  $houseVerification = $optimalTransaction->houseNumberVerification;
457
  $zipVerification = $optimalTransaction->zipVerification;
458
  $avsResultCode = $houseVerification . ',' . $zipVerification;
459
- } catch(Exception $e) {
460
- Mage::helper('full/log')->log("optimal payment (".$gatewayName.") additional payment info failed to parse:".$e->getMessage());
461
  }
462
  break;
463
  case 'paypal_express':
@@ -495,17 +526,16 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
495
  $creditCardNumber = $sage->getData('last_four_digits');
496
  $creditCardCompany = $sage->getData('card_type');
497
  //Mage::helper('full/log')->log("sagepay payment (".$gatewayName.") additional info: ".PHP_EOL.var_export($sage->getAdditionalInformation(), 1));
498
- Mage::helper('full/log')->log("sagepay payment (".$gatewayName.") additional info: ".PHP_EOL.var_export($payment->getAdditionalInformation(), 1));
499
- }
500
- else {
501
- Mage::helper('full/log')->log("sagepay payment (".$gatewayName.") - getSagepayInfo returned null object");
502
  }
503
  break;
504
 
505
  case 'transarmor':
506
  $avsResultCode = $payment->getAdditionalInformation('avs_response');
507
  $cvvResultCode = $payment->getAdditionalInformation('cvv2_response');
508
- Mage::helper('full/log')->log("transarmor payment additional info: ".PHP_EOL.var_export($payment->getAdditionalInformation(), 1));
509
  break;
510
 
511
  case 'braintreevzero':
@@ -516,9 +546,16 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
516
  $avsResultCode = $houseVerification . ',' . $zipVerification;
517
  break;
518
 
 
 
 
 
 
 
 
519
  default:
520
  Mage::helper('full/log')->log("unknown gateway:" . $gatewayName);
521
- Mage::helper('full/log')->log("Gateway payment (".$gatewayName.") additional info: ".PHP_EOL.var_export($payment->getAdditionalInformation(), 1));
522
  break;
523
  }
524
  } catch (Exception $e) {
@@ -553,35 +590,40 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
553
  'credit_card_number' => $creditCardNumber,
554
  'credit_card_company' => $creditCardCompany,
555
  'credit_card_bin' => $creditCardBin
556
- ),'strlen'));
557
  }
558
 
559
- private function getLineItems($model) {
 
560
  $lineItems = array();
561
  foreach ($model->getAllVisibleItems() as $key => $val) {
562
  $prodType = null;
563
  $category = null;
564
  $subCategories = null;
 
565
  $product = $val->getProduct();
566
- if($product) {
567
  $prodType = $val->getProduct()->getTypeId();
568
  $categoryIds = $product->getCategoryIds();
569
  foreach ($categoryIds as $categoryId) {
570
  $cat = Mage::getModel('catalog/category')->load($categoryId);
571
  $catName = $cat->getName();
572
  if (!empty($catName)) {
573
- if(empty($category)) {
574
  $category = $catName;
575
- }
576
- else if(empty($subCategories)) {
577
  $subCategories = $catName;
578
- }
579
- else {
580
  $subCategories = $subCategories . '|' . $catName;
581
  }
582
 
583
  }
584
  }
 
 
 
 
 
585
  }
586
  $lineItems[] = new Model\LineItem(array_filter(array(
587
  'price' => $val->getPrice(),
@@ -592,31 +634,35 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
592
  'grams' => $val->getWeight(),
593
  'product_type' => $prodType,
594
  'category' => $category,
 
595
  //'sub_category' => $subCategories
596
- ),'strlen'));
597
  }
598
 
599
  return $lineItems;
600
  }
601
 
602
- private function getShippingLines($model) {
 
603
  return new Model\ShippingLine(array_filter(array(
604
  'price' => $model->getShippingAmount(),
605
  'title' => $model->getShippingDescription(),
606
  'code' => $model->getShippingMethod()
607
- ),'strlen'));
608
  }
609
 
610
- private function getClientDetails($model) {
 
611
  return new Model\ClientDetails(array_filter(array(
612
  'accept_language' => Mage::app()->getLocale()->getLocaleCode(),
613
  //'browser_ip' => $this->getRemoteIp($model),
614
  'user_agent' => Mage::helper('core/http')->getHttpUserAgent()
615
- ),'strlen'));
616
  }
617
 
618
- private function getAddress($address) {
619
- if(!$address) {
 
620
  return null;
621
  }
622
 
@@ -624,7 +670,7 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
624
  $address_1 = (!is_null($street) && array_key_exists('0', $street)) ? $street['0'] : null;
625
  $address_2 = (!is_null($street) && array_key_exists('1', $street)) ? $street['1'] : null;
626
 
627
- $addrArray = array_filter(array(
628
  'first_name' => $address->getFirstname(),
629
  'last_name' => $address->getLastname(),
630
  'name' => $address->getFirstname() . " " . $address->getLastname(),
@@ -639,13 +685,14 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
639
  'phone' => $address->getTelephone(),
640
  ), 'strlen');
641
 
642
- if(!$addrArray) {
643
  return null;
644
  }
645
  return new Model\Address($addrArray);
646
  }
647
 
648
- private function getDiscountCodes($model) {
 
649
  $code = $model->getDiscountDescription();
650
  $amount = $model->getDiscountAmount();
651
  if ($amount && $code)
@@ -656,7 +703,8 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
656
  return null;
657
  }
658
 
659
- private function getCancelledAt($model) {
 
660
  $commentCollection = $model->getStatusHistoryCollection();
661
  foreach ($commentCollection as $comment) {
662
  if ($comment->getStatus() == Mage_Sales_Model_Order::STATE_CANCELED) {
@@ -666,20 +714,22 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
666
  return null;
667
  }
668
 
669
- private function formatDateAsIso8601($dateStr) {
670
- return ($dateStr==NULL) ? NULL : date('c',strtotime($dateStr));
 
671
  }
672
 
673
- private function getRemoteIp($model) {
 
674
  Mage::helper('full/log')->log("remote ip: " . $model->getRemoteIp() . ", x-forwarded-ip: " . $model->getXForwardedFor());
675
 
676
  $forwardedIp = $model->getXForwardedFor();
677
- $forwardeds = preg_split("/,/",$forwardedIp, -1, PREG_SPLIT_NO_EMPTY);
678
  if (!empty($forwardeds)) {
679
  return trim($forwardeds[0]);
680
  }
681
  $remoteIp = $model->getRemoteIp();
682
- $remotes = preg_split("/,/",$remoteIp, -1, PREG_SPLIT_NO_EMPTY);
683
  if (!empty($remotes)) {
684
  return trim($remotes[0]);
685
  }
@@ -706,7 +756,7 @@ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract {
706
  // Only schedule a retry if one doesn't exist for this order/action combination.
707
  // If one already exists it will be updated in Riskified_Full_Model_Cron::retrySubmissions() so
708
  // there is no need to do anything here (eg update the existing retry).
709
- if ($existingRetries->count() == 0) {
710
  Mage::getModel('full/retry')
711
  ->addData(array(
712
  'order_id' => $order->getId(),
9
  use Riskified\DecisionNotification\Model\Notification as DecisionNotification;
10
 
11
 
12
+ class Riskified_Full_Helper_Order extends Mage_Core_Helper_Abstract
13
+ {
14
  const ACTION_CREATE = 'create';
15
  const ACTION_UPDATE = 'update';
16
  const ACTION_SUBMIT = 'submit';
17
  const ACTION_CANCEL = 'cancel';
18
 
19
+ private $_customer = array();
20
+
21
+ public function __construct()
22
+ {
23
  $this->initSdk();
24
  }
25
 
29
  * @return stdClass
30
  * @throws Exception
31
  */
32
+ public function updateMerchantSettings($settings)
33
+ {
34
  $transport = $this->getTransport();
35
  Mage::helper('full/log')->log('updateMerchantSettings');
36
 
38
  $response = $transport->updateMerchantSettings($settings);
39
 
40
  Mage::helper('full/log')->log('Merchant Settings posted successfully');
41
+ } catch (\Riskified\OrderWebhook\Exception\UnsuccessfulActionException $uae) {
42
  if ($uae->statusCode == '401') {
43
  Mage::helper('full/log')->logException($uae);
44
  Mage::getSingleton('adminhtml/session')->addError('Make sure you have the correct Auth token as it appears in Riskified advanced settings.');
45
  }
46
  throw $uae;
47
+ } catch (\Riskified\OrderWebhook\Exception\CurlException $curlException) {
48
  Mage::helper('full/log')->logException($curlException);
49
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $curlException->getMessage());
50
 
51
  throw $curlException;
52
+ } catch (Exception $e) {
 
53
  Mage::helper('full/log')->logException($e);
54
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $e->getMessage());
55
 
58
  return $response;
59
 
60
  }
61
+
62
  /**
63
  * Submit an order to Riskified.
64
  *
67
  * @return stdClass
68
  * @throws Exception
69
  */
70
+ public function postOrder($order, $action)
71
+ {
72
  $transport = $this->getTransport();
73
  $headers = $this->getHeaders();
74
 
75
+ Mage::helper('full/log')->log('postOrder ' . serialize($headers) . ' - ' . $action);
76
 
77
  $eventData = array(
78
  'order' => $order,
111
  'riskified_full_post_order_success',
112
  $eventData
113
  );
114
+ } catch (\Riskified\OrderWebhook\Exception\CurlException $curlException) {
115
  Mage::helper('full/log')->logException($curlException);
116
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $curlException->getMessage());
117
 
118
+ $this->updateOrder($order, 'error', null, 'Error transferring order data to Riskified');
119
  $this->scheduleSubmissionRetry($order, $action);
120
 
121
  Mage::dispatchEvent(
124
  );
125
 
126
  throw $curlException;
127
+ } catch (Exception $e) {
 
128
  Mage::helper('full/log')->logException($e);
129
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $e->getMessage());
130
 
139
  return $response;
140
  }
141
 
142
+ public function postHistoricalOrders($models)
143
+ {
144
  $orders = array();
145
  foreach ($models as $model) {
146
  $orders[] = $this->getOrder($model);
147
  }
148
 
149
  $msgs = $this->getTransport()->sendHistoricalOrders($orders);
150
+ return "Successfully uploaded " . count($msgs) . " orders." . PHP_EOL;
151
  }
152
 
153
+ /**
154
+ * Dispatch events for order update handling
155
+ *
156
+ * Possible events are:
157
+ * - riskified_order_update
158
+ * - riskified_order_update_approved
159
+ * - riskified_order_update_declined
160
+ * - riskified_order_update_submitted
161
+ * - riskified_order_update_captured
162
  * - riskified_order_update_error
163
+ * - riskified_order_update_?
164
+ *
165
+ * @param Mage_Sales_Model_Order $order
166
+ * @param string $status
167
  * @param string $oldStatus
168
+ * @param string $description
169
+ * @return void
170
+ */
171
+ public function updateOrder($order, $status, $oldStatus, $description)
172
+ {
173
+ Mage::helper('full/log')->log('Dispatching event for order ' . $order->getId() . ' with status "' . $status .
174
  '" old status "' . $oldStatus . '" and description "' . $description . '"');
175
 
176
+ $eventData = array(
177
+ 'order' => $order,
178
+ 'status' => $status,
179
  'old_status' => $oldStatus,
180
+ 'description' => $description
181
+ );
182
 
183
+ // A generic event for all updates
184
+ Mage::dispatchEvent(
185
+ 'riskified_full_order_update',
186
+ $eventData
187
+ );
188
 
189
+ // A status-specific event
190
+ $eventIdentifier = preg_replace("/[^a-z]/", '_', strtolower($status));
191
 
192
+ Mage::dispatchEvent(
193
+ 'riskified_full_order_update_' . $eventIdentifier,
194
+ $eventData
195
+ );
196
 
197
+ return;
198
  }
199
 
200
+ public function getRiskifiedDomain()
201
+ {
202
  return Riskified::getHostByEnv();
203
  }
204
 
205
+ public function getRiskifiedApp()
206
+ {
207
  return str_replace("wh", "app", $this->getRiskifiedDomain());
208
  }
209
 
210
+ public function parseRequest($request)
211
+ {
212
  $header_name = Signature\HttpDataSignature::HMAC_HEADER_NAME;
213
  $headers = array($header_name => $request->getHeader($header_name));
214
  $body = $request->getRawBody();
216
  return new DecisionNotification(new Signature\HttpDataSignature(), $headers, $body);
217
  }
218
 
219
+ public function getOrderOrigId($order)
220
+ {
221
+ if (!$order) {
222
  return null;
223
  }
224
  return $order->getId() . '_' . $order->getIncrementId();
226
 
227
  private $version;
228
 
229
+ private function initSdk()
230
+ {
231
  $helper = Mage::helper('full');
232
  $authToken = $helper->getAuthToken();
233
  $env = constant($helper->getConfigEnv());
235
  $this->version = $helper->getExtensionVersion();
236
  $sdkVersion = Riskified::VERSION;
237
 
238
+ Mage::helper('full/log')->log("Riskified initSdk() - shop: $shopDomain, env: $env, token: $authToken, extension_version: $this->version, sdk_version: $sdkVersion");
239
  Riskified::init($shopDomain, $authToken, $env, Validations::SKIP);
240
  }
241
 
242
+ private function getHeaders()
243
+ {
244
+ return array('headers' => array('X_RISKIFIED_VERSION:' . $this->version));
245
  }
246
 
247
+ private function getTransport()
248
+ {
249
  $transport = new Transport\CurlTransport(new Signature\HttpDataSignature());
250
  $transport->timeout = 15;
251
  return $transport;
252
  }
253
 
254
+ private function getOrderCancellation($model)
255
+ {
256
  $orderCancellation = new Model\OrderCancellation(array_filter(array(
257
  'id' => $this->getOrderOrigId($model),
258
  'cancelled_at' => $this->formatDateAsIso8601($this->getCancelledAt($model)),
259
  'cancel_reason' => 'Cancelled by merchant'
260
  )));
261
 
262
+ Mage::helper('full/log')->log("getOrderCancellation(): " . PHP_EOL . json_encode(json_decode($orderCancellation->toJson())));
263
 
264
  return $orderCancellation;
265
  }
266
 
267
+ private function getOrder($model)
268
+ {
269
  $gateway = 'unavailable';
270
  if ($model->getPayment()) {
271
  $gateway = $model->getPayment()->getMethod();
285
  'total_price' => $model->getGrandTotal(),
286
  'total_discounts' => $model->getDiscountAmount(),
287
  'subtotal_price' => $model->getBaseSubtotalInclTax(),
288
+ 'discount_codes' => $this->getDiscountCodes($model),
289
  'taxes_included' => true,
290
  'total_tax' => $model->getBaseTaxAmount(),
291
  'total_weight' => $model->getWeight(),
301
  unset($order_array['cart_token']);
302
  }
303
 
304
+ $order = new Model\Order(array_filter($order_array, 'strlen'));
305
 
306
  $order->customer = $this->getCustomer($model);
307
  $order->shipping_address = $this->getShippingAddress($model);
314
  $order->client_details = $this->getClientDetails($model);
315
  }
316
 
317
+ Mage::helper('full/log')->log("getOrder(): " . PHP_EOL . json_encode(json_decode($order->toJson())));
318
 
319
  return $order;
320
  }
321
 
322
+ private function getCustomer($model)
323
+ {
324
  $customer_id = $model->getCustomerId();
325
  $customer_props = array(
326
  'id' => $customer_id,
332
  );
333
 
334
  if ($customer_id) {
335
+ $customer_details = $this->_getCustomerObject($model->getCustomerId());
336
  $customer_props['created_at'] = $this->formatDateAsIso8601($customer_details->getCreatedAt());
337
  $customer_props['updated_at'] = $this->formatDateAsIso8601($customer_details->getUpdatedAt());
338
 
339
  try {
340
+ $customer_data = Mage::helper('full/customer_order')->getCustomerOrders($model->getCustomerId());
341
+ $customer_props['total_spent'] = $customer_data['total_spent'];
342
+ $customer_props['orders_count'] = $customer_data['orders_count'];
343
+ $customer_props['last_order_id'] = $customer_data['last_order_id'];
 
 
 
 
 
 
 
344
  } catch (Exception $e) {
345
  Mage::helper('full/log')->logException($e);
346
  Mage::getSingleton('adminhtml/session')->addError('Riskified extension: ' . $e->getMessage());
347
  }
348
  }
349
 
350
+ return new Model\Customer(array_filter($customer_props, 'strlen'));
351
+ }
352
+
353
+ private function _getCustomerObject($customer_id) {
354
+ if(!isset($this->_customer[$customer_id])) {
355
+ $collection = Mage::getModel('customer/customer')->getCollection();
356
+ $collection->addAttributeToFilter('entity_id', $customer_id);
357
+ $this->_customer[$customer_id] = $collection->getFirstItem();
358
+ }
359
+
360
+ return $this->_customer[$customer_id];
361
  }
362
 
363
+ private function getShippingAddress($model)
364
+ {
365
  $mageAddr = $model->getShippingAddress();
366
  return $this->getAddress($mageAddr);
367
  }
368
 
369
+ private function getBillingAddress($model)
370
+ {
371
  $mageAddr = $model->getBillingAddress();
372
  return $this->getAddress($mageAddr);
373
  }
374
 
375
+ private function logPaymentData($model)
376
+ {
377
  Mage::helper('full/log')->log("Payment info debug Logs:");
378
  try {
379
  $payment = $model->getPayment();
380
  $gatewayName = $payment->getMethod();
381
+ Mage::helper('full/log')->log("Payment Gateway: " . $gatewayName);
382
+ Mage::helper('full/log')->log("payment->getCcLast4(): " . $payment->getCcLast4());
383
+ Mage::helper('full/log')->log("payment->getCcType(): " . $payment->getCcType());
384
+ Mage::helper('full/log')->log("payment->getCcCidStatus(): " . $payment->getCcCidStatus());
385
+ Mage::helper('full/log')->log("payment->getCcAvsStatus(): " . $payment->getCcAvsStatus());
386
+ Mage::helper('full/log')->log("payment->getAdditionalInformation(): " . PHP_EOL . var_export($payment->getAdditionalInformation(), 1));
387
+
388
+
389
+ Mage::helper('full/log')->log("payment->getAdyenPspReference(): " . $payment->getAdyenPspReference());
390
+ Mage::helper('full/log')->log("payment->getAdyenKlarnaNumber(): " . $payment->getAdyenKlarnaNumber());
391
+ Mage::helper('full/log')->log("payment->getAdyenAvsResult(): " . $payment->getAdyenAvsResult());
392
+ Mage::helper('full/log')->log("payment->getAdyenCvcResult(): " . $payment->getAdyenCvcResult());
393
+ Mage::helper('full/log')->log("payment->getAdyenBoletoPaidAmount(): " . $payment->getAdyenBoletoPaidAmount());
394
+ Mage::helper('full/log')->log("payment->getAdyenTotalFraudScore(): " . $payment->getAdyenTotalFraudScore());
395
+ Mage::helper('full/log')->log("payment->getAdyenRefusalReasonRaw(): " . $payment->getAdyenRefusalReasonRaw());
396
+ Mage::helper('full/log')->log("payment->getAdyenAcquirerReference(): " . $payment->getAdyenAcquirerReference());
397
+ Mage::helper('full/log')->log("(possibly BIN?) payment->getAdyenAuthCode(): " . $payment->getAdyenAuthCode());
398
+
399
+ Mage::helper('full/log')->log("payment->getInfo(): " . PHP_EOL . var_export($payment->getInfo(), 1));
400
 
401
  # paypal_avs_code,paypal_cvv2_match,paypal_fraud_filters,avs_result,cvv2_check_result,address_verification,
402
  # postcode_verification,payment_status,pending_reason,payer_id,payer_status,email,credit_card_cvv2,
403
  # cc_avs_status,cc_approval,cc_last4,cc_owner,cc_exp_month,cc_exp_year,
404
  $sage = $model->getSagepayInfo();
405
+ if (is_object($sage)) {
406
  #####,postcode_result,avscv2,address_status,payer_status
407
+ Mage::helper('full/log')->log("sagepay->getLastFourDigits(): " . $sage->getLastFourDigits());
408
+ Mage::helper('full/log')->log("sagepay->last_four_digits: " . $sage->getData('last_four_digits'));
409
+ Mage::helper('full/log')->log("sagepay->getCardType(): " . $sage->getCardType());
410
+ Mage::helper('full/log')->log("sagepay->card_type: " . $sage->getData('card_type'));
411
+ Mage::helper('full/log')->log("sagepay->getAvsCv2Status: " . $sage->getAvsCv2Status());
412
+ Mage::helper('full/log')->log("sagepay->address_result: " . $sage->getData('address_result'));
413
+ Mage::helper('full/log')->log("sagepay->getCv2result: " . $sage->getCv2result());
414
+ Mage::helper('full/log')->log("sagepay->cv2result: " . $sage->getData('cv2result'));
415
+ Mage::helper('full/log')->log("sagepay->getAvscv2: " . $sage->getAvscv2());
416
+ Mage::helper('full/log')->log("sagepay->getAddressResult: " . $sage->getAddressResult());
417
+ Mage::helper('full/log')->log("sagepay->getPostcodeResult: " . $sage->getPostcodeResult());
418
+ Mage::helper('full/log')->log("sagepay->getDeclineCode: " . $sage->getDeclineCode());
419
+ Mage::helper('full/log')->log("sagepay->getBankAuthCode: " . $sage->getBankAuthCode());
420
+ Mage::helper('full/log')->log("sagepay->getPayerStatus: " . $sage->getPayerStatus());
421
  }
422
+ if ($gatewayName == "optimal_hosted") {
423
  $optimalTransaction = unserialize($payment->getAdditionalInformation('transaction'));
424
+ if ($optimalTransaction) {
425
  Mage::helper('full/log')->log("Optimal transaction: ");
426
+ Mage::helper('full/log')->log("transaction->cvdVerification: " . $optimalTransaction->cvdVerification);
427
+ Mage::helper('full/log')->log("transaction->houseNumberVerification: " . $optimalTransaction->houseNumberVerification);
428
+ Mage::helper('full/log')->log("transaction->zipVerification: " . $optimalTransaction->zipVerification);
429
+ } else {
 
430
  Mage::helper('full/log')->log("Optimal gateway but no transaction found");
431
  }
432
  }
433
 
434
+ } catch (Exception $e) {
435
  Mage::helper('full/log')->logException($e);
436
  }
437
  }
438
 
439
+ private function getPaymentDetails($model)
440
+ {
441
  $payment = $model->getPayment();
442
+ if (!$payment) {
443
  return null;
444
  }
445
 
446
+ if (Mage::helper('full')->isDebugLogsEnabled()) {
447
  $this->logPaymentData($model);
448
  }
449
 
455
  switch ($gatewayName) {
456
  case 'authorizenet':
457
  $authorize_data = $payment->getAdditionalInformation('authorize_cards');
458
+ if ($authorize_data && is_array($authorize_data)) {
459
  $cards_data = array_values($authorize_data);
460
  if ($cards_data && $cards_data[0]) {
461
  $card_data = $cards_data[0];
462
+ if (isset($card_data['cc_last4'])) {
463
+ $creditCardNumber = $card_data['cc_last4'];
464
+ }
465
+ if (isset($card_data['cc_type'])) {
466
+ $creditCardCompany = $card_data['cc_type'];
467
+ }
468
+ if (isset($card_data['cc_avs_result_code'])) {
469
+ $avsResultCode = $card_data['cc_avs_result_code'];
470
+ }// getAvsResultCode
471
+ if (isset($card_data['cc_response_code'])) {
472
+ $cvvResultCode = $card_data['cc_response_code'];
473
+ } // getCardCodeResponseCode
474
  }
475
  }
476
  break;
487
  $houseVerification = $optimalTransaction->houseNumberVerification;
488
  $zipVerification = $optimalTransaction->zipVerification;
489
  $avsResultCode = $houseVerification . ',' . $zipVerification;
490
+ } catch (Exception $e) {
491
+ Mage::helper('full/log')->log("optimal payment (" . $gatewayName . ") additional payment info failed to parse:" . $e->getMessage());
492
  }
493
  break;
494
  case 'paypal_express':
526
  $creditCardNumber = $sage->getData('last_four_digits');
527
  $creditCardCompany = $sage->getData('card_type');
528
  //Mage::helper('full/log')->log("sagepay payment (".$gatewayName.") additional info: ".PHP_EOL.var_export($sage->getAdditionalInformation(), 1));
529
+ Mage::helper('full/log')->log("sagepay payment (" . $gatewayName . ") additional info: " . PHP_EOL . var_export($payment->getAdditionalInformation(), 1));
530
+ } else {
531
+ Mage::helper('full/log')->log("sagepay payment (" . $gatewayName . ") - getSagepayInfo returned null object");
 
532
  }
533
  break;
534
 
535
  case 'transarmor':
536
  $avsResultCode = $payment->getAdditionalInformation('avs_response');
537
  $cvvResultCode = $payment->getAdditionalInformation('cvv2_response');
538
+ Mage::helper('full/log')->log("transarmor payment additional info: " . PHP_EOL . var_export($payment->getAdditionalInformation(), 1));
539
  break;
540
 
541
  case 'braintreevzero':
546
  $avsResultCode = $houseVerification . ',' . $zipVerification;
547
  break;
548
 
549
+ case 'adyen_cc':
550
+ $avsResultCode = $payment->getAdyenAvsResult();
551
+ $cvvResultCode = $payment->getAdyenCvcResult();
552
+ $transactionId = $payment->getAdyenPspReference();
553
+ $creditCardBin = $payment->getAdyenCardBin();
554
+ break;
555
+
556
  default:
557
  Mage::helper('full/log')->log("unknown gateway:" . $gatewayName);
558
+ Mage::helper('full/log')->log("Gateway payment (" . $gatewayName . ") additional info: " . PHP_EOL . var_export($payment->getAdditionalInformation(), 1));
559
  break;
560
  }
561
  } catch (Exception $e) {
590
  'credit_card_number' => $creditCardNumber,
591
  'credit_card_company' => $creditCardCompany,
592
  'credit_card_bin' => $creditCardBin
593
+ ), 'strlen'));
594
  }
595
 
596
+ private function getLineItems($model)
597
+ {
598
  $lineItems = array();
599
  foreach ($model->getAllVisibleItems() as $key => $val) {
600
  $prodType = null;
601
  $category = null;
602
  $subCategories = null;
603
+ $brand = null;
604
  $product = $val->getProduct();
605
+ if ($product) {
606
  $prodType = $val->getProduct()->getTypeId();
607
  $categoryIds = $product->getCategoryIds();
608
  foreach ($categoryIds as $categoryId) {
609
  $cat = Mage::getModel('catalog/category')->load($categoryId);
610
  $catName = $cat->getName();
611
  if (!empty($catName)) {
612
+ if (empty($category)) {
613
  $category = $catName;
614
+ } else if (empty($subCategories)) {
 
615
  $subCategories = $catName;
616
+ } else {
 
617
  $subCategories = $subCategories . '|' . $catName;
618
  }
619
 
620
  }
621
  }
622
+
623
+
624
+ if ($product->getManufacturer()) {
625
+ $brand = $product->getAttributeText('manufacturer');
626
+ }
627
  }
628
  $lineItems[] = new Model\LineItem(array_filter(array(
629
  'price' => $val->getPrice(),
634
  'grams' => $val->getWeight(),
635
  'product_type' => $prodType,
636
  'category' => $category,
637
+ 'brand' => $brand,
638
  //'sub_category' => $subCategories
639
+ ), 'strlen'));
640
  }
641
 
642
  return $lineItems;
643
  }
644
 
645
+ private function getShippingLines($model)
646
+ {
647
  return new Model\ShippingLine(array_filter(array(
648
  'price' => $model->getShippingAmount(),
649
  'title' => $model->getShippingDescription(),
650
  'code' => $model->getShippingMethod()
651
+ ), 'strlen'));
652
  }
653
 
654
+ private function getClientDetails($model)
655
+ {
656
  return new Model\ClientDetails(array_filter(array(
657
  'accept_language' => Mage::app()->getLocale()->getLocaleCode(),
658
  //'browser_ip' => $this->getRemoteIp($model),
659
  'user_agent' => Mage::helper('core/http')->getHttpUserAgent()
660
+ ), 'strlen'));
661
  }
662
 
663
+ private function getAddress($address)
664
+ {
665
+ if (!$address) {
666
  return null;
667
  }
668
 
670
  $address_1 = (!is_null($street) && array_key_exists('0', $street)) ? $street['0'] : null;
671
  $address_2 = (!is_null($street) && array_key_exists('1', $street)) ? $street['1'] : null;
672
 
673
+ $addrArray = array_filter(array(
674
  'first_name' => $address->getFirstname(),
675
  'last_name' => $address->getLastname(),
676
  'name' => $address->getFirstname() . " " . $address->getLastname(),
685
  'phone' => $address->getTelephone(),
686
  ), 'strlen');
687
 
688
+ if (!$addrArray) {
689
  return null;
690
  }
691
  return new Model\Address($addrArray);
692
  }
693
 
694
+ private function getDiscountCodes($model)
695
+ {
696
  $code = $model->getDiscountDescription();
697
  $amount = $model->getDiscountAmount();
698
  if ($amount && $code)
703
  return null;
704
  }
705
 
706
+ private function getCancelledAt($model)
707
+ {
708
  $commentCollection = $model->getStatusHistoryCollection();
709
  foreach ($commentCollection as $comment) {
710
  if ($comment->getStatus() == Mage_Sales_Model_Order::STATE_CANCELED) {
714
  return null;
715
  }
716
 
717
+ private function formatDateAsIso8601($dateStr)
718
+ {
719
+ return ($dateStr == NULL) ? NULL : date('c', strtotime($dateStr));
720
  }
721
 
722
+ private function getRemoteIp($model)
723
+ {
724
  Mage::helper('full/log')->log("remote ip: " . $model->getRemoteIp() . ", x-forwarded-ip: " . $model->getXForwardedFor());
725
 
726
  $forwardedIp = $model->getXForwardedFor();
727
+ $forwardeds = preg_split("/,/", $forwardedIp, -1, PREG_SPLIT_NO_EMPTY);
728
  if (!empty($forwardeds)) {
729
  return trim($forwardeds[0]);
730
  }
731
  $remoteIp = $model->getRemoteIp();
732
+ $remotes = preg_split("/,/", $remoteIp, -1, PREG_SPLIT_NO_EMPTY);
733
  if (!empty($remotes)) {
734
  return trim($remotes[0]);
735
  }
756
  // Only schedule a retry if one doesn't exist for this order/action combination.
757
  // If one already exists it will be updated in Riskified_Full_Model_Cron::retrySubmissions() so
758
  // there is no need to do anything here (eg update the existing retry).
759
+ if ($existingRetries->getSize() == 0) {
760
  Mage::getModel('full/retry')
761
  ->addData(array(
762
  'order_id' => $order->getId(),
app/code/community/Riskified/Full/Helper/Order/Invoice.php CHANGED
@@ -3,29 +3,29 @@
3
  class Riskified_Full_Helper_Order_Invoice extends Mage_Core_Helper_Abstract
4
  {
5
 
6
- /**
7
- * Has this user enabled auto-invoicing when orders are approved?
8
- *
9
- * @return bool
10
- */
11
- public function isAutoInvoiceEnabled()
12
- {
13
- return (bool) Mage::getStoreConfig('fullsection/full/auto_invoice_enabled');
14
- }
15
 
16
- /**
17
- * Get the capture case to be used during auto-invoicing
18
- *
19
- * @return string
20
- */
21
- public function getCaptureCase()
22
- {
23
- $case = Mage::getStoreConfig('fullsection/full/auto_invoice_capture_case');
24
 
25
- if (!in_array($case, array(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE, Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE))) {
26
- $case = Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE;
27
- }
28
 
29
- return $case;
30
- }
31
  }
3
  class Riskified_Full_Helper_Order_Invoice extends Mage_Core_Helper_Abstract
4
  {
5
 
6
+ /**
7
+ * Has this user enabled auto-invoicing when orders are approved?
8
+ *
9
+ * @return bool
10
+ */
11
+ public function isAutoInvoiceEnabled()
12
+ {
13
+ return (bool)Mage::getStoreConfig('fullsection/full/auto_invoice_enabled');
14
+ }
15
 
16
+ /**
17
+ * Get the capture case to be used during auto-invoicing
18
+ *
19
+ * @return string
20
+ */
21
+ public function getCaptureCase()
22
+ {
23
+ $case = Mage::getStoreConfig('fullsection/full/auto_invoice_capture_case');
24
 
25
+ if (!in_array($case, array(Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE, Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE))) {
26
+ $case = Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE;
27
+ }
28
 
29
+ return $case;
30
+ }
31
  }
app/code/community/Riskified/Full/Helper/Order/Status.php CHANGED
@@ -2,25 +2,25 @@
2
 
3
  class Riskified_Full_Helper_Order_Status extends Mage_Core_Helper_Abstract
4
  {
5
- /**
6
- * Get Riskified's custom "on hold for review" status code
7
- *
8
- * @return string
9
- */
10
- public function getOnHoldStatusCode()
11
- {
12
- return 'riskified_holded';
13
- }
14
-
15
- /**
16
- * Get Riskified's custom "on hold for review" status label
17
- *
18
- * @return string
19
- */
20
- public function getOnHoldStatusLabel()
21
- {
22
- return 'Under Review (Riskified)';
23
- }
24
 
25
  /**
26
  * Get Riskified's custom "on hold due to transport error" status code
@@ -91,7 +91,7 @@ class Riskified_Full_Helper_Order_Status extends Mage_Core_Helper_Abstract
91
  {
92
  $state = Mage::helper('full')->getApprovedState();
93
 
94
- if (!in_array($state, array(Mage_Sales_Model_Order::STATE_PROCESSING,Mage_Sales_Model_Order::STATE_HOLDED))) {
95
  $state = Mage_Sales_Model_Order::STATE_PROCESSING;
96
  }
97
 
@@ -110,7 +110,7 @@ class Riskified_Full_Helper_Order_Status extends Mage_Core_Helper_Abstract
110
  $allowedStatuses = Mage::getSingleton('sales/order_config')->getStateStatuses($this->getSelectedApprovedState());
111
  if (!in_array($status, array_keys($allowedStatuses))) {
112
  $status = $this->getRiskifiedApprovedStatusCode();
113
- Mage::helper('full/log')->log("approved status: ".$status." not found in: ".var_export($allowedStatuses,1));
114
  }
115
 
116
  return $status;
@@ -125,7 +125,7 @@ class Riskified_Full_Helper_Order_Status extends Mage_Core_Helper_Abstract
125
  {
126
  $state = Mage::helper('full')->getDeclinedState();
127
 
128
- if (!in_array($state, array(Mage_Sales_Model_Order::STATE_CANCELED,Mage_Sales_Model_Order::STATE_HOLDED))) {
129
  $state = Mage_Sales_Model_Order::STATE_CANCELED;
130
  }
131
 
@@ -144,7 +144,7 @@ class Riskified_Full_Helper_Order_Status extends Mage_Core_Helper_Abstract
144
  $allowedStatuses = Mage::getSingleton('sales/order_config')->getStateStatuses($this->getSelectedDeclinedState());
145
  if (!in_array($status, array_keys($allowedStatuses))) {
146
  $status = $this->getRiskifiedDeclinedStatusCode();
147
- Mage::helper('full/log')->log("declined status: ".$status." not found in: ".var_export($allowedStatuses,1));
148
  }
149
 
150
  return $status;
2
 
3
  class Riskified_Full_Helper_Order_Status extends Mage_Core_Helper_Abstract
4
  {
5
+ /**
6
+ * Get Riskified's custom "on hold for review" status code
7
+ *
8
+ * @return string
9
+ */
10
+ public function getOnHoldStatusCode()
11
+ {
12
+ return 'riskified_holded';
13
+ }
14
+
15
+ /**
16
+ * Get Riskified's custom "on hold for review" status label
17
+ *
18
+ * @return string
19
+ */
20
+ public function getOnHoldStatusLabel()
21
+ {
22
+ return 'Under Review (Riskified)';
23
+ }
24
 
25
  /**
26
  * Get Riskified's custom "on hold due to transport error" status code
91
  {
92
  $state = Mage::helper('full')->getApprovedState();
93
 
94
+ if (!in_array($state, array(Mage_Sales_Model_Order::STATE_PROCESSING, Mage_Sales_Model_Order::STATE_HOLDED))) {
95
  $state = Mage_Sales_Model_Order::STATE_PROCESSING;
96
  }
97
 
110
  $allowedStatuses = Mage::getSingleton('sales/order_config')->getStateStatuses($this->getSelectedApprovedState());
111
  if (!in_array($status, array_keys($allowedStatuses))) {
112
  $status = $this->getRiskifiedApprovedStatusCode();
113
+ Mage::helper('full/log')->log("approved status: " . $status . " not found in: " . var_export($allowedStatuses, 1));
114
  }
115
 
116
  return $status;
125
  {
126
  $state = Mage::helper('full')->getDeclinedState();
127
 
128
+ if (!in_array($state, array(Mage_Sales_Model_Order::STATE_CANCELED, Mage_Sales_Model_Order::STATE_HOLDED))) {
129
  $state = Mage_Sales_Model_Order::STATE_CANCELED;
130
  }
131
 
144
  $allowedStatuses = Mage::getSingleton('sales/order_config')->getStateStatuses($this->getSelectedDeclinedState());
145
  if (!in_array($status, array_keys($allowedStatuses))) {
146
  $status = $this->getRiskifiedDeclinedStatusCode();
147
+ Mage::helper('full/log')->log("declined status: " . $status . " not found in: " . var_export($allowedStatuses, 1));
148
  }
149
 
150
  return $status;
app/code/community/Riskified/Full/Model/Authorizenet.php CHANGED
@@ -1,31 +1,6 @@
1
  <?php
2
- /**
3
- * Magento
4
- *
5
- * NOTICE OF LICENSE
6
- *
7
- * This source file is subject to the Open Software License (OSL 3.0)
8
- * that is bundled with this package in the file LICENSE.txt.
9
- * It is also available through the world-wide-web at this URL:
10
- * http://opensource.org/licenses/osl-3.0.php
11
- * If you did not receive a copy of the license and are unable to
12
- * obtain it through the world-wide-web, please send an email
13
- * to license@magentocommerce.com so we can send you a copy immediately.
14
- *
15
- * DISCLAIMER
16
- *
17
- * Do not edit or add to this file if you wish to upgrade Magento to newer
18
- * versions in the future. If you wish to customize Magento for your
19
- * needs please refer to http://www.magentocommerce.com for more information.
20
- *
21
- * @category Mage
22
- * @package Mage_Paygate
23
- * @copyright Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
24
- * @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
25
- */
26
 
27
-
28
- class Riskified_Full_Model_Authorizenet extends Mage_Paygate_Model_Authorizenet
29
  {
30
  /**
31
  * it sets card`s data into additional information of payment model
@@ -34,10 +9,10 @@ class Riskified_Full_Model_Authorizenet extends Mage_Paygate_Model_Authorizenet
34
  * @param mage_sales_model_order_payment $payment
35
  * @return varien_object
36
  */
37
- protected function _registercard(varien_object $response, mage_sales_model_order_payment $payment)
38
  {
39
- Mage::helper('full/log')->log( "in inherited _registercard." );
40
- $card=parent::_registercard($response,$payment);
41
  $card->setCcAvsResultCode($response->getAvsResultCode());
42
  $card->setCcResponseCode($response->getCardCodeResponseCode());
43
  $payment->setCcAvsStatus($response->getAvsResultCode());
1
  <?php
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2
 
3
+ class Riskified_Full_Model_Authorizenet extends Mage_Paygate_Model_Authorizenet
 
4
  {
5
  /**
6
  * it sets card`s data into additional information of payment model
9
  * @param mage_sales_model_order_payment $payment
10
  * @return varien_object
11
  */
12
+ protected function _registerCard(varien_object $response, mage_sales_model_order_payment $payment)
13
  {
14
+ Mage::helper('full/log')->log("in inherited _registercard.");
15
+ $card = parent::_registercard($response, $payment);
16
  $card->setCcAvsResultCode($response->getAvsResultCode());
17
  $card->setCcResponseCode($response->getCardCodeResponseCode());
18
  $payment->setCcAvsStatus($response->getAvsResultCode());
app/code/community/Riskified/Full/Model/Container/Beacon.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class Riskified_Full_Model_Container_Beacon extends Enterprise_PageCache_Model_Container_Abstract
4
+ {
5
+ protected function _getCacheId()
6
+ {
7
+ $cache = md5($this->_placeholder->getAttribute('cache_id'));
8
+ return 'RISKIFIED_FULL_BEACON_CACHE_' . $cache . '_' . $this->_getSessionId() . '_' . $this->_getRiskifiedCookie();
9
+ }
10
+
11
+ protected function _renderBlock()
12
+ {
13
+ $blockClass = $this->_placeholder->getAttribute('block');;
14
+ $template = $this->_placeholder->getAttribute('template');
15
+ $block = new $blockClass;
16
+ $block->setTemplate($template);
17
+ return $block->toHtml();
18
+ }
19
+
20
+ protected function _getSessionId()
21
+ {
22
+ return $this->_getCookieValue('frontend', '');
23
+ }
24
+
25
+ protected function _getRiskifiedCookie()
26
+ {
27
+ return $this->_getCookieValue('rCookie', '');
28
+ }
29
+ }
30
+
app/code/community/Riskified/Full/Model/Cron.php CHANGED
@@ -48,34 +48,33 @@ class Riskified_Full_Model_Cron
48
  , $adapter->quote(self::INTERVAL_BASE)
49
  ))
50
  ->order('updated_at ASC')
51
- ->limit(self::BATCH_SIZE)
52
- ;
53
 
54
- foreach($retries as $retry) {
55
- Mage::helper('full/log')->log("Retrying order " . $retry->getOrderId());
56
 
57
- $order = Mage::getModel('sales/order')->load($retry->getOrderId());
58
-
59
- if (!$order) {
60
- Mage::helper('full/log')->log("Order doesn't exist, skipping");
61
 
62
- $retry->delete();
63
- continue;
64
- }
 
65
 
66
  try {
67
- Mage::helper('full/order')->postOrder($order, $retry->getAction());
68
 
69
  // There is no need to delete the retry here. postOrder() dispatches a success event which
70
  // results in all retries for this order getting deleted.
71
- }
72
- // Log the exception, store the backtrace and increment the counter
73
  catch (Exception $e) {
74
  Mage::helper('full/log')->logException($e);
75
 
76
- $retry
77
  ->setLastError("Exception Message: " . $e->getMessage() . "\n\n" . Varien_Debug::backtrace(true, false))
78
- ->setAttempts($retry->getAttempts() + 1)
79
  ->setUpdatedAt(Mage::getSingleton('core/date')->gmtDate())
80
  ->save();
81
  }
48
  , $adapter->quote(self::INTERVAL_BASE)
49
  ))
50
  ->order('updated_at ASC')
51
+ ->limit(self::BATCH_SIZE);
 
52
 
53
+ $mapperOrder = array();
54
+ $orderIds = array();
55
 
56
+ foreach ($retries as $retry) {
57
+ $orderIds[] = $retry->getOrderId();
58
+ $mapperOrder[$retry->getOrderId()] = $retry;
59
+ }
60
 
61
+ $collection = Mage::getModel('sales/order')->getCollection();
62
+ $collection->addFieldToFilter('entity_id', array('in' => array($orderIds)));
63
+ foreach ($collection as $order) {
64
+ Mage::helper('full/log')->log("Retrying order " . $order->getId());
65
 
66
  try {
67
+ Mage::helper('full/order')->postOrder($order, $mapperOrder[$order->getId()]->getAction());
68
 
69
  // There is no need to delete the retry here. postOrder() dispatches a success event which
70
  // results in all retries for this order getting deleted.
71
+ } // Log the exception, store the backtrace and increment the counter
 
72
  catch (Exception $e) {
73
  Mage::helper('full/log')->logException($e);
74
 
75
+ $mapperOrder[$order->getId()]
76
  ->setLastError("Exception Message: " . $e->getMessage() . "\n\n" . Varien_Debug::backtrace(true, false))
77
+ ->setAttempts($mapperOrder[$order->getId()]->getAttempts() + 1)
78
  ->setUpdatedAt(Mage::getSingleton('core/date')->gmtDate())
79
  ->save();
80
  }
app/code/community/Riskified/Full/Model/Observer.php CHANGED
@@ -6,33 +6,36 @@ use Riskified\Common\Signature;
6
  use Riskified\OrderWebhook\Model;
7
  use Riskified\OrderWebhook\Transport;
8
 
9
- class Riskified_Full_Model_Observer {
 
10
 
11
- public function saveOrderBefore($evt) {
 
12
  Mage::helper('full/log')->log("saveOrderBefore");
13
 
14
  $payment = $evt->getPayment();
15
- $cc_bin = substr($payment->getCcNumber(),0,6);
16
 
17
  if ($cc_bin) {
18
  $payment->setAdditionalInformation('riskified_cc_bin', $cc_bin);
19
  }
20
  }
21
 
22
- public function saveRiskifiedConfig($evt) {
 
23
  Mage::helper('full/log')->log("saveRiskifiedConfig");
24
  $helper = Mage::helper('full');
25
  $settings = Mage::getStoreConfig('fullsection/full');
26
- $riskifiedShopDomain = $helper->getShopDomain();
27
  $authToken = $helper->getAuthToken();
28
  $all_active_methods = Mage::getModel('payment/config')->getActiveMethods();
29
- $gateWays ='';
30
  foreach ($all_active_methods as $key => $value)
31
  {
32
- $gateWays .= $key.",";
33
  }
34
  $extensionVersion = Mage::helper('full')->getExtensionVersion();
35
- $shopHostUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
36
  #Riskified::init($riskifiedShopDomain, $authToken, $env, Validations::IGNORE_MISSING);
37
  $settings['gws'] = $gateWays;
38
  $settings['host_url'] = $shopHostUrl;
@@ -42,69 +45,84 @@ class Riskified_Full_Model_Observer {
42
  $settingsModel = new Model\MerchantSettings(array(
43
  'settings' => $settings
44
  ));
45
- if($authToken && $riskifiedShopDomain) {
46
  Mage::helper('full/order')->updateMerchantSettings($settingsModel);
47
  }
48
  }
49
 
50
- public function salesOrderPaymentPlaceEnd($evt) {
51
- Mage::helper('full/log')->log("salesOrderPaymentPlaceEnd");
 
52
 
53
  //$order = $evt->getPayment()->getOrder();
54
 
55
  //try {
56
- // Mage::helper('full/order')->postOrder($order, Riskified_Full_Helper_Order::ACTION_CREATE);
57
  //} catch (Exception $e) {
58
- // There is no need to do anything here. The exception has already been handled and a retry scheduled.
59
- // We catch this exception so that the order is still saved in Magento.
60
  //}
61
  }
62
 
63
- public function salesOrderPaymentVoid($evt) {
 
64
  Mage::helper('full/log')->log("salesOrderPaymentVoid");
65
- //$order = $evt->getPayment()->getOrder();
66
- //Mage::helper('full/order')->postOrder($order,'cancel');
67
  }
68
 
69
- public function salesOrderPaymentRefund($evt) {
 
70
  Mage::helper('full/log')->log("salesOrderPaymentRefund");
71
  //$order = $evt->getPayment()->getOrder();
72
  //Mage::helper('full/order')->postOrder($order,'cancel');
73
  }
74
 
75
- public function salesOrderPaymentCancel($evt) {
 
76
  Mage::helper('full/log')->log("salesOrderPaymentCancel");
77
- //$order = $evt->getPayment()->getOrder();
78
- //Mage::helper('full/order')->postOrder($order,'cancel');
79
  }
80
 
81
- public function salesOrderPlaceBefore($evt) {
 
82
  Mage::helper('full/log')->log("salesOrderPlaceBefore");
83
  }
84
 
85
- public function salesOrderPlaceAfter($evt) {
 
86
  Mage::helper('full/log')->log("salesOrderPlaceAfter");
87
  }
88
 
89
- public function salesOrderSaveBefore($evt) {
 
90
  Mage::helper('full/log')->log("salesOrderSaveBefore");
91
  }
92
 
93
- public function salesOrderSaveAfter($evt) {
 
94
  Mage::helper('full/log')->log("salesOrderSaveAfter");
95
 
96
  $order = $evt->getOrder();
97
- if(!$order) {
98
  return;
99
  }
100
 
101
  $newState = $order->getState();
102
 
103
  if ($order->dataHasChangedFor('state')) {
104
- Mage::helper('full/log')->log("Order: " . $order->getId() . " state changed from: " . $order->getOrigData('state') . " to: " . $newState);
 
 
 
 
 
 
 
105
 
106
  // if we posted we should not re post
107
- if($order->riskifiedInSave) {
108
  Mage::helper('full/log')->log("Order : " . $order->getId() . " is already riskifiedInSave");
109
  return;
110
  }
@@ -122,7 +140,8 @@ class Riskified_Full_Model_Observer {
122
  }
123
  }
124
 
125
- public function salesOrderCancel($evt) {
 
126
  Mage::helper('full/log')->log("salesOrderCancel");
127
 
128
  $order = $evt->getOrder();
@@ -137,10 +156,12 @@ class Riskified_Full_Model_Observer {
137
  }
138
  }
139
 
140
- public function postOrderIds($order_ids) {
141
- foreach ($order_ids as $order_id) {
142
- $order = Mage::getModel('sales/order')->load($order_id);
 
143
 
 
144
  try {
145
  Mage::helper('full/order')->postOrder($order, Riskified_Full_Helper_Order::ACTION_SUBMIT);
146
  } catch (Exception $e) {
@@ -150,12 +171,13 @@ class Riskified_Full_Model_Observer {
150
  }
151
  }
152
 
153
- public function addMassAction($observer) {
 
154
  $block = $observer->getEvent()->getBlock();
155
- if((get_class($block) =='Mage_Adminhtml_Block_Widget_Grid_Massaction'
156
- || get_class($block)=='Enterprise_SalesArchive_Block_Adminhtml_Sales_Order_Grid_Massaction')
157
- && $block->getRequest()->getControllerName() == 'sales_order')
158
- {
159
  $block->addItem('full', array(
160
  'label' => 'Submit to Riskified',
161
  'url' => Mage::helper('adminhtml')->getUrl('adminhtml/riskifiedfull/massSend'),
@@ -163,55 +185,58 @@ class Riskified_Full_Model_Observer {
163
  }
164
  }
165
 
166
- public function blockHtmlBefore($observer) {
 
167
  $block = $observer->getEvent()->getBlock();
168
  if ($block->getType() == 'adminhtml/sales_order_view') {
169
  $message = Mage::helper('sales')->__('Are you sure you want to submit this order to Riskified?');
170
  $url = $block->getUrl('adminhtml/riskifiedfull/send');
171
  $block->addButton('riski_submit', array(
172
- 'label' => Mage::helper('sales')->__('Submit to Riskified'),
173
- 'onclick' => "deleteConfirm('$message', '$url')",
174
  ));
175
  }
176
  }
177
 
178
- /**
179
- * Update the order state and status when it's been updated
180
- *
181
- * @param Varien_Event_Observer $observer
182
- */
183
  public function updateOrderState(Varien_Event_Observer $observer)
184
- {
185
- $riskifiedOrderStatusHelper = Mage::helper('full/order_status');
186
  $riskifiedInvoiceHelper = Mage::helper('full/order_invoice');
187
- $order = $observer->getOrder();
188
- $riskifiedStatus = (string) $observer->getStatus();
189
- $riskifiedOldStatus = (string) $observer->getOldStatus();
190
- $description = (string) $observer->getDescription();
191
- $newState = $newStatus = null;
192
- $currentState = $order->getState();
193
- $currentStatus = $order->getStatus();
194
-
195
- Mage::helper('full/log')->log("Checking if should update order '" . $order->getId() . "' from state: '$currentState' and status: '$currentStatus'");
196
- Mage::helper('full/log')->log("Data received from riskified: status: " . $riskifiedStatus . ", old_status: " . $riskifiedOldStatus . ", description: " . $description);
197
-
198
- switch ($riskifiedStatus) {
199
- case 'approved':
200
- if ($currentState == Mage_Sales_Model_Order::STATE_HOLDED
201
- && ($currentStatus == $riskifiedOrderStatusHelper->getOnHoldStatusCode()
202
- || $currentStatus == $riskifiedOrderStatusHelper->getTransportErrorStatusCode())) {
 
203
  $newState = $riskifiedOrderStatusHelper->getSelectedApprovedState();
204
  $newStatus = $riskifiedOrderStatusHelper->getSelectedApprovedStatus();
205
- }
206
 
207
- break;
208
- case 'declined':
209
  if ($currentState == Mage_Sales_Model_Order::STATE_HOLDED
210
  && ($currentStatus == $riskifiedOrderStatusHelper->getOnHoldStatusCode()
211
- || $currentStatus == $riskifiedOrderStatusHelper->getTransportErrorStatusCode())) {
212
- $newState = $riskifiedOrderStatusHelper->getSelectedDeclinedState();
213
- $newStatus = $riskifiedOrderStatusHelper->getSelectedDeclinedStatus();
214
- }
 
215
 
216
  break;
217
  case 'submitted':
@@ -222,127 +247,139 @@ class Riskified_Full_Model_Observer {
222
  $newStatus = $riskifiedOrderStatusHelper->getOnHoldStatusCode();
223
  }
224
 
225
- break;
226
  case 'error':
227
  if ($currentState == Mage_Sales_Model_Order::STATE_PROCESSING
228
- && $riskifiedInvoiceHelper->isAutoInvoiceEnabled()) {
 
229
  $newState = Mage_Sales_Model_Order::STATE_HOLDED;
230
  $newStatus = $riskifiedOrderStatusHelper->getTransportErrorStatusCode();
231
  }
232
- }
 
 
233
 
234
  $changed = false;
235
 
236
  // if newState exists and new state/status are different from current and config is set to status-sync
237
- if ($newState
238
  && ($newState != $currentState || $newStatus != $currentStatus)
239
- && Mage::helper('full')->getConfigStatusControlActive()) {
 
 
 
 
 
 
240
  if ($newState == Mage_Sales_Model_Order::STATE_CANCELED) {
241
  Mage::helper('full/log')->log("Order '" . $order->getId() . "' should be canceled - calling cancel method");
242
  $order->cancel();
 
 
 
243
  }
244
- $order->setState($newState, $newStatus, $description);
245
  Mage::helper('full/log')->log("Updated order '" . $order->getId() . "' to: state: '$newState', status: '$newStatus', description: '$description'");
246
  $changed=true;
247
  } elseif ($description && $riskifiedStatus != $riskifiedOldStatus) {
248
  Mage::helper('full/log')->log("Updated order " . $order->getId() . " history comment to: " . $description);
249
  $order->addStatusHistoryComment($description);
250
- $changed=true;
251
  } else {
252
  Mage::helper('full/log')->log("No update to state,status,comments is required for " . $order->getId());
253
  }
254
 
255
 
256
  if ($changed) {
257
- try {
258
- $order->save();
259
- } catch (Exception $e) {
260
- Mage::helper('full/log')->log("Error saving order: " . $e->getMessage());
261
- return;
262
- }
263
- }
264
- }
265
-
266
- private function logInvoiceParameters($order) {
 
267
  try {
268
- Mage::helper('full/log')->log("Order ".$order->getId()." parameters relevant to invoicing failure:");
269
- Mage::helper('full/log')->log("Order state: ".$order->getState());
270
- Mage::helper('full/log')->log("Order status: ".$order->getStatus());
271
- Mage::helper('full/log')->log("UNHOLD action flag: ".$order->getActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_UNHOLD));
272
- Mage::helper('full/log')->log("INVOICE action flag: ".$order->getActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_INVOICE));
273
  foreach ($order->getAllItems() as $item) {
274
- Mage::helper('full/log')->log("item ".$item->getProductId()." - qty: ".$item->getQtyToInvoice()." locked: ".$item->getLockedDoInvoice());
275
  }
276
- } catch(Exception $e) {
277
  Mage::helper('full/log')->logException($e);
278
  }
279
  }
280
 
281
- /**
282
- * Create an invoice when the order is approved
283
- *
284
- * @param Varien_Event_Observer $observer
285
- */
286
- public function autoInvoice(Varien_Event_Observer $observer)
287
- {
288
- $riskifiedInvoiceHelper = Mage::helper('full/order_invoice');
289
 
290
- if (!$riskifiedInvoiceHelper->isAutoInvoiceEnabled()) {
291
- return;
292
- }
293
 
294
- $order = $observer->getOrder();
295
 
296
- // Sanity check
297
- if (!$order || !$order->getId()) {
298
- return;
299
- }
300
 
301
- Mage::helper('full/log')->log("Auto-invoicing order " . $order->getId());
302
 
303
- if (!$order->canInvoice() || $order->getState() != Mage_Sales_Model_Order::STATE_PROCESSING) {
304
- Mage::helper('full/log')->log("Order cannot be invoiced");
305
 
306
- if(Mage::helper('full')->isDebugLogsEnabled()) {
307
  $this->logInvoiceParameters($order);
308
  }
309
 
310
- return;
311
- }
312
-
313
- $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice();
314
-
315
- if (!$invoice->getTotalQty()) {
316
- Mage::helper('full/log')->log("Cannot create an invoice without products");
317
- return;
318
- }
319
-
320
- try {
321
- $invoice
322
- ->setRequestedCaptureCase($riskifiedInvoiceHelper->getCaptureCase())
323
- ->addComment(
324
- 'Invoice automatically created by Riskified when order was approved',
325
- false,
326
- false
327
- )
328
- ->register();
329
- } catch (Exception $e) {
330
- Mage::helper('full/log')->log("Error creating invoice: " . $e->getMessage());
331
- return;
332
- }
333
-
334
- try {
335
- Mage::getModel('core/resource_transaction')
336
- ->addObject($invoice)
337
- ->addObject($order)
338
- ->save();
339
- } catch (Exception $e) {
340
- Mage::helper('full/log')->log("Error creating transaction: " . $e->getMessage());
341
- return;
342
- }
343
-
344
- Mage::helper('full/log')->log("Transaction saved");
345
- }
346
 
347
  /**
348
  * Clear all submission retries for an order that have the same action.
@@ -363,7 +400,7 @@ class Riskified_Full_Model_Observer {
363
  ->addfieldtofilter('order_id', $order->getId())
364
  ->addFieldToFilter('action', $observer->getAction());
365
 
366
- foreach($retries as $retry) {
367
  $retry->delete();
368
  }
369
  }
6
  use Riskified\OrderWebhook\Model;
7
  use Riskified\OrderWebhook\Transport;
8
 
9
+ class Riskified_Full_Model_Observer
10
+ {
11
 
12
+ public function saveOrderBefore($evt)
13
+ {
14
  Mage::helper('full/log')->log("saveOrderBefore");
15
 
16
  $payment = $evt->getPayment();
17
+ $cc_bin = substr($payment->getCcNumber(), 0, 6);
18
 
19
  if ($cc_bin) {
20
  $payment->setAdditionalInformation('riskified_cc_bin', $cc_bin);
21
  }
22
  }
23
 
24
+ public function saveRiskifiedConfig($evt)
25
+ {
26
  Mage::helper('full/log')->log("saveRiskifiedConfig");
27
  $helper = Mage::helper('full');
28
  $settings = Mage::getStoreConfig('fullsection/full');
29
+ $riskifiedShopDomain = $helper->getShopDomain();
30
  $authToken = $helper->getAuthToken();
31
  $all_active_methods = Mage::getModel('payment/config')->getActiveMethods();
32
+ $gateWays = '';
33
  foreach ($all_active_methods as $key => $value)
34
  {
35
+ $gateWays .= $key . ",";
36
  }
37
  $extensionVersion = Mage::helper('full')->getExtensionVersion();
38
+ $shopHostUrl = Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
39
  #Riskified::init($riskifiedShopDomain, $authToken, $env, Validations::IGNORE_MISSING);
40
  $settings['gws'] = $gateWays;
41
  $settings['host_url'] = $shopHostUrl;
45
  $settingsModel = new Model\MerchantSettings(array(
46
  'settings' => $settings
47
  ));
48
+ if ($authToken && $riskifiedShopDomain) {
49
  Mage::helper('full/order')->updateMerchantSettings($settingsModel);
50
  }
51
  }
52
 
53
+ public function salesOrderPaymentPlaceEnd($evt)
54
+ {
55
+ Mage::helper('full/log')->log("salesOrderPaymentPlaceEnd");
56
 
57
  //$order = $evt->getPayment()->getOrder();
58
 
59
  //try {
60
+ // Mage::helper('full/order')->postOrder($order, Riskified_Full_Helper_Order::ACTION_CREATE);
61
  //} catch (Exception $e) {
62
+ // There is no need to do anything here. The exception has already been handled and a retry scheduled.
63
+ // We catch this exception so that the order is still saved in Magento.
64
  //}
65
  }
66
 
67
+ public function salesOrderPaymentVoid($evt)
68
+ {
69
  Mage::helper('full/log')->log("salesOrderPaymentVoid");
70
+ $order = $evt->getPayment()->getOrder();
71
+ Mage::helper('full/order')->postOrder($order, 'cancel');
72
  }
73
 
74
+ public function salesOrderPaymentRefund($evt)
75
+ {
76
  Mage::helper('full/log')->log("salesOrderPaymentRefund");
77
  //$order = $evt->getPayment()->getOrder();
78
  //Mage::helper('full/order')->postOrder($order,'cancel');
79
  }
80
 
81
+ public function salesOrderPaymentCancel($evt)
82
+ {
83
  Mage::helper('full/log')->log("salesOrderPaymentCancel");
84
+ $order = $evt->getPayment()->getOrder();
85
+ Mage::helper('full/order')->postOrder($order, 'cancel');
86
  }
87
 
88
+ public function salesOrderPlaceBefore($evt)
89
+ {
90
  Mage::helper('full/log')->log("salesOrderPlaceBefore");
91
  }
92
 
93
+ public function salesOrderPlaceAfter($evt)
94
+ {
95
  Mage::helper('full/log')->log("salesOrderPlaceAfter");
96
  }
97
 
98
+ public function salesOrderSaveBefore($evt)
99
+ {
100
  Mage::helper('full/log')->log("salesOrderSaveBefore");
101
  }
102
 
103
+ public function salesOrderSaveAfter($evt)
104
+ {
105
  Mage::helper('full/log')->log("salesOrderSaveAfter");
106
 
107
  $order = $evt->getOrder();
108
+ if (!$order) {
109
  return;
110
  }
111
 
112
  $newState = $order->getState();
113
 
114
  if ($order->dataHasChangedFor('state')) {
115
+ $oldState = $order->getOrigData('state');
116
+
117
+ if ($oldState == Mage_Sales_Model_Order::STATE_HOLDED and $newState == Mage_Sales_Model_Order::STATE_PROCESSING) {
118
+ Mage::helper('full/log')->log("Order : " . $order->getId() . " not notifying on unhold action");
119
+ return;
120
+ }
121
+
122
+ Mage::helper('full/log')->log("Order: " . $order->getId() . " state changed from: " . $oldState . " to: " . $newState);
123
 
124
  // if we posted we should not re post
125
+ if ($order->riskifiedInSave) {
126
  Mage::helper('full/log')->log("Order : " . $order->getId() . " is already riskifiedInSave");
127
  return;
128
  }
140
  }
141
  }
142
 
143
+ public function salesOrderCancel($evt)
144
+ {
145
  Mage::helper('full/log')->log("salesOrderCancel");
146
 
147
  $order = $evt->getOrder();
156
  }
157
  }
158
 
159
+ public function postOrderIds($order_ids)
160
+ {
161
+ $collection = Mage::getModel('sales/order')->getCollection();
162
+ $collection->addFieldToFilter('entity_id', array('in' => array($order_ids)));
163
 
164
+ foreach ($collection as $order) {
165
  try {
166
  Mage::helper('full/order')->postOrder($order, Riskified_Full_Helper_Order::ACTION_SUBMIT);
167
  } catch (Exception $e) {
171
  }
172
  }
173
 
174
+ public function addMassAction($observer)
175
+ {
176
  $block = $observer->getEvent()->getBlock();
177
+ if ((get_class($block) == 'Mage_Adminhtml_Block_Widget_Grid_Massaction'
178
+ || get_class($block) == 'Enterprise_SalesArchive_Block_Adminhtml_Sales_Order_Grid_Massaction')
179
+ && $block->getRequest()->getControllerName() == 'sales_order'
180
+ ) {
181
  $block->addItem('full', array(
182
  'label' => 'Submit to Riskified',
183
  'url' => Mage::helper('adminhtml')->getUrl('adminhtml/riskifiedfull/massSend'),
185
  }
186
  }
187
 
188
+ public function blockHtmlBefore($observer)
189
+ {
190
  $block = $observer->getEvent()->getBlock();
191
  if ($block->getType() == 'adminhtml/sales_order_view') {
192
  $message = Mage::helper('sales')->__('Are you sure you want to submit this order to Riskified?');
193
  $url = $block->getUrl('adminhtml/riskifiedfull/send');
194
  $block->addButton('riski_submit', array(
195
+ 'label' => Mage::helper('sales')->__('Submit to Riskified'),
196
+ 'onclick' => "deleteConfirm('$message', '$url')",
197
  ));
198
  }
199
  }
200
 
201
+ /**
202
+ * Update the order state and status when it's been updated
203
+ *
204
+ * @param Varien_Event_Observer $observer
205
+ */
206
  public function updateOrderState(Varien_Event_Observer $observer)
207
+ {
208
+ $riskifiedOrderStatusHelper = Mage::helper('full/order_status');
209
  $riskifiedInvoiceHelper = Mage::helper('full/order_invoice');
210
+ $order = $observer->getOrder();
211
+ $riskifiedStatus = (string)$observer->getStatus();
212
+ $riskifiedOldStatus = (string)$observer->getOldStatus();
213
+ $description = (string)$observer->getDescription();
214
+ $newState = $newStatus = null;
215
+ $currentState = $order->getState();
216
+ $currentStatus = $order->getStatus();
217
+
218
+ Mage::helper('full/log')->log("Checking if should update order '" . $order->getId() . "' from state: '$currentState' and status: '$currentStatus'");
219
+ Mage::helper('full/log')->log("Data received from riskified: status: " . $riskifiedStatus . ", old_status: " . $riskifiedOldStatus . ", description: " . $description);
220
+
221
+ switch ($riskifiedStatus) {
222
+ case 'approved':
223
+ if ($currentState == Mage_Sales_Model_Order::STATE_HOLDED
224
+ && ($currentStatus == $riskifiedOrderStatusHelper->getOnHoldStatusCode()
225
+ || $currentStatus == $riskifiedOrderStatusHelper->getTransportErrorStatusCode())
226
+ ) {
227
  $newState = $riskifiedOrderStatusHelper->getSelectedApprovedState();
228
  $newStatus = $riskifiedOrderStatusHelper->getSelectedApprovedStatus();
229
+ }
230
 
231
+ break;
232
+ case 'declined':
233
  if ($currentState == Mage_Sales_Model_Order::STATE_HOLDED
234
  && ($currentStatus == $riskifiedOrderStatusHelper->getOnHoldStatusCode()
235
+ || $currentStatus == $riskifiedOrderStatusHelper->getTransportErrorStatusCode())
236
+ ) {
237
+ $newState = $riskifiedOrderStatusHelper->getSelectedDeclinedState();
238
+ $newStatus = $riskifiedOrderStatusHelper->getSelectedDeclinedStatus();
239
+ }
240
 
241
  break;
242
  case 'submitted':
247
  $newStatus = $riskifiedOrderStatusHelper->getOnHoldStatusCode();
248
  }
249
 
250
+ break;
251
  case 'error':
252
  if ($currentState == Mage_Sales_Model_Order::STATE_PROCESSING
253
+ && $riskifiedInvoiceHelper->isAutoInvoiceEnabled()
254
+ ) {
255
  $newState = Mage_Sales_Model_Order::STATE_HOLDED;
256
  $newStatus = $riskifiedOrderStatusHelper->getTransportErrorStatusCode();
257
  }
258
+
259
+ break;
260
+ }
261
 
262
  $changed = false;
263
 
264
  // if newState exists and new state/status are different from current and config is set to status-sync
265
+ if ($newState
266
  && ($newState != $currentState || $newStatus != $currentStatus)
267
+ && Mage::helper('full')->getConfigStatusControlActive()
268
+ ) {
269
+ if ($currentState == Mage_Sales_Model_Order::STATE_HOLDED && $newState != Mage_Sales_Model_Order::STATE_HOLDED) {
270
+ $order->unhold();
271
+ } elseif ($currentState != Mage_Sales_Model_Order::STATE_HOLDED && $newState == Mage_Sales_Model_Order::STATE_HOLDED) {
272
+ $order->hold();
273
+ }
274
  if ($newState == Mage_Sales_Model_Order::STATE_CANCELED) {
275
  Mage::helper('full/log')->log("Order '" . $order->getId() . "' should be canceled - calling cancel method");
276
  $order->cancel();
277
+ $order->addStatusHistoryComment($description, $newStatus);
278
+ } else {
279
+ $order->setState($newState, $newStatus, $description);
280
  }
 
281
  Mage::helper('full/log')->log("Updated order '" . $order->getId() . "' to: state: '$newState', status: '$newStatus', description: '$description'");
282
  $changed=true;
283
  } elseif ($description && $riskifiedStatus != $riskifiedOldStatus) {
284
  Mage::helper('full/log')->log("Updated order " . $order->getId() . " history comment to: " . $description);
285
  $order->addStatusHistoryComment($description);
286
+ $changed = true;
287
  } else {
288
  Mage::helper('full/log')->log("No update to state,status,comments is required for " . $order->getId());
289
  }
290
 
291
 
292
  if ($changed) {
293
+ try {
294
+ $order->save();
295
+ } catch (Exception $e) {
296
+ Mage::helper('full/log')->log("Error saving order: " . $e->getMessage());
297
+ return;
298
+ }
299
+ }
300
+ }
301
+
302
+ private function logInvoiceParameters($order)
303
+ {
304
  try {
305
+ Mage::helper('full/log')->log("Order " . $order->getId() . " parameters relevant to invoicing failure:");
306
+ Mage::helper('full/log')->log("Order state: " . $order->getState());
307
+ Mage::helper('full/log')->log("Order status: " . $order->getStatus());
308
+ Mage::helper('full/log')->log("UNHOLD action flag: " . $order->getActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_UNHOLD));
309
+ Mage::helper('full/log')->log("INVOICE action flag: " . $order->getActionFlag(Mage_Sales_Model_Order::ACTION_FLAG_INVOICE));
310
  foreach ($order->getAllItems() as $item) {
311
+ Mage::helper('full/log')->log("item " . $item->getProductId() . " - qty: " . $item->getQtyToInvoice() . " locked: " . $item->getLockedDoInvoice());
312
  }
313
+ } catch (Exception $e) {
314
  Mage::helper('full/log')->logException($e);
315
  }
316
  }
317
 
318
+ /**
319
+ * Create an invoice when the order is approved
320
+ *
321
+ * @param Varien_Event_Observer $observer
322
+ */
323
+ public function autoInvoice(Varien_Event_Observer $observer)
324
+ {
325
+ $riskifiedInvoiceHelper = Mage::helper('full/order_invoice');
326
 
327
+ if (!$riskifiedInvoiceHelper->isAutoInvoiceEnabled()) {
328
+ return;
329
+ }
330
 
331
+ $order = $observer->getOrder();
332
 
333
+ // Sanity check
334
+ if (!$order || !$order->getId()) {
335
+ return;
336
+ }
337
 
338
+ Mage::helper('full/log')->log("Auto-invoicing order " . $order->getId());
339
 
340
+ if (!$order->canInvoice() || $order->getState() != Mage_Sales_Model_Order::STATE_PROCESSING) {
341
+ Mage::helper('full/log')->log("Order cannot be invoiced");
342
 
343
+ if (Mage::helper('full')->isDebugLogsEnabled()) {
344
  $this->logInvoiceParameters($order);
345
  }
346
 
347
+ return;
348
+ }
349
+
350
+ $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice();
351
+
352
+ if (!$invoice->getTotalQty()) {
353
+ Mage::helper('full/log')->log("Cannot create an invoice without products");
354
+ return;
355
+ }
356
+
357
+ try {
358
+ $invoice
359
+ ->setRequestedCaptureCase($riskifiedInvoiceHelper->getCaptureCase())
360
+ ->addComment(
361
+ 'Invoice automatically created by Riskified when order was approved',
362
+ false,
363
+ false
364
+ )
365
+ ->register();
366
+ } catch (Exception $e) {
367
+ Mage::helper('full/log')->log("Error creating invoice: " . $e->getMessage());
368
+ return;
369
+ }
370
+
371
+ try {
372
+ Mage::getModel('core/resource_transaction')
373
+ ->addObject($invoice)
374
+ ->addObject($order)
375
+ ->save();
376
+ } catch (Exception $e) {
377
+ Mage::helper('full/log')->log("Error creating transaction: " . $e->getMessage());
378
+ return;
379
+ }
380
+
381
+ Mage::helper('full/log')->log("Transaction saved");
382
+ }
383
 
384
  /**
385
  * Clear all submission retries for an order that have the same action.
400
  ->addfieldtofilter('order_id', $order->getId())
401
  ->addFieldToFilter('action', $observer->getAction());
402
 
403
+ foreach ($retries as $retry) {
404
  $retry->delete();
405
  }
406
  }
app/code/community/Riskified/Full/Model/System/Config/Source/ApprovedState.php CHANGED
@@ -2,14 +2,14 @@
2
 
3
  class Riskified_Full_Model_System_Config_Source_ApprovedState
4
  {
5
- /**
6
- * @return array
7
- */
8
- public function toOptionArray()
9
- {
10
- return array(
11
- array('value' => Mage_Sales_Model_Order::STATE_PROCESSING, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_PROCESSING)),
12
- array('value' => Mage_Sales_Model_Order::STATE_HOLDED, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_HOLDED))
13
- );
14
- }
15
  }
2
 
3
  class Riskified_Full_Model_System_Config_Source_ApprovedState
4
  {
5
+ /**
6
+ * @return array
7
+ */
8
+ public function toOptionArray()
9
+ {
10
+ return array(
11
+ array('value' => Mage_Sales_Model_Order::STATE_PROCESSING, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_PROCESSING)),
12
+ array('value' => Mage_Sales_Model_Order::STATE_HOLDED, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_HOLDED))
13
+ );
14
+ }
15
  }
app/code/community/Riskified/Full/Model/System/Config/Source/CanceledStateStatuses.php CHANGED
@@ -8,8 +8,8 @@ class Riskified_Full_Model_System_Config_Source_CanceledStateStatuses
8
  public function toOptionArray()
9
  {
10
  $arr = Mage::getSingleton('sales/order_config')->getStateStatuses(Mage_Sales_Model_Order::STATE_CANCELED);
11
- return array_map(function($status_code,$status_label) {
12
  return array('value' => $status_code, 'label' => Mage::helper('full')->__($status_label));
13
- }, array_keys($arr),$arr);
14
  }
15
  }
8
  public function toOptionArray()
9
  {
10
  $arr = Mage::getSingleton('sales/order_config')->getStateStatuses(Mage_Sales_Model_Order::STATE_CANCELED);
11
+ return array_map(function ($status_code, $status_label) {
12
  return array('value' => $status_code, 'label' => Mage::helper('full')->__($status_label));
13
+ }, array_keys($arr), $arr);
14
  }
15
  }
app/code/community/Riskified/Full/Model/System/Config/Source/CaptureCase.php CHANGED
@@ -2,14 +2,14 @@
2
 
3
  class Riskified_Full_Model_System_Config_Source_CaptureCase
4
  {
5
- /**
6
- * @return array
7
- */
8
- public function toOptionArray()
9
- {
10
- return array(
11
- array('value' => Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE, 'label' => Mage::helper('full')->__('Capture Online')),
12
- array('value' => Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE, 'label' => Mage::helper('full')->__('Capture Offline'))
13
- );
14
- }
15
  }
2
 
3
  class Riskified_Full_Model_System_Config_Source_CaptureCase
4
  {
5
+ /**
6
+ * @return array
7
+ */
8
+ public function toOptionArray()
9
+ {
10
+ return array(
11
+ array('value' => Mage_Sales_Model_Order_Invoice::CAPTURE_ONLINE, 'label' => Mage::helper('full')->__('Capture Online')),
12
+ array('value' => Mage_Sales_Model_Order_Invoice::CAPTURE_OFFLINE, 'label' => Mage::helper('full')->__('Capture Offline'))
13
+ );
14
+ }
15
  }
app/code/community/Riskified/Full/Model/System/Config/Source/DeclinedState.php CHANGED
@@ -2,14 +2,14 @@
2
 
3
  class Riskified_Full_Model_System_Config_Source_DeclinedState
4
  {
5
- /**
6
- * @return array
7
- */
8
- public function toOptionArray()
9
- {
10
- return array(
11
- array('value' => Mage_Sales_Model_Order::STATE_CANCELED, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_CANCELED)),
12
- array('value' => Mage_Sales_Model_Order::STATE_HOLDED, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_HOLDED))
13
- );
14
- }
15
  }
2
 
3
  class Riskified_Full_Model_System_Config_Source_DeclinedState
4
  {
5
+ /**
6
+ * @return array
7
+ */
8
+ public function toOptionArray()
9
+ {
10
+ return array(
11
+ array('value' => Mage_Sales_Model_Order::STATE_CANCELED, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_CANCELED)),
12
+ array('value' => Mage_Sales_Model_Order::STATE_HOLDED, 'label' => Mage::helper('full')->__(Mage_Sales_Model_Order::STATE_HOLDED))
13
+ );
14
+ }
15
  }
app/code/community/Riskified/Full/Model/System/Config/Source/Env.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
 
3
  class Riskified_Full_Model_System_Config_Source_Env
4
- {
5
  public function toOptionArray()
6
  {
7
  return array(
1
  <?php
2
 
3
  class Riskified_Full_Model_System_Config_Source_Env
4
+ {
5
  public function toOptionArray()
6
  {
7
  return array(
app/code/community/Riskified/Full/Model/System/Config/Source/HoldedStateStatuses.php CHANGED
@@ -8,8 +8,8 @@ class Riskified_Full_Model_System_Config_Source_HoldedStateStatuses
8
  public function toOptionArray()
9
  {
10
  $arr = Mage::getSingleton('sales/order_config')->getStateStatuses(Mage_Sales_Model_Order::STATE_HOLDED);
11
- return array_map(function($status_code,$status_label) {
12
  return array('value' => $status_code, 'label' => Mage::helper('full')->__($status_label));
13
- }, array_keys($arr),$arr);
14
  }
15
  }
8
  public function toOptionArray()
9
  {
10
  $arr = Mage::getSingleton('sales/order_config')->getStateStatuses(Mage_Sales_Model_Order::STATE_HOLDED);
11
+ return array_map(function ($status_code, $status_label) {
12
  return array('value' => $status_code, 'label' => Mage::helper('full')->__($status_label));
13
+ }, array_keys($arr), $arr);
14
  }
15
  }
app/code/community/Riskified/Full/Model/System/Config/Source/ProcessingStateStatuses.php CHANGED
@@ -8,8 +8,8 @@ class Riskified_Full_Model_System_Config_Source_ProcessingStateStatuses
8
  public function toOptionArray()
9
  {
10
  $arr = Mage::getSingleton('sales/order_config')->getStateStatuses(Mage_Sales_Model_Order::STATE_PROCESSING);
11
- return array_map(function($status_code,$status_label) {
12
  return array('value' => $status_code, 'label' => Mage::helper('full')->__($status_label));
13
- }, array_keys($arr),$arr);
14
  }
15
  }
8
  public function toOptionArray()
9
  {
10
  $arr = Mage::getSingleton('sales/order_config')->getStateStatuses(Mage_Sales_Model_Order::STATE_PROCESSING);
11
+ return array_map(function ($status_code, $status_label) {
12
  return array('value' => $status_code, 'label' => Mage::helper('full')->__($status_label));
13
+ }, array_keys($arr), $arr);
14
  }
15
  }
app/code/community/Riskified/Full/controllers/Adminhtml/RiskifiedfullController.php CHANGED
@@ -10,7 +10,7 @@ class Riskified_Full_Adminhtml_RiskifiedfullController extends Mage_Adminhtml_Co
10
  */
11
  protected function _isAllowed()
12
  {
13
- return Mage::getSingleton('admin/session')->isAllowed('sales/order');
14
  }
15
 
16
  public function sendAction()
@@ -19,7 +19,7 @@ class Riskified_Full_Adminhtml_RiskifiedfullController extends Mage_Adminhtml_Co
19
  $call = Mage::getModel('full/observer');
20
  $call->postOrderIds(array($id));
21
 
22
- Mage::app()->getResponse()->setRedirect(Mage::helper('adminhtml')->getUrl("adminhtml/sales_order/view", array('order_id'=>$id)));
23
  }
24
 
25
  public function massSendAction()
10
  */
11
  protected function _isAllowed()
12
  {
13
+ return Mage::getSingleton('admin/session')->isAllowed('sales/order/actions/send_to_riskified');
14
  }
15
 
16
  public function sendAction()
19
  $call = Mage::getModel('full/observer');
20
  $call->postOrderIds(array($id));
21
 
22
+ Mage::app()->getResponse()->setRedirect(Mage::helper('adminhtml')->getUrl("adminhtml/sales_order/view", array('order_id' => $id)));
23
  }
24
 
25
  public function massSendAction()
app/code/community/Riskified/Full/controllers/ResponseController.php CHANGED
@@ -19,8 +19,7 @@ class Riskified_Full_ResponseController extends Mage_Core_Controller_Front_Actio
19
  $statusCode = 200;
20
  $msg = 'Test notification received successfully';
21
  Mage::helper('full/log')->log("Test Notification received: ", serialize($notification));
22
- }
23
- else {
24
 
25
  // Changing scope to ADMIN store so that all orders will be visible and all admin functionalities will work
26
  Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
@@ -55,22 +54,23 @@ class Riskified_Full_ResponseController extends Mage_Core_Controller_Front_Actio
55
 
56
  $response->setHttpResponseCode($statusCode);
57
  $response->setHeader('Content-Type', 'application/json');
58
- $response->setBody('{ "order" : { "id" : "' . $id . '", "description" : "' . $msg .'" } }');
59
  }
60
 
61
- private function loadOrderByOrigId($full_orig_id) {
62
- if(!$full_orig_id) {
 
63
  return null;
64
  }
65
 
66
- $magento_ids = explode("_",$full_orig_id);
67
  $order_id = $magento_ids[0];
68
  $increment_id = $magento_ids[1];
69
 
70
  if ($order_id && $increment_id) {
71
  return Mage::getModel('sales/order')->getCollection()
72
  ->addFieldToFilter('entity_id', $order_id)
73
- ->addFieldToFilter('increment_id',$increment_id)
74
  ->getFirstItem();
75
  }
76
  return Mage::getModel('sales/order')->load($order_id);
19
  $statusCode = 200;
20
  $msg = 'Test notification received successfully';
21
  Mage::helper('full/log')->log("Test Notification received: ", serialize($notification));
22
+ } else {
 
23
 
24
  // Changing scope to ADMIN store so that all orders will be visible and all admin functionalities will work
25
  Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
54
 
55
  $response->setHttpResponseCode($statusCode);
56
  $response->setHeader('Content-Type', 'application/json');
57
+ $response->setBody('{ "order" : { "id" : "' . $id . '", "description" : "' . $msg . '" } }');
58
  }
59
 
60
+ private function loadOrderByOrigId($full_orig_id)
61
+ {
62
+ if (!$full_orig_id) {
63
  return null;
64
  }
65
 
66
+ $magento_ids = explode("_", $full_orig_id);
67
  $order_id = $magento_ids[0];
68
  $increment_id = $magento_ids[1];
69
 
70
  if ($order_id && $increment_id) {
71
  return Mage::getModel('sales/order')->getCollection()
72
  ->addFieldToFilter('entity_id', $order_id)
73
+ ->addFieldToFilter('increment_id', $increment_id)
74
  ->getFirstItem();
75
  }
76
  return Mage::getModel('sales/order')->load($order_id);
app/code/community/Riskified/Full/etc/adminhtml.xml ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+
3
+ <config>
4
+ <acl>
5
+ <resources>
6
+ <all>
7
+ <title>Allow Everything</title>
8
+ </all>
9
+ <admin>
10
+ <children>
11
+ <Riskified_Full translate="title" module="full">
12
+ <title>Full Module</title>
13
+ <sort_order>10</sort_order>
14
+ </Riskified_Full>
15
+ <system>
16
+ <children>
17
+ <config>
18
+ <children>
19
+ <fullsection translate="title" module="full">
20
+ <title>Riskified</title>
21
+ <sort_order>99</sort_order>
22
+ </fullsection>
23
+ </children>
24
+ </config>
25
+ </children>
26
+ </system>
27
+ <sales>
28
+ <children>
29
+ <order>
30
+ <children>
31
+ <actions>
32
+ <children>
33
+ <send_to_riskified translate="title" module="full">
34
+ <title>Send Manually to Riskfied</title>
35
+ <sort_order>99</sort_order>
36
+ </send_to_riskified>
37
+ </children>
38
+ </actions>
39
+ </children>
40
+ </order>
41
+ </children>
42
+ </sales>
43
+ </children>
44
+ </admin>
45
+ </resources>
46
+ </acl>
47
+ </config>
app/code/community/Riskified/Full/etc/cache.xml ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <config>
2
+ <placeholders>
3
+ <riskified_full>
4
+ <block>full/beacon</block>
5
+ <name>riskified.full.beacon</name>
6
+ <placeholder>RISKIFIED_FULL_BEACON_CACHE</placeholder>
7
+ <container>Riskified_Full_Model_Container_Beacon</container>
8
+ </riskified_full>
9
+ </placeholders>
10
+ </config>
app/code/community/Riskified/Full/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Riskified_Full>
5
- <version>1.0.8.0</version>
6
  </Riskified_Full>
7
  </modules>
8
 
@@ -26,6 +26,11 @@
26
  </entities>
27
  </riskified_full_resource>
28
  </models>
 
 
 
 
 
29
  <resources>
30
  <riskified_full_setup>
31
  <setup>
@@ -138,15 +143,6 @@
138
  </riskified_full>
139
  </observers>
140
  </order_cancel_after>
141
- <adminhtml_widget_container_html_before>
142
- <observers>
143
- <module>
144
- <type>singleton</type>
145
- <class>full/observer</class>
146
- <method>blockHtmlBefore</method>
147
- </module>
148
- </observers>
149
- </adminhtml_widget_container_html_before>
150
  <riskified_full_order_update>
151
  <observers>
152
  <riskified_full_handle_order_update>
@@ -219,35 +215,17 @@
219
  </admin>
220
 
221
  <adminhtml>
222
- <acl>
223
- <resources>
224
- <all>
225
- <title>Allow Everything</title>
226
- </all>
227
- <admin>
228
- <children>
229
- <Riskified_Full>
230
- <title>Full Module</title>
231
- <sort_order>10</sort_order>
232
- </Riskified_Full>
233
- <system>
234
- <children>
235
- <config>
236
- <children>
237
- <fullsection translate="title"
238
- module="full"> <!-- This is name of the section created by us -->
239
- <title>Riskified</title>
240
- <!-- Title as shown in User->Roles->Permissions Window -->
241
- <sort_order>99</sort_order>
242
- </fullsection>
243
- </children>
244
- </config>
245
- </children>
246
- </system>
247
- </children>
248
- </admin>
249
- </resources>
250
- </acl>
251
  <layout>
252
  <updates>
253
  <full>
@@ -267,7 +245,6 @@
267
  </core_block_abstract_prepare_layout_before>
268
  </events>
269
  </adminhtml>
270
-
271
  <crontab>
272
  <jobs>
273
  <riskified_full_retry_submission>
@@ -284,7 +261,7 @@
284
  <phpunit>
285
  <suite>
286
  <modules>
287
- <Riskified_Full />
288
  </modules>
289
  </suite>
290
  </phpunit>
2
  <config>
3
  <modules>
4
  <Riskified_Full>
5
+ <version>1.0.8.3</version>
6
  </Riskified_Full>
7
  </modules>
8
 
26
  </entities>
27
  </riskified_full_resource>
28
  </models>
29
+ <blocks>
30
+ <full>
31
+ <class>Riskified_Full_Block</class>
32
+ </full>
33
+ </blocks>
34
  <resources>
35
  <riskified_full_setup>
36
  <setup>
143
  </riskified_full>
144
  </observers>
145
  </order_cancel_after>
 
 
 
 
 
 
 
 
 
146
  <riskified_full_order_update>
147
  <observers>
148
  <riskified_full_handle_order_update>
215
  </admin>
216
 
217
  <adminhtml>
218
+ <events>
219
+ <adminhtml_widget_container_html_before>
220
+ <observers>
221
+ <module>
222
+ <type>singleton</type>
223
+ <class>full/observer</class>
224
+ <method>blockHtmlBefore</method>
225
+ </module>
226
+ </observers>
227
+ </adminhtml_widget_container_html_before>
228
+ </events>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
  <layout>
230
  <updates>
231
  <full>
245
  </core_block_abstract_prepare_layout_before>
246
  </events>
247
  </adminhtml>
 
248
  <crontab>
249
  <jobs>
250
  <riskified_full_retry_submission>
261
  <phpunit>
262
  <suite>
263
  <modules>
264
+ <Riskified_Full/>
265
  </modules>
266
  </suite>
267
  </phpunit>
app/code/community/Riskified/Full/etc/system.xml CHANGED
@@ -42,7 +42,8 @@
42
  <show_in_default>1</show_in_default>
43
  <show_in_website>0</show_in_website>
44
  <show_in_store>0</show_in_store>
45
- <comment><![CDATA[This is the shop domain used during signup. See <a href="http://www.riskified.com/documentation/magento.html" target="_blank">documentation</a> for more details.]]></comment>
 
46
  </domain>
47
  <key translate="label comment">
48
  <label>Auth token</label>
@@ -51,7 +52,8 @@
51
  <show_in_default>1</show_in_default>
52
  <show_in_website>0</show_in_website>
53
  <show_in_store>0</show_in_store>
54
- <comment><![CDATA[ Your <i>secret</i> auth token can be found in your <a href="https://app.riskified.com/main/settings/advanced" target="_blank">Riskified Settings page</a>. ]]></comment>
 
55
  </key>
56
  <order_status_sync translate="label comment">
57
  <label>Order Status Sync</label>
@@ -161,7 +163,8 @@
161
  <show_in_default>1</show_in_default>
162
  <show_in_website>0</show_in_website>
163
  <show_in_store>0</show_in_store>
164
- <comment><![CDATA[Should an invoice automatically be created when Riskified approves this order?]]></comment>
 
165
  <depends>
166
  <order_status_sync>1</order_status_sync>
167
  </depends>
42
  <show_in_default>1</show_in_default>
43
  <show_in_website>0</show_in_website>
44
  <show_in_store>0</show_in_store>
45
+ <comment>
46
+ <![CDATA[This is the shop domain used during signup. See <a href="http://www.riskified.com/documentation/magento.html" target="_blank">documentation</a> for more details.]]></comment>
47
  </domain>
48
  <key translate="label comment">
49
  <label>Auth token</label>
52
  <show_in_default>1</show_in_default>
53
  <show_in_website>0</show_in_website>
54
  <show_in_store>0</show_in_store>
55
+ <comment>
56
+ <![CDATA[ Your <i>secret</i> auth token can be found in your <a href="https://app.riskified.com/main/settings/advanced" target="_blank">Riskified Settings page</a>. ]]></comment>
57
  </key>
58
  <order_status_sync translate="label comment">
59
  <label>Order Status Sync</label>
163
  <show_in_default>1</show_in_default>
164
  <show_in_website>0</show_in_website>
165
  <show_in_store>0</show_in_store>
166
+ <comment>
167
+ <![CDATA[Should an invoice automatically be created when Riskified approves this order?]]></comment>
168
  <depends>
169
  <order_status_sync>1</order_status_sync>
170
  </depends>
app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-install-1.0.1.php CHANGED
@@ -7,8 +7,8 @@ $installer->startSetup();
7
  $helper = Mage::helper('full/order_status');
8
 
9
  Mage::getModel('sales/order_status')
10
- ->setStatus($helper->getOnHoldStatusCode())->setLabel($helper->getOnHoldStatusLabel())
11
- ->assignState(Mage_Sales_Model_Order::STATE_HOLDED)
12
- ->save();
13
 
14
  $installer->endSetup();
7
  $helper = Mage::helper('full/order_status');
8
 
9
  Mage::getModel('sales/order_status')
10
+ ->setStatus($helper->getOnHoldStatusCode())->setLabel($helper->getOnHoldStatusLabel())
11
+ ->assignState(Mage_Sales_Model_Order::STATE_HOLDED)
12
+ ->save();
13
 
14
  $installer->endSetup();
app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.2.0-1.0.2.1.php CHANGED
@@ -7,8 +7,8 @@ $installer->startSetup();
7
  $helper = Mage::helper('full/order_status');
8
 
9
  Mage::getModel('sales/order_status')
10
- ->setStatus($helper->getTransportErrorStatusCode())->setLabel($helper->getTransportErrorStatusLabel())
11
- ->assignState(Mage_Sales_Model_Order::STATE_HOLDED)
12
- ->save();
13
 
14
  $installer->endSetup();
7
  $helper = Mage::helper('full/order_status');
8
 
9
  Mage::getModel('sales/order_status')
10
+ ->setStatus($helper->getTransportErrorStatusCode())->setLabel($helper->getTransportErrorStatusLabel())
11
+ ->assignState(Mage_Sales_Model_Order::STATE_HOLDED)
12
+ ->save();
13
 
14
  $installer->endSetup();
app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.4-1.0.5.0.php CHANGED
@@ -8,31 +8,30 @@ $installer->startSetup();
8
  $table = $installer->getConnection()
9
  ->newTable($installer->getTable('full/retry'))
10
  ->addColumn('retry_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
11
- 'identity' => true,
12
- 'unsigned' => true,
13
- 'nullable' => false,
14
- 'primary' => true,
15
  ), 'Id')
16
  ->addColumn('order_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
17
- 'unsigned' => true,
18
- 'nullable' => false,
19
  'default' => 0
20
  ), 'Order Id')
21
  ->addColumn('action', Varien_Db_Ddl_Table::TYPE_VARCHAR, null, array(
22
- 'nullable' => false,
23
  ), 'Action')
24
  ->addColumn('last_error', Varien_Db_Ddl_Table::TYPE_TEXT, null, array(
25
- 'nullable' => true,
26
  ), 'Last Error')
27
  ->addColumn('attempts', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
28
- 'unsigned' => true,
29
- 'nullable' => false,
30
  'default' => 0
31
  ), 'Number of retry attempts')
32
  ->addColumn('updated_at', Varien_Db_Ddl_Table::TYPE_DATETIME, null, array(
33
- 'nullable' => false
34
- ), 'Date last updated')
35
- ;
36
 
37
  $installer->getConnection()->createTable($table);
38
 
8
  $table = $installer->getConnection()
9
  ->newTable($installer->getTable('full/retry'))
10
  ->addColumn('retry_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
11
+ 'identity' => true,
12
+ 'unsigned' => true,
13
+ 'nullable' => false,
14
+ 'primary' => true,
15
  ), 'Id')
16
  ->addColumn('order_id', Varien_Db_Ddl_Table::TYPE_INTEGER, null, array(
17
+ 'unsigned' => true,
18
+ 'nullable' => false,
19
  'default' => 0
20
  ), 'Order Id')
21
  ->addColumn('action', Varien_Db_Ddl_Table::TYPE_VARCHAR, null, array(
22
+ 'nullable' => false,
23
  ), 'Action')
24
  ->addColumn('last_error', Varien_Db_Ddl_Table::TYPE_TEXT, null, array(
25
+ 'nullable' => true,
26
  ), 'Last Error')
27
  ->addColumn('attempts', Varien_Db_Ddl_Table::TYPE_SMALLINT, null, array(
28
+ 'unsigned' => true,
29
+ 'nullable' => false,
30
  'default' => 0
31
  ), 'Number of retry attempts')
32
  ->addColumn('updated_at', Varien_Db_Ddl_Table::TYPE_DATETIME, null, array(
33
+ 'nullable' => false
34
+ ), 'Date last updated');
 
35
 
36
  $installer->getConnection()->createTable($table);
37
 
app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.5.5-1.0.6.0.php CHANGED
@@ -9,10 +9,10 @@ $helper = Mage::helper('full/order_status');
9
  // create new approved and declined statuses
10
 
11
  Mage::getModel('sales/order_status')
12
- ->setStatus($helper->getRiskifiedDeclinedStatusCode())
13
  ->setLabel($helper->getRiskifiedDeclinedStatusLabel())
14
- ->assignState(Mage_Sales_Model_Order::STATE_HOLDED)
15
- ->save();
16
 
17
  Mage::getModel('sales/order_status')
18
  ->setStatus($helper->getRiskifiedDeclinedStatusCode())
9
  // create new approved and declined statuses
10
 
11
  Mage::getModel('sales/order_status')
12
+ ->setStatus($helper->getRiskifiedDeclinedStatusCode())
13
  ->setLabel($helper->getRiskifiedDeclinedStatusLabel())
14
+ ->assignState(Mage_Sales_Model_Order::STATE_HOLDED)
15
+ ->save();
16
 
17
  Mage::getModel('sales/order_status')
18
  ->setStatus($helper->getRiskifiedDeclinedStatusCode())
app/code/community/Riskified/Full/sql/riskified_full_setup/mysql4-upgrade-1.0.8.0-1.0.8.1.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /* @var $installer Mage_Core_Model_Resource_Setup */
4
+ $installer = $this;
5
+
6
+ $installer->startSetup();
7
+
8
+ $table = $installer->getConnection()
9
+ ->addForeignKey(
10
+ $installer->getFkName($installer->getTable('full/retry'), 'order_id', $installer->getTable('sales/order'), 'entity_id'),
11
+ $installer->getTable('full/retry'),
12
+ 'order_id',
13
+ $installer->getTable('sales/order'),
14
+ 'entity_id'
15
+ );
16
+
17
+
18
+ $installer->endSetup();
app/design/frontend/base/default/layout/full.xml CHANGED
@@ -2,7 +2,7 @@
2
  <layout version="0.1.0">
3
  <default>
4
  <reference name="before_body_end">
5
- <block type="core/template" name="riskified_analytics" as="riskified_analytics" template="full/riskified.phtml" />
6
  </reference>
7
  </default>
8
  </layout>
2
  <layout version="0.1.0">
3
  <default>
4
  <reference name="before_body_end">
5
+ <block type="full/beacon" name="riskified.full.beacon" />
6
  </reference>
7
  </default>
8
  </layout>
app/design/frontend/base/default/template/full/{riskified.phtml → beacon.phtml} RENAMED
@@ -1,12 +1,10 @@
1
-
2
  <script type="text/javascript">
3
  (function() {
4
  function riskifiedBeaconLoad() {
5
- var session_id = "<?php echo Mage::helper('full')->getSessionId(); ?>";
6
- var store_domain="<?php echo Mage::helper('full')->getShopDomain() ?>";
7
- var statusControlActive = "<?php echo Mage::helper('full')->getConfigStatusControlActive() ?>";
8
- var version = "<?php echo Mage::helper('full')->getExtensionVersion() ?>";
9
- var url = ('https:' == document.location.protocol ? 'https://' : 'http://') + "<?php echo Mage::helper('full')->getConfigBeaconUrl()?>?shop="+store_domain+"&sid="+session_id+"&v="+version;
10
  var s = document.createElement('script');
11
  s.type = 'text/javascript';
12
  s.async = true;
 
1
  <script type="text/javascript">
2
  (function() {
3
  function riskifiedBeaconLoad() {
4
+ var session_id = "<?php echo $this->sessionId; ?>";
5
+ var store_domain = "<?php echo $this->shopDomain; ?>";
6
+ var version = "<?php echo $this->extensionVersion; ?>";
7
+ var url = ('https:' == document.location.protocol ? 'https://' : 'http://') + "<?php echo $this->beaconUrl?>?shop="+store_domain+"&sid="+session_id+"&v="+version;
 
8
  var s = document.createElement('script');
9
  s.type = 'text/javascript';
10
  s.async = true;
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>riskified_magento</name>
4
- <version>1.0.8.0</version>
5
  <stability>stable</stability>
6
  <license>OSL v3.0</license>
7
  <channel>community</channel>
@@ -9,11 +9,13 @@
9
  <summary>Riskified Magento extension</summary>
10
  <description>Riskified reviews, approves &amp; guarantees&#xD;
11
  transactions you would otherwise decline.</description>
12
- <notes>* Braintree vZero gateway data extraction support</notes>
 
 
13
  <authors><author><name>Riskified_Mage</name><user>Riskified_Mage</user><email>support@riskified.com</email></author></authors>
14
- <date>2015-12-31</date>
15
- <time>13:50:34</time>
16
- <contents><target name="magecommunity"><dir name="Riskified"><dir name="Full"><dir><dir name="Helper"><file name="Data.php" hash="6b312d0bb7f613b22d41dda5f361e709"/><file name="Debug.php" hash="18335d988a142ee639ea59dbecafa15c"/><file name="Log.php" hash="14125243576ab5b08f40066d24b7241d"/><dir name="Order"><file name="Invoice.php" hash="fd6fcbdedd44551785eddd0e1a482e80"/><file name="Status.php" hash="67d0f4989d771824108a8ff4fc870301"/></dir><file name="Order.php" hash="41e6e7f53b9d7dbb70062b472453ea60"/></dir><dir name="Model"><file name="Authorizenet.php" hash="bd42f62d06a036b9da7709d2e40fc8f1"/><file name="Cron.php" hash="187b86ebe9238ff132ed0337f05a8ae9"/><file name="Observer.php" hash="e6e9414a92fbf714b95bd142dfdb3945"/><dir name="Resource"><dir name="Retry"><file name="Collection.php" hash="fd62ad4e4cdd8d372751bfa9988cc3a9"/></dir><file name="Retry.php" hash="3be3db7e54bd8bb45e0faffa1941f515"/></dir><file name="Retry.php" hash="89e7344139affa4fe0b9a252a5d1c592"/><dir name="System"><dir name="Config"><dir name="Source"><file name="ApprovedState.php" hash="5c620d1039347218354bd58c2238ecb4"/><file name="CanceledStateStatuses.php" hash="fc45423c3889466d22ad0019a1c0049a"/><file name="CaptureCase.php" hash="daafa6f53c65fa6e6e7ffbb067dbbbba"/><file name="DeclinedState.php" hash="a00907072c06ade079483e3db03bb94f"/><file name="Env.php" hash="4d923355b3e56fac95c2a9b3c353ab76"/><file name="HoldedStateStatuses.php" hash="f120fbe5472906fb4d2757edfbcd6c60"/><file name="ProcessingStateStatuses.php" hash="e4db8c3ee18de3384d9a67c11ad91081"/></dir></dir></dir></dir><dir name="Test"><dir name="Config"><file name="General.php" hash="a5d4950c5655960879e7d75c06977941"/></dir><dir name="Helper"><dir name="General"><dir name="fixtures"><file name="extensionConfigEnabled.yaml" hash="eec8c8d8a1d5de49897b19740cf8e074"/></dir></dir><file name="General.php" hash="607c9711656be48084f6688e114b6bf6"/></dir><dir name="Model"><file name="Environments.php" hash="f3fc028d17c82b9b84b709b932e64eae"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="RiskifiedfullController.php" hash="9f11fee0e096adc0ad5c554606e9bda4"/></dir><file name="ResponseController.php" hash="77f124bfe0e2603bb45a51193a0a87fe"/></dir><dir name="etc"><file name="config.xml" hash="1563d4503f639ff8b336d017bda705e0"/><file name="system.xml" hash="3f49dba20b0b7f83437cfb5f5a8ce12d"/></dir><dir name="sql"><dir name="riskified_full_setup"><file name="mysql4-install-1.0.1.php" hash="6d29dde79353e8bfefa6ea7bc2ef562a"/><file name="mysql4-upgrade-1.0.2.0-1.0.2.1.php" hash="822e85326678a320f141a3ae948e4a24"/><file name="mysql4-upgrade-1.0.4-1.0.5.0.php" hash="557115e1a978d9b194b2cd1cfb8b5a95"/><file name="mysql4-upgrade-1.0.5.5-1.0.6.0.php" hash="0318846fbe8f3e56d8f7d3fdc750e102"/></dir></dir></dir><file name=".DS_Store" hash="af9575107ec7e509e8f187f6c21faa5f"/></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Riskified_Full.xml" hash="d684caecdf710e5d0173ca07e5c5d1c0"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="full.xml" hash="8dbb3dd16fcb5821eb07e9b5d978d55c"/></dir><dir name="template"><dir name="full"><file name="jsinit.phtml" hash="a88b28f46d8dcdf51633802c367bcc41"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="full.xml" hash="9497753e5c3d2860062c5446c058b4bc"/></dir><dir name="template"><dir name="full"><file name="riskified.phtml" hash="fe4a577c6ef98316d906c36c17f11406"/></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><dir name="riskified"><file name="logo.jpg" hash="0ac96bf07aa8b8ecb3ff06c2ccbf0827"/></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="riskified_php_sdk"><file name="README.md" hash="f37118baa641e4ef6d670bb1c0298482"/><dir><dir name="sample"><file name="callback.php" hash="c6fb5a90b2c527b794fcec803acb36d9"/><file name="order_full_flow.php" hash="2f9ee71abb1188685d8adb18dca97321"/><file name="order_marketplace_create.php" hash="ae3d2fb28154a710934d6243302a590d"/><file name="order_simple_submit.php" hash="d8458f7992b486b6dac28558526f068b"/><file name="run_callback_server.sh" hash="8202fd93c15e088d072805d3a2f4c02b"/><file name="update_merchant_settings.php" hash="24499737ab057aba76cd054fd5051aad"/><file name="upload_historical.php" hash="78bdb85c036183de16968a79c8836efd"/></dir><dir name="src"><dir name="Riskified"><dir name="Common"><file name="Env.php" hash="3fc8342a423141fb0c110901deebfe25"/><dir name="Exception"><file name="BaseException.php" hash="ce902d0a3bd9af53b3c1923541602ead"/></dir><file name="Riskified.php" hash="c3adcd9835e919c85507636b22665fcc"/><dir name="Signature"><file name="HttpDataSignature.php" hash="b9f5d57db1903126a72eb38ca55ba878"/></dir><file name="Validations.php" hash="4af37b31901f215b660c868c31594b75"/></dir><dir name="DecisionNotification"><dir name="Exception"><file name="AuthorizationException.php" hash="4cab71ac324efd3b29bdfa6236a8f531"/><file name="BadHeaderException.php" hash="407a0d9e94d52e8b43bed02e34bd4a70"/><file name="BadPostJsonException.php" hash="2e2a7f84fae19fd525f01f6899ea218b"/><file name="NotificationException.php" hash="8f7d1ed8b9523ec66423c6ff2703085f"/></dir><dir name="Model"><file name="Notification.php" hash="9e2f5fd421abe37ab7b742767966f312"/></dir></dir><dir name="OrderWebhook"><dir name="Exception"><file name="ClassMismatchPropertyException.php" hash="8854b7aea6736b290826eb44ac0ba578"/><file name="CurlException.php" hash="27488d2dd0fa2c25b647a5967e3821b1"/><file name="FormatMismatchPropertyException.php" hash="2729989c3ac2a245341fd01a4d004b49"/><file name="InvalidPropertyException.php" hash="97084ff2ff33f5c657c5876a44aa97d2"/><file name="MalformedJsonException.php" hash="8c795b605988f20f1899dcf160f29cf1"/><file name="MissingPropertyException.php" hash="5ad8df6ba645a113fac7b65e08167d2c"/><file name="MultiplePropertiesException.php" hash="aaa042c5a0fcfd15dc2744059b15798b"/><file name="PropertyException.php" hash="7a234406434c5616aab72da27a1ed6ed"/><file name="TypeMismatchPropertyException.php" hash="5eed61220c954a462411f433a2c85bf2"/><file name="UnsuccessfulActionException.php" hash="b02fafbda955fa889ca36c5092ccc68d"/></dir><dir name="Model"><file name="AbstractModel.php" hash="73adfaac9fe9e189827baac5a71e41a4"/><file name="Address.php" hash="afcbe96d54dd0c03b01eb057662cdcf9"/><file name="Attribute.php" hash="e7fa146d7c9c807494c225e6a41afcfb"/><file name="AuthorizationError.php" hash="b82229eff42d94ceba58d4d6a3a4118b"/><file name="ChargeFreePaymentDetails.php" hash="07ab9a9022cc3152404617b72230e843"/><file name="Checkout.php" hash="ede0e6d2fd8319ada669de35b4c3190f"/><file name="ClientDetails.php" hash="50b329fa6b77bcbeff4b725705b957af"/><file name="Customer.php" hash="43baa39c861eb653834066b595b55407"/><file name="Decision.php" hash="55bf62bfcfc49ab9e5b823e7ec90d6bd"/><file name="DecisionDetails.php" hash="317121548885d2b8eb75a4d5e383f9f8"/><file name="DiscountCode.php" hash="0861920950828a3ff19904b92b4cb50d"/><file name="Fulfillment.php" hash="9111db9b13ae7b2fbe6bf806a66d78f2"/><file name="FulfillmentDetails.php" hash="d3c11d4e8943862fc4a774f3f8e9d7d7"/><file name="LineItem.php" hash="f01c65e7ad1195bb994d77d869e301d7"/><file name="MerchantSettings.php" hash="62f42b50b7a25b014cbed4ea528998aa"/><file name="Order.php" hash="e5264565f54800012294d8aecf0619cf"/><file name="OrderCancellation.php" hash="f6f2d5234bb98b56902e632fbccc07b3"/><file name="PaymentDetails.php" hash="413b5a6ab26ec6b9b0664a9d9e301c02"/><file name="Refund.php" hash="1c3ad264984585cfcefc909ffa708dc4"/><file name="RefundDetails.php" hash="f9a0e27e26bbfb6699bb0dd44fe6a184"/><file name="Seller.php" hash="2dd5dc2dc22582231263cad803149a16"/><file name="ShippingLine.php" hash="5ac14361474789db570fa6d14b17a973"/><file name="SocialDetails.php" hash="1fbc1939121c9618e612316c1a4500ca"/><file name="TaxLine.php" hash="59f82a19bc9ada690aa79bc96307db5e"/></dir><dir name="Transport"><file name="AbstractTransport.php" hash="6be123376c81f478968ee420ca5b31cb"/><file name="CurlTransport.php" hash="ecfb195ac0f8f9599dd859dffc40c968"/></dir></dir><file name="autoloader.php" hash="f3471e90daf6184a096d337bbcd40bd1"/></dir></dir></dir><file name=".gitignore" hash="73f01e1298c44b6cc3e24a70cad8c56c"/></dir><dir name="riskified_scripts"><file name="riskified_historical_upload.php" hash="db28908aa4d29a78b712057fa60924fb"/></dir></target></contents>
17
  <compatible/>
18
  <dependencies><required><php><min>4.4.0</min><max>6.0.0</max></php></required></dependencies>
19
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>riskified_magento</name>
4
+ <version>1.0.8.3</version>
5
  <stability>stable</stability>
6
  <license>OSL v3.0</license>
7
  <channel>community</channel>
9
  <summary>Riskified Magento extension</summary>
10
  <description>Riskified reviews, approves &amp; guarantees&#xD;
11
  transactions you would otherwise decline.</description>
12
+ <notes>* Beacon with FPC hole punching capabilities&#xD;
13
+ * Better support for status transitions with order status sync&#xD;
14
+ * Voiding payments at the gateway on decline when state set to canceled.</notes>
15
  <authors><author><name>Riskified_Mage</name><user>Riskified_Mage</user><email>support@riskified.com</email></author></authors>
16
+ <date>2016-03-21</date>
17
+ <time>16:07:57</time>
18
+ <contents><target name="magecommunity"><dir name="Riskified"><dir name="Full"><dir><dir name="Block"><file name="Beacon.php" hash="00c6f36ab82a4805b5408cda907bdcfa"/></dir><dir name="Helper"><dir name="Customer"><file name="Order.php" hash="38278dee0939fba4a017e347ac1784ad"/></dir><file name="Data.php" hash="de74f8666de65022c11ccc7290c494be"/><file name="Debug.php" hash="b4cd9735bdd601cb624f7495242606e2"/><file name="Log.php" hash="ae614c5071160221b71fb0ed600da67e"/><dir name="Order"><file name="Invoice.php" hash="0117cd5689818c3dc9ab9b59fced6c18"/><file name="Status.php" hash="210a0c440b4070fdcb2ead2c2db4e567"/></dir><file name="Order.php" hash="5c66f5cc1ae5c4aa2b820aef8def8d4e"/></dir><dir name="Model"><file name="Authorizenet.php" hash="4b910a92820a8d5571a5129e51b54fd3"/><dir name="Container"><file name="Beacon.php" hash="b1c3910031983b9291c98dbe46d61f09"/></dir><file name="Cron.php" hash="3cdbb07e1eac686b37e179a341640178"/><file name="Observer.php" hash="ce32dda2157928a76fd94311a113bb27"/><dir name="Resource"><dir name="Retry"><file name="Collection.php" hash="fd62ad4e4cdd8d372751bfa9988cc3a9"/></dir><file name="Retry.php" hash="3be3db7e54bd8bb45e0faffa1941f515"/></dir><file name="Retry.php" hash="89e7344139affa4fe0b9a252a5d1c592"/><dir name="System"><dir name="Config"><dir name="Source"><file name="ApprovedState.php" hash="6f4d7f7eb52922e57ff9069ec6031b63"/><file name="CanceledStateStatuses.php" hash="c274fb739314b34104e0b0085f1039c8"/><file name="CaptureCase.php" hash="6f2505f2c51df6a7caa26d5f89995b47"/><file name="DeclinedState.php" hash="d2c80dd15b3843bce5eb4d2a660b080a"/><file name="Env.php" hash="e213a59d9c438e4dc39b226134a85fab"/><file name="HoldedStateStatuses.php" hash="212f2476e5f6bed6d3456133d6e27c40"/><file name="ProcessingStateStatuses.php" hash="19af6046f86df7a5ba28693545493304"/></dir></dir></dir></dir><dir name="Test"><dir name="Config"><file name="General.php" hash="a5d4950c5655960879e7d75c06977941"/></dir><dir name="Helper"><dir name="General"><dir name="fixtures"><file name="extensionConfigEnabled.yaml" hash="eec8c8d8a1d5de49897b19740cf8e074"/></dir></dir><file name="General.php" hash="607c9711656be48084f6688e114b6bf6"/></dir><dir name="Model"><file name="Environments.php" hash="f3fc028d17c82b9b84b709b932e64eae"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><file name="RiskifiedfullController.php" hash="2bcd1d1e3b05bc35e08bd0a9609bb2df"/></dir><file name="ResponseController.php" hash="2e1cc71cb0d8ed2668b21e2e143067b2"/></dir><dir name="etc"><file name="adminhtml.xml" hash="333f4002a4c677b670cd449147b9d3c8"/><file name="cache.xml" hash="3a7cd749515499cce292330c46ce5028"/><file name="config.xml" hash="fd0e3923108ee325f46ae3dd9e9cfa9b"/><file name="system.xml" hash="58e468c2ef66e1b0b8ffc0dcd7e6c55e"/></dir><dir name="sql"><dir name="riskified_full_setup"><file name="mysql4-install-1.0.1.php" hash="66592f315ddacbb116e70b34094fbbef"/><file name="mysql4-upgrade-1.0.2.0-1.0.2.1.php" hash="5d12b7203027e843f6322b5a48fb3d23"/><file name="mysql4-upgrade-1.0.4-1.0.5.0.php" hash="df9bb6016ebab61444d65a5d92b0a70e"/><file name="mysql4-upgrade-1.0.5.5-1.0.6.0.php" hash="c749f3c2564fdf9310dcd22d493630d8"/><file name="mysql4-upgrade-1.0.8.0-1.0.8.1.php" hash="45ac33ab1e02f06f6850dd9876017f09"/></dir></dir></dir><file name=".DS_Store" hash="af9575107ec7e509e8f187f6c21faa5f"/></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Riskified_Full.xml" hash="d684caecdf710e5d0173ca07e5c5d1c0"/></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="full.xml" hash="8dbb3dd16fcb5821eb07e9b5d978d55c"/></dir><dir name="template"><dir name="full"><file name="jsinit.phtml" hash="a88b28f46d8dcdf51633802c367bcc41"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="full.xml" hash="96d4fb310618a1e6fb149dc367952812"/></dir><dir name="template"><dir name="full"><file name="beacon.phtml" hash="396625d0c46c9f4dd287cef289a9bef8"/></dir></dir></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="images"><dir name="riskified"><file name="logo.jpg" hash="0ac96bf07aa8b8ecb3ff06c2ccbf0827"/></dir></dir></dir></dir></dir></target><target name="magelib"><dir name="riskified_php_sdk"><file name="README.md" hash="f37118baa641e4ef6d670bb1c0298482"/><dir><dir name="sample"><file name="callback.php" hash="c6fb5a90b2c527b794fcec803acb36d9"/><file name="order_full_flow.php" hash="2f9ee71abb1188685d8adb18dca97321"/><file name="order_marketplace_create.php" hash="ae3d2fb28154a710934d6243302a590d"/><file name="order_simple_submit.php" hash="d8458f7992b486b6dac28558526f068b"/><file name="run_callback_server.sh" hash="8202fd93c15e088d072805d3a2f4c02b"/><file name="update_merchant_settings.php" hash="24499737ab057aba76cd054fd5051aad"/><file name="upload_historical.php" hash="78bdb85c036183de16968a79c8836efd"/></dir><dir name="src"><dir name="Riskified"><dir name="Common"><file name="Env.php" hash="3fc8342a423141fb0c110901deebfe25"/><dir name="Exception"><file name="BaseException.php" hash="ce902d0a3bd9af53b3c1923541602ead"/></dir><file name="Riskified.php" hash="c3adcd9835e919c85507636b22665fcc"/><dir name="Signature"><file name="HttpDataSignature.php" hash="b9f5d57db1903126a72eb38ca55ba878"/></dir><file name="Validations.php" hash="4af37b31901f215b660c868c31594b75"/></dir><dir name="DecisionNotification"><dir name="Exception"><file name="AuthorizationException.php" hash="4cab71ac324efd3b29bdfa6236a8f531"/><file name="BadHeaderException.php" hash="407a0d9e94d52e8b43bed02e34bd4a70"/><file name="BadPostJsonException.php" hash="2e2a7f84fae19fd525f01f6899ea218b"/><file name="NotificationException.php" hash="8f7d1ed8b9523ec66423c6ff2703085f"/></dir><dir name="Model"><file name="Notification.php" hash="9e2f5fd421abe37ab7b742767966f312"/></dir></dir><dir name="OrderWebhook"><dir name="Exception"><file name="ClassMismatchPropertyException.php" hash="8854b7aea6736b290826eb44ac0ba578"/><file name="CurlException.php" hash="27488d2dd0fa2c25b647a5967e3821b1"/><file name="FormatMismatchPropertyException.php" hash="2729989c3ac2a245341fd01a4d004b49"/><file name="InvalidPropertyException.php" hash="97084ff2ff33f5c657c5876a44aa97d2"/><file name="MalformedJsonException.php" hash="8c795b605988f20f1899dcf160f29cf1"/><file name="MissingPropertyException.php" hash="5ad8df6ba645a113fac7b65e08167d2c"/><file name="MultiplePropertiesException.php" hash="aaa042c5a0fcfd15dc2744059b15798b"/><file name="PropertyException.php" hash="7a234406434c5616aab72da27a1ed6ed"/><file name="TypeMismatchPropertyException.php" hash="5eed61220c954a462411f433a2c85bf2"/><file name="UnsuccessfulActionException.php" hash="b02fafbda955fa889ca36c5092ccc68d"/></dir><dir name="Model"><file name="AbstractModel.php" hash="73adfaac9fe9e189827baac5a71e41a4"/><file name="Address.php" hash="afcbe96d54dd0c03b01eb057662cdcf9"/><file name="Attribute.php" hash="e7fa146d7c9c807494c225e6a41afcfb"/><file name="AuthorizationError.php" hash="b82229eff42d94ceba58d4d6a3a4118b"/><file name="ChargeFreePaymentDetails.php" hash="07ab9a9022cc3152404617b72230e843"/><file name="Checkout.php" hash="ede0e6d2fd8319ada669de35b4c3190f"/><file name="ClientDetails.php" hash="50b329fa6b77bcbeff4b725705b957af"/><file name="Customer.php" hash="43baa39c861eb653834066b595b55407"/><file name="Decision.php" hash="55bf62bfcfc49ab9e5b823e7ec90d6bd"/><file name="DecisionDetails.php" hash="317121548885d2b8eb75a4d5e383f9f8"/><file name="DiscountCode.php" hash="0861920950828a3ff19904b92b4cb50d"/><file name="Fulfillment.php" hash="9111db9b13ae7b2fbe6bf806a66d78f2"/><file name="FulfillmentDetails.php" hash="d3c11d4e8943862fc4a774f3f8e9d7d7"/><file name="LineItem.php" hash="f01c65e7ad1195bb994d77d869e301d7"/><file name="MerchantSettings.php" hash="62f42b50b7a25b014cbed4ea528998aa"/><file name="Order.php" hash="e5264565f54800012294d8aecf0619cf"/><file name="OrderCancellation.php" hash="f6f2d5234bb98b56902e632fbccc07b3"/><file name="PaymentDetails.php" hash="413b5a6ab26ec6b9b0664a9d9e301c02"/><file name="Refund.php" hash="1c3ad264984585cfcefc909ffa708dc4"/><file name="RefundDetails.php" hash="f9a0e27e26bbfb6699bb0dd44fe6a184"/><file name="Seller.php" hash="2dd5dc2dc22582231263cad803149a16"/><file name="ShippingLine.php" hash="5ac14361474789db570fa6d14b17a973"/><file name="SocialDetails.php" hash="1fbc1939121c9618e612316c1a4500ca"/><file name="TaxLine.php" hash="59f82a19bc9ada690aa79bc96307db5e"/></dir><dir name="Transport"><file name="AbstractTransport.php" hash="6be123376c81f478968ee420ca5b31cb"/><file name="CurlTransport.php" hash="ecfb195ac0f8f9599dd859dffc40c968"/></dir></dir><file name="autoloader.php" hash="f3471e90daf6184a096d337bbcd40bd1"/></dir></dir></dir><file name=".gitignore" hash="73f01e1298c44b6cc3e24a70cad8c56c"/></dir><dir name="riskified_scripts"><file name="riskified_historical_upload.php" hash="db28908aa4d29a78b712057fa60924fb"/></dir></target></contents>
19
  <compatible/>
20
  <dependencies><required><php><min>4.4.0</min><max>6.0.0</max></php></required></dependencies>
21
  </package>