RetentionScience_Waves - Version 2.1.8

Version Notes

Formatting updated

Download this release

Release Info

Developer Magento Core Team
Extension RetentionScience_Waves
Version 2.1.8
Comparing to
See all releases


Code changes from version 2.1.7 to 2.1.8

app/code/community/RetentionScience/Waves/Block/Adminhtml/Syncbutton.php CHANGED
@@ -22,7 +22,6 @@ class RetentionScience_Waves_Block_Adminhtml_Syncbutton
22
  ->setType('button')
23
  ->setClass('run_now_button')
24
  ->setLabel($title)
25
- //$this->__('Add')
26
  ->setOnClick("location.href='$link_url';")
27
  ->setDisabled(false)
28
  ->toHtml();
22
  ->setType('button')
23
  ->setClass('run_now_button')
24
  ->setLabel($title)
 
25
  ->setOnClick("location.href='$link_url';")
26
  ->setDisabled(false)
27
  ->toHtml();
app/code/community/RetentionScience/Waves/Block/Waves.php CHANGED
@@ -58,7 +58,6 @@ class RetentionScience_Waves_Block_Waves extends Mage_Core_Block_Template
58
  return Mage::getStoreConfig('waves/retentionscience_settings/ajaxaddtocartenable');
59
  }
60
  public function customerId(){
61
- //$customerId = Mage::getSingleton('customer/session')->getCustomerId();
62
  $email = Mage::getSingleton('customer/session')->getCustomer()->getEmail();
63
  $user_record_id = md5(trim(strtolower($email)));
64
  return $user_record_id;
58
  return Mage::getStoreConfig('waves/retentionscience_settings/ajaxaddtocartenable');
59
  }
60
  public function customerId(){
 
61
  $email = Mage::getSingleton('customer/session')->getCustomer()->getEmail();
62
  $user_record_id = md5(trim(strtolower($email)));
63
  return $user_record_id;
app/code/community/RetentionScience/Waves/Model/Observer.php CHANGED
@@ -1,487 +1,454 @@
1
  <?php
2
- // ini_set('display_errors', '1');
3
  include('retention_science_api.php');
4
  $last_processed_order_record_id;
5
  $last_processed_user_entity_id;
6
  $last_processed_product_entity_id;
7
 
 
 
8
  class RetentionScience_Waves_Model_Observer
9
  {
10
- // if sendBulkUpload, do not access the RS API at all, just ouput all entities to a file
11
- protected $phpBin = 'php'; // only used if useExec==true
12
- // can use sendBulkUpload with or without useExec
13
- // or can just use API by setting sendBulkUpload=false
14
  protected $sendBulkUpload = true;
15
- protected $useBulkCompression = true; // only used if sendBulkUpload==true
16
- protected $useExec = false;
17
  protected $removeFileAfterSend = true; // only used if sendBulkUpload==true
18
  protected $logToFile = false;
19
  protected $elementsPerPage = 2000;
20
  protected $apiClient;
21
 
22
- public function getRetentionScienceApiClient(){
23
- if(!$this->apiClient){
24
- $api_user = Mage::getStoreConfig('waves/retentionscience_settings/api_user');
25
- $api_pass = Mage::getStoreConfig('waves/retentionscience_settings/api_pass');
26
- $testmode = Mage::getStoreConfig('waves/retentionscience_settings/testmode');
27
- // $client = new RetentionScienceApi($api_user, $api_pass, $testmode);
28
- $this->apiClient = new RetentionScienceApi($api_user, $api_pass, $testmode);
29
- }
30
- return $this->apiClient;
31
- }
32
-
33
- public function getPhpBin(){
34
- $php_bin = Mage::getStoreConfig('waves/rs_sync_advanced/rs_php_bin');
35
- if ($php_bin == NULL){
36
- $php_bin = $this->phpBin;
37
- }
38
- // echo "PHP_BIN is [ $php_bin ] \n";
39
- return $php_bin;
40
- }
41
 
42
- public function logToFile(){
43
- return $this->logToFile;
44
- }
 
 
 
 
45
 
46
- public function sendBulkUpload(){
47
- $send_bulk_upload = Mage::getStoreConfig('waves/rs_sync_advanced/rs_send_bulk_upload');
48
- if ($send_bulk_upload == NULL){
49
- $send_bulk_upload = $this->sendBulkUpload;
50
- }
51
- // echo "send_bulk_upload is [ $send_bulk_upload ] \n";
52
- return $send_bulk_upload;
53
- }
54
 
55
- public function useBulkCompression(){
56
- $use_bulk_compression = Mage::getStoreConfig('waves/rs_sync_advanced/rs_use_bulk_compression');
57
- if ($use_bulk_compression == NULL){
58
- $use_bulk_compression = $this->useBulkCompression;
59
- }
60
- return $use_bulk_compression;
61
- }
62
 
63
- public function elementsPerPage(){
64
- return $this->elementsPerPage;
65
- }
 
 
 
 
66
 
67
- public function useExec(){
68
- $use_exec = Mage::getStoreConfig('waves/rs_sync_advanced/rs_bulk_use_exec');
69
- if ($use_exec == NULL){
70
- $use_exec = $this->useExec;
71
- }
72
- //echo "use_exec is [ $use_exec ] \n";
73
- return $use_exec;
74
- }
75
 
76
- public function writeToLog($msg, $category){
77
- $msg = $msg . "\n";
78
- $file = dirname(__FILE__) . '/retention_science_'. $category.'.log';
79
- file_put_contents($file, $msg, FILE_APPEND);
80
- }
81
 
82
- public function get_last_processed_order_record_id(){
83
- global $last_processed_order_record_id;
84
- return $last_processed_order_record_id;
85
- }
86
 
87
- public function get_last_processed_user_entity_id(){
88
- global $last_processed_user_entity_id;
89
- return $last_processed_user_entity_id;
90
- }
91
 
92
- public function get_last_processed_product_entity_id(){
93
- global $last_processed_product_entity_id;
94
- return $last_processed_product_entity_id;
95
- }
96
 
97
- public function writeBulkUploadFile($entity_hash, $category, $timestamp){
98
- $tmp_base = Mage::getBaseDir('tmp');
99
 
100
- $msg = json_encode($entity_hash) . "\n";
101
- // $file = dirname(__FILE__) . '/rs_bulk_'. $category.'_'.$timestamp.'.log';
102
- $file = $tmp_base . '/rs_bulk_'. $category.'_'.$timestamp.'.log';
103
- file_put_contents($file, $msg, FILE_APPEND);
104
- }
105
 
106
- public function sendDataSyncFiles($timestamp) {
107
- $tmp_base = Mage::getBaseDir('tmp');
108
 
109
- $types = array("categories", "items", "users", "orders", "orders_users");
110
- $files = array();
111
- $gzfiles = array();
112
- foreach ($types as $type) {
113
- $file = $tmp_base . '/rs_bulk_'. $type.'_'.$timestamp.'.log';
114
- if (file_exists($file)) {
115
- $files[$type] = $file;
116
- if ($this->useBulkCompression()) {
117
- $gzfile = $file . ".gz";
118
- $fp = gzopen($gzfile, 'wb');
119
- gzwrite($fp, file_get_contents($file));
120
- gzclose($fp);
121
- $gzfiles[$type] = $gzfile;
122
- }
123
- }
124
- }
125
 
126
- $files_to_send = (count($gzfiles) > 0) ? $gzfiles : $files;
127
 
128
- if (count($files_to_send) > 0) {
129
- $this->getRetentionScienceApiClient()->sync_data($files_to_send);
130
 
131
- if ($this->removeFileAfterSend) {
132
- array_map("unlink", array_values($files));
133
- array_map("unlink", array_values($gzfiles));
134
- }
135
- }
136
- }
137
 
138
- public function productCallback($args){
139
 
140
- global $last_processed_product_entity_id;
141
 
142
- $timestamp = $args['timestamp'];
143
 
144
- $product_id = $args['product_id'];
145
- $product = Mage::getModel('catalog/product')->load($product_id);
146
- $product_name = $product->getName();
147
 
148
- // OLDER VERSIONS OF MAGENTO HAVE A FATAL ERROR for this bug in magento: http://www.magentocommerce.com/boards/viewthread/53871/#t215589
149
- // MUST PATCH app/code/core/Mage/Catalog/Model/Product.php
150
- $manufacturer = $product->getAttributeText('manufacturer');
151
- $manufacturer = $manufacturer ? $manufacturer : null;
152
  $model = $product->getSku();
153
- $qty_stock = (int) Mage::getModel('cataloginventory/stock_item')->loadByProduct($product)->getQty();
154
- $price = $product->getPrice();
155
- if($product->getSpecialPrice()){
156
- $price = $product->getSpecialPrice();
157
- }
158
- $price = number_format($price, 2, '.', '');
159
- // TODO: THIS returns false when called from the PHPscript
160
- $active = ($product->isSalable()) ? true : false;
161
- $images_url = array($product->getImageUrl());
162
- $media_images = $product->getMediaGalleryImages();
163
- foreach($media_images as $media_image){
164
- $images_url[] = $media_image->getUrl();
165
- }
166
- $categories = $product->getCategoryIds();
167
- $item_url = $product->getProductUrl();
168
- // $item_url = Mage::helper('catalog/product')->getProductUrl($product_id);
169
- // $item_url = $product->getUrlPath();
170
- //$_category = Mage::getModel('catalog/category')->load($categories[0]);
171
- //$item_url = Mage::getUrl($_category->getUrlPath()).basename($product->getProductUrl());
172
- //$item_url = $product->getUrlInStore();
173
 
174
- // Get the parent_item_record_id
175
- $parent_record_id = null;
176
- $product_type_id = $product->getTypeId();
177
- if($product_type_id == "simple"){
178
- $parentIds = Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($product_id);
179
- if(!$parentIds){
180
- $parentIds = Mage::getModel('catalog/product_type_grouped')->getParentIdsByChild($product_id);
181
- }
182
- if(isset($parentIds[0])){
183
- $parent_record_id = $parentIds[0];
184
- }
185
- }
186
 
187
- $product_array = array(
188
- 'name'=> $product_name,
189
- 'manufacturer' => $manufacturer,
190
- 'model' => $model,
191
- 'quantity' => $qty_stock,
192
- 'price' => $price,
193
- 'active' => $active,
194
- 'image_list' => $images_url,
195
- 'item_url' => $item_url,
196
- 'parent_record_id' => $parent_record_id,
197
- 'attribute_1' => $product_type_id,
198
- 'categories' => $categories
199
- );
200
 
201
- if ($this->sendBulkUpload()){
202
- $this->writeBulkUploadFile(array($product_id => $product_array), 'items', $timestamp);
203
- } else {
204
- try{
205
- $this->getRetentionScienceApiClient()->update_item($product_id, $product_array);
206
- } catch (Exception $e){
207
- // do nothing
208
- }
209
- }
210
 
211
- # Update this as we iterate
212
- $last_processed_product_entity_id = $product_id;
213
- }
214
 
215
- public function userCallback($args){
216
- global $last_processed_user_entity_id;
217
 
218
- $timestamp = $args['timestamp'];
219
- $user = Mage::getModel('customer/customer')->load($args['user_record_id']);
220
- $email = $user->getEmail();
221
- $user_entity_id = $user->getEntityId();
222
- $user_record_id = md5(trim(strtolower($email)));
223
- $fullName = $user->getName();
224
- $address = Mage::getModel('customer/address')->load($user->getdefault_billing());
225
- $address1 = $address->getStreetFull();
226
- $address1 = str_replace("\n"," ",$address1);
227
- $city = $address->getCity();
228
- $regionModel = Mage::getModel('directory/region')->load($address->getRegionId());
229
- $region = $regionModel->getName();
230
- $zip = $address->getPostcode();
231
- $country = $address->getCountryId();
232
- $phone = $address->getTelephone();
233
- $birthDate = $user->getDob();
234
- $birthDate = explode('-',$birthDate);
235
- $birth_year = $birthDate[0];
236
- $gender = $user->getGender();
237
- // $ipAddress = '117.196.42.219';
238
- // $numberLogons = '2';
239
- $accountCreatedAt = $user->getCreatedAt();
240
- $accountCreatedAt = date("Y-m-d", Mage::getModel('core/date')->timestamp(strtotime($accountCreatedAt)));
241
 
242
- $accountUpdatedDate = $user->getUpdatedAt();
243
- $accountUpdatedAt = date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(strtotime($accountUpdatedDate)));
244
 
245
- if (!$this->sendBulkUpload()){
246
- // only update some fields (like created_at) if this is a new user.
247
- $user_exists_already = $this->getRetentionScienceApiClient()->user_exists($user_record_id);
248
- $existing_user = ($user_exists_already) ? $this->getRetentionScienceApiClient()->show_user($user_record_id) : null;
249
- }
250
 
251
- $user_array = array();
252
- if($email){
253
- $user_array['email'] = $email;
254
- }
255
- if($fullName){
256
- $user_array['full_name'] = $fullName;
257
- }
258
- if($address1){
259
- $user_array['address1'] = $address1;
260
- }
261
- if($city){
262
- $user_array['city'] = $city;
263
- }
264
- if($region){
265
- $user_array['state'] = $region;
266
- }
267
- if($zip){
268
- $user_array['zip'] = $zip;
269
- }
270
- if($country){
271
- $user_array['country'] = $country;
272
- }
273
- if($phone){
274
- $user_array['phone'] = $phone;
275
- }
276
- if($birth_year){
277
- $user_array['birth_year'] = $birth_year;
278
- }
279
- if($gender){
280
- $user_array['gender'] = $gender;
281
- }
282
- if($accountCreatedAt){
283
- if ($this->sendBulkUpload()){
284
- $user_array['account_created_on'] = $accountCreatedAt;
285
 
286
- } else {
287
- // Only send this if user has not already been created
288
- if (!($user_exists_already) || ($existing_user && (strtotime($existing_user['account_created_on']) > strtotime($accountCreatedAt))) ){
289
- $user_array['account_created_on'] = $accountCreatedAt;
290
- }
291
- }
292
- }
293
- if($accountUpdatedAt){
294
- $user_array['last_logon_at'] = $accountUpdatedAt;
295
- }
296
- if ($this->logToFile()){
297
- $this->writeToLog($user_record_id, 'users');
298
- $this->writeToLog(http_build_query($user_array), 'users');
299
- }
300
 
301
- if ($this->sendBulkUpload()){
302
- $this->writeBulkUploadFile(array($user_record_id => $user_array), 'users', $timestamp);
303
- } else {
304
- try{
305
- $this->getRetentionScienceApiClient()->update_user($user_record_id, $user_array);
306
- } catch (Exception $e){
307
- // do nothing
308
- }
309
- }
310
-
311
- # Update this as we iterate
312
- $last_processed_user_entity_id = $user_entity_id;
313
-
314
- }
315
 
316
- public function orderCallback($args){
317
- #echo "before: " . memory_get_usage() . "\n";
318
- $timestamp = $args['timestamp'];
319
- global $last_processed_order_record_id;
320
- //$order = Mage::getModel('sales/order');
321
- //$order->setData($args['row']);
322
- //echo "Loading order with record_id " . $args['order_record_id'] . " \n";
323
- $order = Mage::getModel('sales/order')->load($args['order_record_id']);
324
- $order_array = array();
325
- $order_record_id = $order->getEntityId();
326
- //$orderAllItems = $order->getAllItems();
327
- $orderAllItems = $order->getAllVisibleItems();
328
- $order_item_array = array();
329
- foreach($orderAllItems as $orderAllItem){
330
- $item_record_id = $orderAllItem->getProductId();
331
- $name = $orderAllItem->getName();
332
- $quantity = (int) $orderAllItem->getQtyOrdered();
333
- $price = $orderAllItem->getPrice();
334
- $price = number_format($price, 2, '.', '');
335
- $final_price = $price * $quantity;
336
- $sku = $orderAllItem->getSku();
337
- $productId = $orderAllItem->getProductId();
338
- $product = Mage::getModel('catalog/product')->load($productId);
339
- $categoryIds = $product->getCategoryIds();
340
- $order_item_array[] = array(
341
- 'item_record_id' => $item_record_id,
342
- 'name' => $name,
343
- 'quantity' => $quantity,
344
- 'price' => $price,
345
- 'final_price' => $final_price,
346
- 'attribute_1' => $sku,
347
- 'categories' => $categoryIds
348
- );
349
- // save memory
350
- // $product->clearInstance(); // doesnt work on older magento installs
351
- unset($product);
352
- }
353
- // Save memory ?
354
- unset($orderAllItems);
355
-
356
- $user_record_id = md5(trim(strtolower($order->getCustomerEmail())));
357
- if($order->getCustomerIsGuest()){
358
- $email = $order->getCustomerEmail();
359
- $user_record_id = md5(trim(strtolower($email)));
360
 
361
- // get billing address
362
- $address = $order->getBillingAddress();
363
- $fullName = $order->getCustomerFirstname()." ".$order->getCustomerLastname();
 
364
 
365
- $address1 = $address->getStreetFull();
366
- $address1 = str_replace("\n"," ",$address1);
367
- $city = $address->getCity();
368
- $regionModel = Mage::getModel('directory/region')->load($address->getRegionId());
369
- $region = $regionModel->getName();
370
- $zip = $address->getPostcode();
371
- $country = $address->getCountryId();
372
- $phone = $address->getTelephone();
373
- $accountCreatedAt = $order->getCreatedAt();
374
- $accountUpdatedAt = date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(strtotime($accountCreatedAt)));
375
- $accountCreatedAt = date("Y-m-d", Mage::getModel('core/date')->timestamp(strtotime($accountCreatedAt)));
376
 
377
- if (!$this->sendBulkUpload()){
378
- // only update some fields (like created_at) if this is a new user.
379
- $user_exists_already = $this->getRetentionScienceApiClient()->user_exists($user_record_id);
380
- $existing_user = ($user_exists_already) ? $this->getRetentionScienceApiClient()->show_user($user_record_id) : null;
381
- }
 
 
 
 
 
 
382
 
 
 
 
 
 
383
 
384
- // send this user to api as well...
385
- $user_array = array();
386
- if($email){
387
- $user_array['email'] = $email;
388
- }
389
- if($fullName){
390
- $user_array['full_name'] = $fullName;
391
- }
392
- if($address1){
393
- $user_array['address1'] = $address1;
394
- }
395
- if($city){
396
- $user_array['city'] = $city;
397
- }
398
- if($region){
399
- $user_array['state'] = $region;
400
- }
401
- if($zip){
402
- $user_array['zip'] = $zip;
403
- }
404
- if($country){
405
- $user_array['country'] = $country;
406
- }
407
- if($phone){
408
- $user_array['phone'] = $phone;
409
- }
410
- if($accountCreatedAt){
411
- if ($this->sendBulkUpload()){
412
- $user_array['account_created_on'] = $accountCreatedAt;
413
 
414
- } else {
415
- if (!($user_exists_already)){
416
- $this->writeToLog("User does not exist yet ***** - creating with account_created_on as [" . $accountCreatedAt . ']', 'order_users');
417
- } else if ($existing_user) {
418
- $this->writeToLog(http_build_query($existing_user), 'existing_users');
419
- $themsg = "Existing user is PRESENT. His account_created_on is [" . $existing_user['account_created_on'] . "]. My accountCreatedAt is [" . $accountCreatedAt . "]";
420
- $this->writeToLog($themsg, 'order_users');
421
- }
422
 
423
- if (!($user_exists_already) || ($existing_user && (strtotime($existing_user['account_created_on']) > strtotime($accountCreatedAt))) ){
424
- $user_array['account_created_on'] = $accountCreatedAt;
425
- }
426
- }
427
- }
428
- if($accountUpdatedAt){
429
- $user_array['last_logon_at'] = $accountUpdatedAt;
430
- }
431
 
432
- if ($this->logToFile()){
433
- $this->writeToLog($user_record_id, 'order_users');
434
- $this->writeToLog(http_build_query($user_array), 'order_users');
435
- }
436
- try{
437
- if ($this->sendBulkUpload()){
438
- $this->writeBulkUploadFile(array($user_record_id => $user_array), 'orders_users', $timestamp);
439
- } else {
440
- $this->getRetentionScienceApiClient()->update_user($user_record_id, $user_array);
441
- }
442
- } catch (Exception $e){
443
- // do nothing
444
- }
445
- }
446
 
447
- $total_price = $order->getBaseSubtotal();
448
- $total_price = number_format($total_price, 2, '.', '');
449
- $discount_amount = $order->getBaseDiscountAmount();
450
- $shipping_amount = $order->getShippingAmount();
451
- $tax_amount = $order->getBaseTaxAmount();
452
- $date = $order->getCreatedAt();
453
- $ordered_at = date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(strtotime($date)));
454
- $payment_method = $order->getPayment()->getMethodInstance()->getTitle();
455
- $order_array = array(
456
- 'user_record_id' => $user_record_id,
457
- 'total_price' => $total_price,
458
- 'discount_amount' => $discount_amount,
459
- 'shipping_amount' => $shipping_amount,
460
- 'tax_amount' => $tax_amount,
461
- 'ordered_at' => $ordered_at,
462
- 'payment_method' => $payment_method,
463
- 'order_items'=> $order_item_array
464
- );
465
- if ($this->sendBulkUpload()){
466
- $this->writeBulkUploadFile(array($order_record_id => $order_array), 'orders', $timestamp);
467
- } else {
468
- try {
469
- $this->getRetentionScienceApiClient()->update_order($order_record_id, $order_array);
470
- } catch (Exception $e){
471
- // do nothing
472
- }
473
- }
474
 
475
- // Update this as we iterate
476
- $last_processed_order_record_id = $order_record_id;
477
- // Release memory?
478
- unset($order_array);
479
- // $order->clearInstance(); //doesnt work on older magento ver
480
- unset($order);
481
- //echo "after: " . memory_get_usage() . "\n";
482
- }
483
 
484
- public function coreBlockAbstractPrepareLayoutAfter(Varien_Event_Observer $observer)
485
  {
486
  if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index')
487
  {
@@ -516,21 +483,21 @@ class RetentionScience_Waves_Model_Observer
516
  return $rscore_json;
517
  }
518
 
519
- public function syncData() {
520
- if (Mage::getStoreConfig('waves/retentionscience_settings/enable') == 1) {
521
- $phpbin = $this->getPhpBin();
522
- $sync_data_script = escapeshellarg(dirname(__FILE__) . "/rs_sync_data.php");
523
 
524
- $store_id = Mage::getStoreConfig('waves/retentionscience_settings/store_id');
525
- $valid_store_ids = array_keys(Mage::app()->getStores());
526
 
527
- if (in_array($store_id, $valid_store_ids)) {
528
- exec("$phpbin $sync_data_script $store_id > /dev/null &");
529
- } else {
530
- Mage::getSingleton('core/session')->addError("You must select a valid Store ID!");
531
- }
532
- } else {
533
- Mage::getSingleton('core/session')->addError("You can't sync data unless Retention Science is enabled!");
534
- }
535
- }
536
  }
1
  <?php
 
2
  include('retention_science_api.php');
3
  $last_processed_order_record_id;
4
  $last_processed_user_entity_id;
5
  $last_processed_product_entity_id;
6
 
7
+ // if sendBulkUpload, do not access the RS API for individual records, instead just ouput all entities to a file
8
+
9
  class RetentionScience_Waves_Model_Observer
10
  {
11
+ protected $phpBin = 'php';
 
 
 
12
  protected $sendBulkUpload = true;
13
+ protected $useBulkCompression = true; // only used if sendBulkUpload==true
 
14
  protected $removeFileAfterSend = true; // only used if sendBulkUpload==true
15
  protected $logToFile = false;
16
  protected $elementsPerPage = 2000;
17
  protected $apiClient;
18
 
19
+ public function getRetentionScienceApiClient(){
20
+ if(!$this->apiClient){
21
+ $api_user = Mage::getStoreConfig('waves/retentionscience_settings/api_user');
22
+ $api_pass = Mage::getStoreConfig('waves/retentionscience_settings/api_pass');
23
+ $testmode = Mage::getStoreConfig('waves/retentionscience_settings/testmode');
24
+ $this->apiClient = new RetentionScienceApi($api_user, $api_pass, $testmode);
25
+ }
26
+ return $this->apiClient;
27
+ }
 
 
 
 
 
 
 
 
 
 
28
 
29
+ public function getPhpBin(){
30
+ $php_bin = Mage::getStoreConfig('waves/rs_sync_advanced/rs_php_bin');
31
+ if ($php_bin == NULL){
32
+ $php_bin = $this->phpBin;
33
+ }
34
+ return $php_bin;
35
+ }
36
 
37
+ public function logToFile(){
38
+ return $this->logToFile;
39
+ }
 
 
 
 
 
40
 
41
+ public function sendBulkUpload(){
42
+ $send_bulk_upload = Mage::getStoreConfig('waves/rs_sync_advanced/rs_send_bulk_upload');
43
+ if ($send_bulk_upload == NULL){
44
+ $send_bulk_upload = $this->sendBulkUpload;
45
+ }
46
+ return $send_bulk_upload;
47
+ }
48
 
49
+ public function useBulkCompression(){
50
+ $use_bulk_compression = Mage::getStoreConfig('waves/rs_sync_advanced/rs_use_bulk_compression');
51
+ if ($use_bulk_compression == NULL){
52
+ $use_bulk_compression = $this->useBulkCompression;
53
+ }
54
+ return $use_bulk_compression;
55
+ }
56
 
57
+ public function elementsPerPage(){
58
+ return $this->elementsPerPage;
59
+ }
 
 
 
 
 
60
 
61
+ public function writeToLog($msg, $category){
62
+ $msg = $msg . "\n";
63
+ $file = dirname(__FILE__) . '/retention_science_'. $category.'.log';
64
+ file_put_contents($file, $msg, FILE_APPEND);
65
+ }
66
 
67
+ public function get_last_processed_order_record_id(){
68
+ global $last_processed_order_record_id;
69
+ return $last_processed_order_record_id;
70
+ }
71
 
72
+ public function get_last_processed_user_entity_id(){
73
+ global $last_processed_user_entity_id;
74
+ return $last_processed_user_entity_id;
75
+ }
76
 
77
+ public function get_last_processed_product_entity_id(){
78
+ global $last_processed_product_entity_id;
79
+ return $last_processed_product_entity_id;
80
+ }
81
 
82
+ public function writeBulkUploadFile($entity_hash, $category, $timestamp){
83
+ $tmp_base = Mage::getBaseDir('tmp');
84
 
85
+ $msg = json_encode($entity_hash) . "\n";
86
+ $file = $tmp_base . '/rs_bulk_'. $category.'_'.$timestamp.'.log';
87
+ file_put_contents($file, $msg, FILE_APPEND);
88
+ }
 
89
 
90
+ public function sendDataSyncFiles($timestamp) {
91
+ $tmp_base = Mage::getBaseDir('tmp');
92
 
93
+ $types = array("categories", "items", "users", "orders", "orders_users");
94
+ $files = array();
95
+ $gzfiles = array();
96
+ foreach ($types as $type) {
97
+ $file = $tmp_base . '/rs_bulk_'. $type.'_'.$timestamp.'.log';
98
+ if (file_exists($file)) {
99
+ $files[$type] = $file;
100
+ if ($this->useBulkCompression()) {
101
+ $gzfile = $file . ".gz";
102
+ $fp = gzopen($gzfile, 'wb');
103
+ gzwrite($fp, file_get_contents($file));
104
+ gzclose($fp);
105
+ $gzfiles[$type] = $gzfile;
106
+ }
107
+ }
108
+ }
109
 
110
+ $files_to_send = (count($gzfiles) > 0) ? $gzfiles : $files;
111
 
112
+ if (count($files_to_send) > 0) {
113
+ $this->getRetentionScienceApiClient()->sync_data($files_to_send);
114
 
115
+ if ($this->removeFileAfterSend) {
116
+ array_map("unlink", array_values($files));
117
+ array_map("unlink", array_values($gzfiles));
118
+ }
119
+ }
120
+ }
121
 
122
+ public function productCallback($args){
123
 
124
+ global $last_processed_product_entity_id;
125
 
126
+ $timestamp = $args['timestamp'];
127
 
128
+ $product_id = $args['product_id'];
129
+ $product = Mage::getModel('catalog/product')->load($product_id);
130
+ $product_name = $product->getName();
131
 
132
+ // OLDER VERSIONS OF MAGENTO HAVE A FATAL ERROR for this bug in magento: http://www.magentocommerce.com/boards/viewthread/53871/#t215589
133
+ // MUST PATCH app/code/core/Mage/Catalog/Model/Product.php
134
+ $manufacturer = $product->getAttributeText('manufacturer');
135
+ $manufacturer = $manufacturer ? $manufacturer : null;
136
  $model = $product->getSku();
137
+ $qty_stock = (int) Mage::getModel('cataloginventory/stock_item')->loadByProduct($product)->getQty();
138
+ $price = $product->getPrice();
139
+ if($product->getSpecialPrice()){
140
+ $price = $product->getSpecialPrice();
141
+ }
142
+ $price = number_format($price, 2, '.', '');
143
+ $active = ($product->isSalable()) ? true : false;
144
+ $images_url = array($product->getImageUrl());
145
+ $media_images = $product->getMediaGalleryImages();
146
+ foreach($media_images as $media_image){
147
+ $images_url[] = $media_image->getUrl();
148
+ }
149
+ $categories = $product->getCategoryIds();
150
+ $item_url = $product->getProductUrl();
 
 
 
 
 
 
151
 
152
+ // Get the parent_item_record_id
153
+ $parent_record_id = null;
154
+ $product_type_id = $product->getTypeId();
155
+ if($product_type_id == "simple"){
156
+ $parentIds = Mage::getModel('catalog/product_type_configurable')->getParentIdsByChild($product_id);
157
+ if(!$parentIds){
158
+ $parentIds = Mage::getModel('catalog/product_type_grouped')->getParentIdsByChild($product_id);
159
+ }
160
+ if(isset($parentIds[0])){
161
+ $parent_record_id = $parentIds[0];
162
+ }
163
+ }
164
 
165
+ $product_array = array(
166
+ 'name'=> $product_name,
167
+ 'manufacturer' => $manufacturer,
168
+ 'model' => $model,
169
+ 'quantity' => $qty_stock,
170
+ 'price' => $price,
171
+ 'active' => $active,
172
+ 'image_list' => $images_url,
173
+ 'item_url' => $item_url,
174
+ 'parent_record_id' => $parent_record_id,
175
+ 'attribute_1' => $product_type_id,
176
+ 'categories' => $categories
177
+ );
178
 
179
+ if ($this->sendBulkUpload()){
180
+ $this->writeBulkUploadFile(array($product_id => $product_array), 'items', $timestamp);
181
+ } else {
182
+ try{
183
+ $this->getRetentionScienceApiClient()->update_item($product_id, $product_array);
184
+ } catch (Exception $e){
185
+ // do nothing
186
+ }
187
+ }
188
 
189
+ // Update this as we iterate
190
+ $last_processed_product_entity_id = $product_id;
191
+ }
192
 
193
+ public function userCallback($args){
194
+ global $last_processed_user_entity_id;
195
 
196
+ $timestamp = $args['timestamp'];
197
+ $user = Mage::getModel('customer/customer')->load($args['user_record_id']);
198
+ $email = $user->getEmail();
199
+ $user_entity_id = $user->getEntityId();
200
+ $user_record_id = md5(trim(strtolower($email)));
201
+ $fullName = $user->getName();
202
+ $address = Mage::getModel('customer/address')->load($user->getdefault_billing());
203
+ $address1 = $address->getStreetFull();
204
+ $address1 = str_replace("\n"," ",$address1);
205
+ $city = $address->getCity();
206
+ $regionModel = Mage::getModel('directory/region')->load($address->getRegionId());
207
+ $region = $regionModel->getName();
208
+ $zip = $address->getPostcode();
209
+ $country = $address->getCountryId();
210
+ $phone = $address->getTelephone();
211
+ $birthDate = $user->getDob();
212
+ $birthDate = explode('-',$birthDate);
213
+ $birth_year = $birthDate[0];
214
+ $gender = $user->getGender();
215
+ // $ipAddress = '117.196.42.219';
216
+ // $numberLogons = '2';
217
+ $accountCreatedAt = $user->getCreatedAt();
218
+ $accountCreatedAt = date("Y-m-d", Mage::getModel('core/date')->timestamp(strtotime($accountCreatedAt)));
219
 
220
+ $accountUpdatedDate = $user->getUpdatedAt();
221
+ $accountUpdatedAt = date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(strtotime($accountUpdatedDate)));
222
 
223
+ if (!$this->sendBulkUpload()){
224
+ // only update some fields (like created_at) if this is a new user.
225
+ $user_exists_already = $this->getRetentionScienceApiClient()->user_exists($user_record_id);
226
+ $existing_user = ($user_exists_already) ? $this->getRetentionScienceApiClient()->show_user($user_record_id) : null;
227
+ }
228
 
229
+ $user_array = array();
230
+ if($email){
231
+ $user_array['email'] = $email;
232
+ }
233
+ if($fullName){
234
+ $user_array['full_name'] = $fullName;
235
+ }
236
+ if($address1){
237
+ $user_array['address1'] = $address1;
238
+ }
239
+ if($city){
240
+ $user_array['city'] = $city;
241
+ }
242
+ if($region){
243
+ $user_array['state'] = $region;
244
+ }
245
+ if($zip){
246
+ $user_array['zip'] = $zip;
247
+ }
248
+ if($country){
249
+ $user_array['country'] = $country;
250
+ }
251
+ if($phone){
252
+ $user_array['phone'] = $phone;
253
+ }
254
+ if($birth_year){
255
+ $user_array['birth_year'] = $birth_year;
256
+ }
257
+ if($gender){
258
+ $user_array['gender'] = $gender;
259
+ }
260
+ if($accountCreatedAt){
261
+ if ($this->sendBulkUpload()){
262
+ $user_array['account_created_on'] = $accountCreatedAt;
263
 
264
+ } else {
265
+ // Only send this if user has not already been created
266
+ if (!($user_exists_already) || ($existing_user && (strtotime($existing_user['account_created_on']) > strtotime($accountCreatedAt))) ){
267
+ $user_array['account_created_on'] = $accountCreatedAt;
268
+ }
269
+ }
270
+ }
271
+ if($accountUpdatedAt){
272
+ $user_array['last_logon_at'] = $accountUpdatedAt;
273
+ }
274
+ if ($this->logToFile()){
275
+ $this->writeToLog($user_record_id, 'users');
276
+ $this->writeToLog(http_build_query($user_array), 'users');
277
+ }
278
 
279
+ if ($this->sendBulkUpload()){
280
+ $this->writeBulkUploadFile(array($user_record_id => $user_array), 'users', $timestamp);
281
+ } else {
282
+ try{
283
+ $this->getRetentionScienceApiClient()->update_user($user_record_id, $user_array);
284
+ } catch (Exception $e){
285
+ // do nothing
286
+ }
287
+ }
288
+ // Update this as we iterate
289
+ $last_processed_user_entity_id = $user_entity_id;
290
+ }
 
 
291
 
292
+ public function orderCallback($args){
293
+ $timestamp = $args['timestamp'];
294
+ global $last_processed_order_record_id;
295
+
296
+ $order = Mage::getModel('sales/order')->load($args['order_record_id']);
297
+ $order_array = array();
298
+ $order_record_id = $order->getEntityId();
299
+ $orderAllItems = $order->getAllVisibleItems();
300
+ $order_item_array = array();
301
+ foreach($orderAllItems as $orderAllItem){
302
+ $item_record_id = $orderAllItem->getProductId();
303
+ $name = $orderAllItem->getName();
304
+ $quantity = (int) $orderAllItem->getQtyOrdered();
305
+ $price = $orderAllItem->getPrice();
306
+ $price = number_format($price, 2, '.', '');
307
+ $final_price = $price * $quantity;
308
+ $sku = $orderAllItem->getSku();
309
+ $productId = $orderAllItem->getProductId();
310
+ $product = Mage::getModel('catalog/product')->load($productId);
311
+ $categoryIds = $product->getCategoryIds();
312
+ $order_item_array[] = array(
313
+ 'item_record_id' => $item_record_id,
314
+ 'name' => $name,
315
+ 'quantity' => $quantity,
316
+ 'price' => $price,
317
+ 'final_price' => $final_price,
318
+ 'attribute_1' => $sku,
319
+ 'categories' => $categoryIds
320
+ );
321
+ // save memory - Note, $product->clearInstance(); doesnt work on older magento installs
322
+ unset($product);
323
+ }
324
+ unset($orderAllItems);
 
 
 
 
 
 
 
 
 
 
 
325
 
326
+ $user_record_id = md5(trim(strtolower($order->getCustomerEmail())));
327
+ if($order->getCustomerIsGuest()){
328
+ $email = $order->getCustomerEmail();
329
+ $user_record_id = md5(trim(strtolower($email)));
330
 
331
+ // get billing address
332
+ $address = $order->getBillingAddress();
333
+ $fullName = $order->getCustomerFirstname()." ".$order->getCustomerLastname();
 
 
 
 
 
 
 
 
334
 
335
+ $address1 = $address->getStreetFull();
336
+ $address1 = str_replace("\n"," ",$address1);
337
+ $city = $address->getCity();
338
+ $regionModel = Mage::getModel('directory/region')->load($address->getRegionId());
339
+ $region = $regionModel->getName();
340
+ $zip = $address->getPostcode();
341
+ $country = $address->getCountryId();
342
+ $phone = $address->getTelephone();
343
+ $accountCreatedAt = $order->getCreatedAt();
344
+ $accountUpdatedAt = date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(strtotime($accountCreatedAt)));
345
+ $accountCreatedAt = date("Y-m-d", Mage::getModel('core/date')->timestamp(strtotime($accountCreatedAt)));
346
 
347
+ if (!$this->sendBulkUpload()){
348
+ // only update some fields (like created_at) if this is a new user.
349
+ $user_exists_already = $this->getRetentionScienceApiClient()->user_exists($user_record_id);
350
+ $existing_user = ($user_exists_already) ? $this->getRetentionScienceApiClient()->show_user($user_record_id) : null;
351
+ }
352
 
353
+ // send this user to api as well
354
+ $user_array = array();
355
+ if($email){
356
+ $user_array['email'] = $email;
357
+ }
358
+ if($fullName){
359
+ $user_array['full_name'] = $fullName;
360
+ }
361
+ if($address1){
362
+ $user_array['address1'] = $address1;
363
+ }
364
+ if($city){
365
+ $user_array['city'] = $city;
366
+ }
367
+ if($region){
368
+ $user_array['state'] = $region;
369
+ }
370
+ if($zip){
371
+ $user_array['zip'] = $zip;
372
+ }
373
+ if($country){
374
+ $user_array['country'] = $country;
375
+ }
376
+ if($phone){
377
+ $user_array['phone'] = $phone;
378
+ }
379
+ if($accountCreatedAt){
380
+ if ($this->sendBulkUpload()){
381
+ $user_array['account_created_on'] = $accountCreatedAt;
382
 
383
+ } else {
384
+ if (!($user_exists_already)){
385
+ $this->writeToLog("User does not exist yet ***** - creating with account_created_on as [" . $accountCreatedAt . ']', 'order_users');
386
+ } else if ($existing_user) {
387
+ $this->writeToLog(http_build_query($existing_user), 'existing_users');
388
+ $themsg = "Existing user is PRESENT. His account_created_on is [" . $existing_user['account_created_on'] . "]. My accountCreatedAt is [" . $accountCreatedAt . "]";
389
+ $this->writeToLog($themsg, 'order_users');
390
+ }
391
 
392
+ if (!($user_exists_already) || ($existing_user && (strtotime($existing_user['account_created_on']) > strtotime($accountCreatedAt))) ){
393
+ $user_array['account_created_on'] = $accountCreatedAt;
394
+ }
395
+ }
396
+ }
397
+ if($accountUpdatedAt){
398
+ $user_array['last_logon_at'] = $accountUpdatedAt;
399
+ }
400
 
401
+ if ($this->logToFile()){
402
+ $this->writeToLog($user_record_id, 'order_users');
403
+ $this->writeToLog(http_build_query($user_array), 'order_users');
404
+ }
405
+ try{
406
+ if ($this->sendBulkUpload()){
407
+ $this->writeBulkUploadFile(array($user_record_id => $user_array), 'orders_users', $timestamp);
408
+ } else {
409
+ $this->getRetentionScienceApiClient()->update_user($user_record_id, $user_array);
410
+ }
411
+ } catch (Exception $e){
412
+ // do nothing
413
+ }
414
+ }
415
 
416
+ $total_price = $order->getBaseSubtotal();
417
+ $total_price = number_format($total_price, 2, '.', '');
418
+ $discount_amount = $order->getBaseDiscountAmount();
419
+ $shipping_amount = $order->getShippingAmount();
420
+ $tax_amount = $order->getBaseTaxAmount();
421
+ $date = $order->getCreatedAt();
422
+ $ordered_at = date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(strtotime($date)));
423
+ $payment_method = $order->getPayment()->getMethodInstance()->getTitle();
424
+ $order_array = array(
425
+ 'user_record_id' => $user_record_id,
426
+ 'total_price' => $total_price,
427
+ 'discount_amount' => $discount_amount,
428
+ 'shipping_amount' => $shipping_amount,
429
+ 'tax_amount' => $tax_amount,
430
+ 'ordered_at' => $ordered_at,
431
+ 'payment_method' => $payment_method,
432
+ 'order_items'=> $order_item_array
433
+ );
434
+ if ($this->sendBulkUpload()){
435
+ $this->writeBulkUploadFile(array($order_record_id => $order_array), 'orders', $timestamp);
436
+ } else {
437
+ try {
438
+ $this->getRetentionScienceApiClient()->update_order($order_record_id, $order_array);
439
+ } catch (Exception $e){
440
+ // do nothing
441
+ }
442
+ }
443
 
444
+ // Update this as we iterate
445
+ $last_processed_order_record_id = $order_record_id;
446
+ // Release memory. Note: $order->clearInstance(); doesnt work on older magento ver
447
+ unset($order_array);
448
+ unset($order);
449
+ }
 
 
450
 
451
+ public function coreBlockAbstractPrepareLayoutAfter(Varien_Event_Observer $observer)
452
  {
453
  if (Mage::app()->getFrontController()->getAction()->getFullActionName() === 'adminhtml_dashboard_index')
454
  {
483
  return $rscore_json;
484
  }
485
 
486
+ public function syncData() {
487
+ if (Mage::getStoreConfig('waves/retentionscience_settings/enable') == 1) {
488
+ $phpbin = $this->getPhpBin();
489
+ $sync_data_script = escapeshellarg(dirname(__FILE__) . "/rs_sync_data.php");
490
 
491
+ $store_id = Mage::getStoreConfig('waves/retentionscience_settings/store_id');
492
+ $valid_store_ids = array_keys(Mage::app()->getStores());
493
 
494
+ if (in_array($store_id, $valid_store_ids)) {
495
+ exec("$phpbin $sync_data_script $store_id > /dev/null &");
496
+ } else {
497
+ Mage::getSingleton('core/session')->addError("You must select a valid Store ID!");
498
+ }
499
+ } else {
500
+ Mage::getSingleton('core/session')->addError("You can't sync data unless Retention Science is enabled!");
501
+ }
502
+ }
503
  }
app/code/community/RetentionScience/Waves/Model/Source/Categorytree.php CHANGED
@@ -34,24 +34,9 @@ class RetentionScience_Waves_Model_Source_Categorytree extends Mage_Eav_Model_En
34
  ->addAttributeToSelect('*')
35
  ;
36
  $categories->getSelect()->order("level asc");
37
-
38
- // $categories = Mage::getModel('catalog/category')->getCollection()
39
- //
40
- // ->addAttributeToSelect('name')
41
- // ->addAttributeToSelect('url_key')
42
- // ->addAttributeToSelect('my_attribute')
43
- // ->setLoadProductCount(true)
44
- // ->addAttributeToSort('parent_record_id', 'ASC')
45
- // ->addAttributeToSort('entity_id', 'ASC')
46
- // //->addAttributeToFilter('is_active',array('eq'=>true))
47
- // ->load();
48
  $this->_options['categories'] = $categories;
49
  }
50
- /**
51
- * Retrieve all options array
52
- *
53
- * @return array
54
- */
55
  public function getAllOptions()
56
  {
57
  if (!$this->_options) {
34
  ->addAttributeToSelect('*')
35
  ;
36
  $categories->getSelect()->order("level asc");
 
 
 
 
 
 
 
 
 
 
 
37
  $this->_options['categories'] = $categories;
38
  }
39
+
 
 
 
 
40
  public function getAllOptions()
41
  {
42
  if (!$this->_options) {
app/code/community/RetentionScience/Waves/Model/Source/Cronconfig.php CHANGED
@@ -1,33 +1,31 @@
1
  <?php
2
 
3
  class RetentionScience_Waves_Model_Source_Cronconfig extends Mage_Core_Model_Config_Data
4
- {
5
 
6
- protected function _afterSave()
7
- {
8
- // category, product, user, order
9
- $rs_cron_job = $this->getFieldConfig()->rs_cron_job;
10
-
11
- $cron_string_path = 'crontab/jobs/' . $rs_cron_job . '/schedule/cron_expr';
12
- $cron_model_path = 'crontab/jobs/' . $rs_cron_job . '/run/model';
13
-
14
- $cron_expr_string = $this->getValue();
15
 
16
 
17
- try {
18
- Mage::getModel('core/config_data')
19
- ->load($cron_string_path, 'path')
20
- ->setValue($cron_expr_string)
21
- ->setPath($cron_string_path)
22
- ->save();
23
- Mage::getModel('core/config_data')
24
- ->load($cron_model_path, 'path')
25
- ->setValue((string) Mage::getConfig()->getNode($cron_model_path))
26
- ->setPath($cron_model_path)
27
- ->save();
28
- } catch (Exception $e) {
29
- throw new Exception(Mage::helper('cron')->__('Unable to save the cron expression.'));
30
- }
31
- }
32
 
33
- }
1
  <?php
2
 
3
  class RetentionScience_Waves_Model_Source_Cronconfig extends Mage_Core_Model_Config_Data
4
+ {
5
 
6
+ protected function _afterSave()
7
+ {
8
+ // category, product, user, order
9
+ $rs_cron_job = $this->getFieldConfig()->rs_cron_job;
10
+ $cron_string_path = 'crontab/jobs/' . $rs_cron_job . '/schedule/cron_expr';
11
+ $cron_model_path = 'crontab/jobs/' . $rs_cron_job . '/run/model';
12
+ $cron_expr_string = $this->getValue();
 
 
13
 
14
 
15
+ try {
16
+ Mage::getModel('core/config_data')
17
+ ->load($cron_string_path, 'path')
18
+ ->setValue($cron_expr_string)
19
+ ->setPath($cron_string_path)
20
+ ->save();
21
+ Mage::getModel('core/config_data')
22
+ ->load($cron_model_path, 'path')
23
+ ->setValue((string) Mage::getConfig()->getNode($cron_model_path))
24
+ ->setPath($cron_model_path)
25
+ ->save();
26
+ } catch (Exception $e) {
27
+ throw new Exception(Mage::helper('cron')->__('Unable to save the cron expression.'));
28
+ }
29
+ }
30
 
31
+ }
app/code/community/RetentionScience/Waves/Model/Source/Rscoredata.php CHANGED
@@ -42,7 +42,6 @@ class RetentionScience_Waves_Model_Source_Rscoredata
42
 
43
  private function getEngagementRate()
44
  {
45
- // orders.select("distinct user_id").count.to_f/users.count.to_f
46
  $customer_table = $this->resource->getTableName('customer_entity');
47
  $order_table = $this->resource->getTableName('sales_flat_order');
48
  $query = "SELECT
42
 
43
  private function getEngagementRate()
44
  {
 
45
  $customer_table = $this->resource->getTableName('customer_entity');
46
  $order_table = $this->resource->getTableName('sales_flat_order');
47
  $query = "SELECT
app/code/community/RetentionScience/Waves/Model/retention_science_api.php CHANGED
@@ -10,195 +10,195 @@ Released under the GNU General Public License
10
  */
11
  class RetentionScienceApi {
12
  const API_DEV_URL = 'http://api.rsapi.dev';
13
- const API_TEST_URL = 'http://api.retentionsandbox.com';
14
- const API_URL = 'http://api.retentionscience.com';
15
- const API_PORT = 80;
16
- const API_VERSION = '1';
17
-
18
- private $password;
19
- private $time_out = 60;
20
- private $username;
21
- private $testmode;
22
-
23
- // class methods
24
- public function __construct($username = null, $password = null, $testmode=false) {
25
- if($username !== null) $this->set_username($username);
26
- if($password !== null) $this->set_password($password);
27
- if($testmode) $this->set_testmode($testmode);
28
- }
29
-
30
- private function perform_call($url, $params = array(), $authenticate = false, $use_post = true) {
31
- // redefine
32
- $url = (string) $url;
33
- $aParameters = (array) $params;
34
- $authenticate = (bool) $authenticate;
35
- $use_post = (bool) $use_post;
36
-
37
- // build url
38
- $request_url = parse_url('http://' . $_SERVER['HTTP_HOST']);
39
 
40
- if ($request_url['host'] == 'rsapi.dev' || $request_url['host'] == 'magento.dev') {
41
- $url = self::API_DEV_URL .'/' . $url;
42
- } elseif ($this->get_testmode()) {
43
- $url = self::API_TEST_URL .'/' . $url;
44
- } else {
45
- $url = self::API_URL .'/' . $url;
46
- }
47
 
48
- // validate needed authentication
49
- if($authenticate && ($this->get_username() == '' || $this->get_password() == '')) {
50
- throw new RetentionScienceException('No username or password was set.');
51
- }
52
-
53
- // build GET URL if not using post
54
- if(!empty($params) && !$use_post){
55
- $url .= '?'. http_build_query( $params );
56
- }
57
-
58
- // set options
59
- $options[CURLOPT_URL] = $url;
60
- $options[CURLOPT_PORT] = self::API_PORT;
61
- $options[CURLOPT_USERAGENT] = $this->get_user_agent();
62
- // follow on only if allowed - 20120221
63
- if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')){
64
- $options[CURLOPT_FOLLOWLOCATION] = true;
65
- }
66
- $options[CURLOPT_RETURNTRANSFER] = true;
67
- $options[CURLOPT_TIMEOUT] = (int) $this->time_out;
68
-
69
- // HTTP basic auth
70
- if($authenticate) {
71
- $options[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
72
- $options[CURLOPT_USERPWD] = $this->get_username() .':'. $this->get_password();
73
- }
74
-
75
- // build post params if $use_post
76
- if(!empty($params) && $use_post) {
77
- $options[CURLOPT_POST] = true;
78
- $options[CURLOPT_POSTFIELDS] = $params;
79
- }
80
-
81
- // curl init
82
- $curl = curl_init();
83
- // set options
84
- curl_setopt_array($curl, $options);
85
- // execute
86
- $response = curl_exec($curl);
87
- $headers = curl_getinfo($curl);
88
- // fetch errors and status code
89
- $errorNumber = curl_errno($curl);
90
- $errorMessage = curl_error($curl);
91
- $http_status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
92
-
93
- if ($errorNumber != 0) {
94
- $response = 'cURL ERROR: [' . $errorNumber . "] " . $errorMessage;
95
- }
96
- // close
97
- curl_close($curl);
98
- return array('response_code' => $http_status_code,
99
- 'response' => $response);
100
- }
101
 
102
- private function handle_response($response){
103
- // decode the returned json
104
- if ($response['response_code'] == 200 || $response['response_code'] == 201 ){
105
- return $response['response'];
106
- } else {
107
- throw new RetentionScienceException($response['response_code'] . ' - ' . $response['response']);
108
- }
109
- }
110
-
111
-
112
- // Getters
113
- private function get_password(){
114
- return (string) $this->password;
115
- }
116
- private function get_user_agent(){
117
- return (string) 'Retention Science PHP API Client / v'. self::API_VERSION;
118
- }
119
- private function get_username(){
120
- return (string) $this->username;
121
- }
122
- private function get_testmode(){
123
- return (boolean) $this->testmode;
124
- }
125
-
126
- // Setters
127
- private function set_username($username){
128
- $this->username = (string) $username;
129
- }
130
- private function set_password($password){
131
- $this->password = (string) $password;
132
- }
133
- private function set_testmode($testmode){
134
- $this->testmode = (boolean) $testmode;
135
- }
136
-
137
- /* Users resource */
138
- public function user_exists($record_id) {
139
- $url = 'users/exists/' . $record_id;
140
- $response = $this->perform_call($url, array(), true, false);
141
- return ($this->handle_response($response) == 'true');
142
- }
143
-
144
- public function get_last_user_record_id() {
145
- $url = 'users/last_record_id';
146
- $response = $this->perform_call($url, array(), true, false);
147
- return $this->handle_response($response);
148
- }
149
 
150
- public function show_user($record_id) {
151
- $url = 'users/show/' . urlencode($record_id);
152
- $response = $this->perform_call($url, array(), true, false);
153
- return json_decode($this->handle_response($response), true);
154
- }
155
 
156
- /* Orders resource */
157
- public function get_last_order_record_id() {
158
- $url = 'orders/last_record_id';
159
- $response = $this->perform_call($url, array(), true, false);
160
- return $this->handle_response($response);
161
- }
162
 
163
- public function show_order($record_id) {
164
- $url = 'orders/show/' . urlencode($record_id);
165
- $response = $this->perform_call($url, array(), true, false);
166
- return json_decode($this->handle_response($response), true);
167
- }
168
-
169
- /* Items resource */
170
- public function show_item($record_id) {
171
- $url = 'items/show/' . urlencode($record_id);
172
- $response = $this->perform_call($url, array(), true, false);
173
- return json_decode($this->handle_response($response), true);
174
- }
175
-
176
- /* Categories resource */
177
- public function show_category($record_id) {
178
- $url = 'categories/show/' . urlencode($record_id);
179
- $response = $this->perform_call($url, array(), true, false);
180
- return json_decode($this->handle_response($response), true);
181
- }
182
 
183
- /* RScore resource */
184
- public function calculate_rscore($rscore_data_array) {
185
  $url = 'r_scores/calculate';
186
  $response = $this->perform_call($url, array('data' => json_encode($rscore_data_array)), false, true);
187
  return $this->handle_response($response);
188
- }
189
 
190
- /* Data Sync */
191
- public function sync_data($file_hash) {
192
- $url = 'bulk_import/import';
193
 
194
- $upload_files = array();
195
- foreach ($file_hash as $type => $file) {
196
- $upload_files[$type] = "@$file";
197
- }
198
 
199
- $response = $this->perform_call($url, $upload_files, true, true);
200
- return $this->handle_response($response);
201
- }
202
  }
203
 
204
 
10
  */
11
  class RetentionScienceApi {
12
  const API_DEV_URL = 'http://api.rsapi.dev';
13
+ const API_TEST_URL = 'http://api.retentionsandbox.com';
14
+ const API_URL = 'http://api.retentionscience.com';
15
+ const API_PORT = 80;
16
+ const API_VERSION = '1';
17
+
18
+ private $password;
19
+ private $time_out = 60;
20
+ private $username;
21
+ private $testmode;
22
+
23
+ // class methods
24
+ public function __construct($username = null, $password = null, $testmode=false) {
25
+ if($username !== null) $this->set_username($username);
26
+ if($password !== null) $this->set_password($password);
27
+ if($testmode) $this->set_testmode($testmode);
28
+ }
29
+
30
+ private function perform_call($url, $params = array(), $authenticate = false, $use_post = true) {
31
+ // redefine
32
+ $url = (string) $url;
33
+ $aParameters = (array) $params;
34
+ $authenticate = (bool) $authenticate;
35
+ $use_post = (bool) $use_post;
36
+
37
+ // build url
38
+ $request_url = parse_url('http://' . $_SERVER['HTTP_HOST']);
39
 
40
+ if ($request_url['host'] == 'rsapi.dev' || $request_url['host'] == 'magento.dev') {
41
+ $url = self::API_DEV_URL .'/' . $url;
42
+ } elseif ($this->get_testmode()) {
43
+ $url = self::API_TEST_URL .'/' . $url;
44
+ } else {
45
+ $url = self::API_URL .'/' . $url;
46
+ }
47
 
48
+ // validate needed authentication
49
+ if($authenticate && ($this->get_username() == '' || $this->get_password() == '')) {
50
+ throw new RetentionScienceException('No username or password was set.');
51
+ }
52
+
53
+ // build GET URL if not using post
54
+ if(!empty($params) && !$use_post){
55
+ $url .= '?'. http_build_query( $params );
56
+ }
57
+
58
+ // set options
59
+ $options[CURLOPT_URL] = $url;
60
+ $options[CURLOPT_PORT] = self::API_PORT;
61
+ $options[CURLOPT_USERAGENT] = $this->get_user_agent();
62
+ // follow on only if allowed - 20120221
63
+ if (ini_get('open_basedir') == '' && ini_get('safe_mode' == 'Off')){
64
+ $options[CURLOPT_FOLLOWLOCATION] = true;
65
+ }
66
+ $options[CURLOPT_RETURNTRANSFER] = true;
67
+ $options[CURLOPT_TIMEOUT] = (int) $this->time_out;
68
+
69
+ // HTTP basic auth
70
+ if($authenticate) {
71
+ $options[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
72
+ $options[CURLOPT_USERPWD] = $this->get_username() .':'. $this->get_password();
73
+ }
74
+
75
+ // build post params if $use_post
76
+ if(!empty($params) && $use_post) {
77
+ $options[CURLOPT_POST] = true;
78
+ $options[CURLOPT_POSTFIELDS] = $params;
79
+ }
80
+
81
+ // curl init
82
+ $curl = curl_init();
83
+ // set options
84
+ curl_setopt_array($curl, $options);
85
+ // execute
86
+ $response = curl_exec($curl);
87
+ $headers = curl_getinfo($curl);
88
+ // fetch errors and status code
89
+ $errorNumber = curl_errno($curl);
90
+ $errorMessage = curl_error($curl);
91
+ $http_status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
92
+
93
+ if ($errorNumber != 0) {
94
+ $response = 'cURL ERROR: [' . $errorNumber . "] " . $errorMessage;
95
+ }
96
+ // close
97
+ curl_close($curl);
98
+ return array('response_code' => $http_status_code,
99
+ 'response' => $response);
100
+ }
101
 
102
+ private function handle_response($response){
103
+ // decode the returned json
104
+ if ($response['response_code'] == 200 || $response['response_code'] == 201 ){
105
+ return $response['response'];
106
+ } else {
107
+ throw new RetentionScienceException($response['response_code'] . ' - ' . $response['response']);
108
+ }
109
+ }
110
+
111
+
112
+ // Getters
113
+ private function get_password(){
114
+ return (string) $this->password;
115
+ }
116
+ private function get_user_agent(){
117
+ return (string) 'Retention Science PHP API Client / v'. self::API_VERSION;
118
+ }
119
+ private function get_username(){
120
+ return (string) $this->username;
121
+ }
122
+ private function get_testmode(){
123
+ return (boolean) $this->testmode;
124
+ }
125
+
126
+ // Setters
127
+ private function set_username($username){
128
+ $this->username = (string) $username;
129
+ }
130
+ private function set_password($password){
131
+ $this->password = (string) $password;
132
+ }
133
+ private function set_testmode($testmode){
134
+ $this->testmode = (boolean) $testmode;
135
+ }
136
+
137
+ /* Users resource */
138
+ public function user_exists($record_id) {
139
+ $url = 'users/exists/' . $record_id;
140
+ $response = $this->perform_call($url, array(), true, false);
141
+ return ($this->handle_response($response) == 'true');
142
+ }
143
+
144
+ public function get_last_user_record_id() {
145
+ $url = 'users/last_record_id';
146
+ $response = $this->perform_call($url, array(), true, false);
147
+ return $this->handle_response($response);
148
+ }
149
 
150
+ public function show_user($record_id) {
151
+ $url = 'users/show/' . urlencode($record_id);
152
+ $response = $this->perform_call($url, array(), true, false);
153
+ return json_decode($this->handle_response($response), true);
154
+ }
155
 
156
+ /* Orders resource */
157
+ public function get_last_order_record_id() {
158
+ $url = 'orders/last_record_id';
159
+ $response = $this->perform_call($url, array(), true, false);
160
+ return $this->handle_response($response);
161
+ }
162
 
163
+ public function show_order($record_id) {
164
+ $url = 'orders/show/' . urlencode($record_id);
165
+ $response = $this->perform_call($url, array(), true, false);
166
+ return json_decode($this->handle_response($response), true);
167
+ }
168
+
169
+ /* Items resource */
170
+ public function show_item($record_id) {
171
+ $url = 'items/show/' . urlencode($record_id);
172
+ $response = $this->perform_call($url, array(), true, false);
173
+ return json_decode($this->handle_response($response), true);
174
+ }
175
+
176
+ /* Categories resource */
177
+ public function show_category($record_id) {
178
+ $url = 'categories/show/' . urlencode($record_id);
179
+ $response = $this->perform_call($url, array(), true, false);
180
+ return json_decode($this->handle_response($response), true);
181
+ }
182
 
183
+ /* RScore resource */
184
+ public function calculate_rscore($rscore_data_array) {
185
  $url = 'r_scores/calculate';
186
  $response = $this->perform_call($url, array('data' => json_encode($rscore_data_array)), false, true);
187
  return $this->handle_response($response);
188
+ }
189
 
190
+ /* Data Sync */
191
+ public function sync_data($file_hash) {
192
+ $url = 'bulk_import/import';
193
 
194
+ $upload_files = array();
195
+ foreach ($file_hash as $type => $file) {
196
+ $upload_files[$type] = "@$file";
197
+ }
198
 
199
+ $response = $this->perform_call($url, $upload_files, true, true);
200
+ return $this->handle_response($response);
201
+ }
202
  }
203
 
204
 
app/code/community/RetentionScience/Waves/Model/rs_get_save_config.php CHANGED
@@ -1,29 +1,28 @@
1
  <?php
 
 
 
2
  define('MAGENTO', realpath(dirname(__FILE__)));
3
  require_once MAGENTO . '/../../../../../../app/Mage.php';
4
- // require_once '/Users/--/Sites/magento/app/Mage.php';
5
- // require_once '/Applications/MAMP/htdocs/magento/app/Mage.php';
6
 
7
- //umask(0);
8
  $store_id = $argv[1];
9
  $get_save = $argv[2];
10
  $key = $argv[3];
11
 
12
  try {
13
- Mage::app()->setCurrentStore($store_id);
14
 
15
- $result = '';
16
- if ($get_save == 'GET'){
17
- $result = Mage::getStoreConfig($key);
18
- } else if ($get_save == 'SAVE'){
19
- $val = $argv[4];
20
-
21
- $result = Mage::getModel('core/config')->saveConfig($key, $val);
22
- }
23
- echo $result;
24
- die(0);
25
  } catch (Exception $e){
26
- Mage::logException($e);
27
- die(1);
28
  }
29
 
1
  <?php
2
+ // Get or Save a store config value
3
+ // This will make a new db connection so it's guaranteed not to result in connection-timeout
4
+
5
  define('MAGENTO', realpath(dirname(__FILE__)));
6
  require_once MAGENTO . '/../../../../../../app/Mage.php';
 
 
7
 
 
8
  $store_id = $argv[1];
9
  $get_save = $argv[2];
10
  $key = $argv[3];
11
 
12
  try {
13
+ Mage::app()->setCurrentStore($store_id);
14
 
15
+ $result = '';
16
+ if ($get_save == 'GET'){
17
+ $result = Mage::getStoreConfig($key);
18
+ echo $result;
19
+ } else if ($get_save == 'SAVE'){
20
+ $val = $argv[4];
21
+ $result = Mage::getModel('core/config')->saveConfig($key, $val);
22
+ }
23
+ die(0);
 
24
  } catch (Exception $e){
25
+ Mage::logException($e);
26
+ die(1);
27
  }
28
 
app/code/community/RetentionScience/Waves/Model/rs_send_categories.php CHANGED
@@ -1,28 +1,27 @@
1
  <?php
 
 
2
  define('MAGENTO', realpath(dirname(__FILE__)));
3
  require_once MAGENTO . '/../../../../../../app/Mage.php';
4
- // require_once '/Users/--/Sites/magento/app/Mage.php';
5
- // require_once '/Applications/MAMP/htdocs/magento/app/Mage.php';
6
 
7
- //umask(0);
8
  $store_id = $argv[1];
9
  $timestamp = $argv[2];
10
 
11
  try {
12
- Mage::app()->setCurrentStore($store_id);
13
- $observer = new RetentionScience_Waves_Model_Observer();
14
- $categorytree = Mage::getModel('waves/source_categorytree')->getAllOptions();
15
 
16
- foreach($categorytree as $category){
17
- $parentId = ($category->getParentId())?$category->getParentId():null;
18
- $categoryId = $category->getEntityId();
19
- $categoryName = $category->getName();
20
- $categoryDescription = $category->getDescripton();
21
- $category_array = array('name' => $categoryName, 'description' => $categoryDescription, 'parent_record_id' => $parentId);
22
- $observer->writeBulkUploadFile(array($categoryId => $category_array), 'categories', $timestamp);
23
- }
24
- die(0);
25
  } catch (Exception $e){
26
- Mage::logException($e);
27
- die(1);
28
  }
1
  <?php
2
+ // Generates all the categories in a separate PHP process for memory efficiency
3
+
4
  define('MAGENTO', realpath(dirname(__FILE__)));
5
  require_once MAGENTO . '/../../../../../../app/Mage.php';
 
 
6
 
 
7
  $store_id = $argv[1];
8
  $timestamp = $argv[2];
9
 
10
  try {
11
+ Mage::app()->setCurrentStore($store_id);
12
+ $observer = new RetentionScience_Waves_Model_Observer();
13
+ $categorytree = Mage::getModel('waves/source_categorytree')->getAllOptions();
14
 
15
+ foreach($categorytree as $category){
16
+ $parentId = ($category->getParentId())?$category->getParentId():null;
17
+ $categoryId = $category->getEntityId();
18
+ $categoryName = $category->getName();
19
+ $categoryDescription = $category->getDescripton();
20
+ $category_array = array('name' => $categoryName, 'description' => $categoryDescription, 'parent_record_id' => $parentId);
21
+ $observer->writeBulkUploadFile(array($categoryId => $category_array), 'categories', $timestamp);
22
+ }
23
+ die(0);
24
  } catch (Exception $e){
25
+ Mage::logException($e);
26
+ die(1);
27
  }
app/code/community/RetentionScience/Waves/Model/rs_send_orders.php CHANGED
@@ -1,44 +1,38 @@
1
  <?php
 
2
 
3
  define('MAGENTO', realpath(dirname(__FILE__)));
4
  require_once MAGENTO . '/../../../../../../app/Mage.php';
5
- // require_once '/Users/-/Sites/magento/app/Mage.php';
6
- // require_once '/Applications/MAMP/htdocs/magento/app/Mage.php';
7
 
8
-
9
- //umask(0);
10
  $store_id = $argv[1];
11
  $timestamp = $argv[2];
12
  $page_counter = $argv[3];
13
  $last_order_record_id = $argv[4];
14
 
15
- // Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
16
  Mage::app()->setCurrentStore($store_id);
17
 
18
 
19
- #echo "Running rs_send_orders.php with arguments $store_id $timestamp $page_counter $last_order_record_id \n";
20
 
21
  $observer = new RetentionScience_Waves_Model_Observer();
22
  $elements_per_page = $observer->elementsPerPage();
23
-
24
  $orderCollection = Mage::getModel('sales/order')->getCollection();
25
  $orderCollection->addAttributeToSelect('entity_id');
26
  if($last_order_record_id>0){
27
- $orderCollection->addFieldToFilter('entity_id', array('gt'=>$last_order_record_id));
28
  }
29
 
30
  $orderCollection->setPage($page_counter, $elements_per_page);
31
 
32
  try {
33
- foreach($orderCollection as $order){
34
- $observer->orderCallback(array('order_record_id' => $order->getEntityId(), 'timestamp' => $timestamp));
35
- }
36
- echo $observer->get_last_processed_order_record_id();
37
- die(0);
38
 
39
  } catch (Exception $e){
40
- Mage::logException($e);
41
- echo $observer->get_last_processed_order_record_id();
42
- die(1);
43
  }
44
 
1
  <?php
2
+ // Generates all the orders in a separate PHP process for memory efficiency
3
 
4
  define('MAGENTO', realpath(dirname(__FILE__)));
5
  require_once MAGENTO . '/../../../../../../app/Mage.php';
 
 
6
 
 
 
7
  $store_id = $argv[1];
8
  $timestamp = $argv[2];
9
  $page_counter = $argv[3];
10
  $last_order_record_id = $argv[4];
11
 
 
12
  Mage::app()->setCurrentStore($store_id);
13
 
14
 
 
15
 
16
  $observer = new RetentionScience_Waves_Model_Observer();
17
  $elements_per_page = $observer->elementsPerPage();
 
18
  $orderCollection = Mage::getModel('sales/order')->getCollection();
19
  $orderCollection->addAttributeToSelect('entity_id');
20
  if($last_order_record_id>0){
21
+ $orderCollection->addFieldToFilter('entity_id', array('gt'=>$last_order_record_id));
22
  }
23
 
24
  $orderCollection->setPage($page_counter, $elements_per_page);
25
 
26
  try {
27
+ foreach($orderCollection as $order){
28
+ $observer->orderCallback(array('order_record_id' => $order->getEntityId(), 'timestamp' => $timestamp));
29
+ }
30
+ echo $observer->get_last_processed_order_record_id();
31
+ die(0);
32
 
33
  } catch (Exception $e){
34
+ Mage::logException($e);
35
+ echo $observer->get_last_processed_order_record_id();
36
+ die(1);
37
  }
38
 
app/code/community/RetentionScience/Waves/Model/rs_send_products.php CHANGED
@@ -1,40 +1,32 @@
1
  <?php
 
2
 
3
  define('MAGENTO', dirname(__FILE__));
4
  require_once MAGENTO . '/../../../../../../app/Mage.php';
5
- // require_once '/Users/--/Sites/magento/app/Mage.php';
6
- // require_once '/Applications/MAMP/htdocs/magento/app/Mage.php';
7
-
8
- //umask(0);
9
-
10
 
11
  $store_id = $argv[1];
12
  $timestamp = $argv[2];
13
  $page_counter = $argv[3];
14
 
15
- // Mage_Core_Model_App::ADMIN_STORE_ID
16
  Mage::app()->setCurrentStore($store_id);
17
-
18
- // $msg = "Running rs_send_products.php with arguments $store_id $timestamp $page_counter \n";
19
-
20
  $observer = new RetentionScience_Waves_Model_Observer();
21
  $elements_per_page = $observer->elementsPerPage();
22
 
 
23
  $productCollection = Mage::getModel('catalog/product')->getCollection();
24
  $productCollection->addAttributeToSelect('entity_id')->addAttributeToSelect('*');
25
-
26
  $productCollection->setPage($page_counter, $elements_per_page);
27
 
28
  try {
29
- foreach($productCollection as $product){
30
- $observer->productCallback(array('product_id' => $product->getId(), 'timestamp' => $timestamp));
31
- }
32
- echo $observer->get_last_processed_product_entity_id();
33
- die(0);
34
 
35
  } catch (Exception $e){
36
- Mage::logException($e);
37
- echo $observer->get_last_processed_product_entity_id();
38
- die(1);
39
  }
40
 
1
  <?php
2
+ // Generates all the items in a separate PHP process for memory efficiency
3
 
4
  define('MAGENTO', dirname(__FILE__));
5
  require_once MAGENTO . '/../../../../../../app/Mage.php';
 
 
 
 
 
6
 
7
  $store_id = $argv[1];
8
  $timestamp = $argv[2];
9
  $page_counter = $argv[3];
10
 
 
11
  Mage::app()->setCurrentStore($store_id);
 
 
 
12
  $observer = new RetentionScience_Waves_Model_Observer();
13
  $elements_per_page = $observer->elementsPerPage();
14
 
15
+ // Retrieve products collection
16
  $productCollection = Mage::getModel('catalog/product')->getCollection();
17
  $productCollection->addAttributeToSelect('entity_id')->addAttributeToSelect('*');
 
18
  $productCollection->setPage($page_counter, $elements_per_page);
19
 
20
  try {
21
+ foreach($productCollection as $product){
22
+ $observer->productCallback(array('product_id' => $product->getId(), 'timestamp' => $timestamp));
23
+ }
24
+ echo $observer->get_last_processed_product_entity_id();
25
+ die(0);
26
 
27
  } catch (Exception $e){
28
+ Mage::logException($e);
29
+ echo $observer->get_last_processed_product_entity_id();
30
+ die(1);
31
  }
32
 
app/code/community/RetentionScience/Waves/Model/rs_send_users.php CHANGED
@@ -1,44 +1,37 @@
1
  <?php
 
2
 
3
  define('MAGENTO', realpath(dirname(__FILE__)));
4
  require_once MAGENTO . '/../../../../../../app/Mage.php';
5
- // require_once '/Users/-/Sites/magento/app/Mage.php';
6
- // require_once '/Applications/MAMP/htdocs/magento/app/Mage.php';
7
 
8
-
9
- //umask(0);
10
  $store_id = $argv[1];
11
  $timestamp = $argv[2];
12
  $page_counter = $argv[3];
13
  $last_user_record_id = $argv[4];
14
 
15
- // Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
16
  Mage::app()->setCurrentStore($store_id);
17
 
18
-
19
- #echo "Running rs_send_users.php with arguments $store_id $timestamp $page_counter $last_user_record_id \n";
20
-
21
  $observer = new RetentionScience_Waves_Model_Observer();
22
  $elements_per_page = $observer->elementsPerPage();
23
 
 
24
  $userCollection = Mage::getModel('customer/customer')->getCollection();
25
  $userCollection->addAttributeToSelect('entity_id');
26
  if($last_user_record_id>0){
27
- $userCollection->addFieldToFilter('entity_id', array('gt'=>$last_user_record_id));
28
  }
29
-
30
  $userCollection->setPage($page_counter, $elements_per_page);
31
 
32
  try {
33
- foreach($userCollection as $user){
34
- $observer->userCallback(array('user_record_id' => $user->getEntityId(), 'timestamp' => $timestamp));
35
- }
36
- echo $observer->get_last_processed_user_entity_id();
37
- die(0);
38
 
39
  } catch (Exception $e){
40
- Mage::logException($e);
41
- echo $observer->get_last_processed_user_entity_id();
42
- die(1);
43
  }
44
 
1
  <?php
2
+ // Generates all the users in a separate PHP process for memory efficiency
3
 
4
  define('MAGENTO', realpath(dirname(__FILE__)));
5
  require_once MAGENTO . '/../../../../../../app/Mage.php';
 
 
6
 
 
 
7
  $store_id = $argv[1];
8
  $timestamp = $argv[2];
9
  $page_counter = $argv[3];
10
  $last_user_record_id = $argv[4];
11
 
 
12
  Mage::app()->setCurrentStore($store_id);
13
 
 
 
 
14
  $observer = new RetentionScience_Waves_Model_Observer();
15
  $elements_per_page = $observer->elementsPerPage();
16
 
17
+ // Retrieves the user collection
18
  $userCollection = Mage::getModel('customer/customer')->getCollection();
19
  $userCollection->addAttributeToSelect('entity_id');
20
  if($last_user_record_id>0){
21
+ $userCollection->addFieldToFilter('entity_id', array('gt'=>$last_user_record_id));
22
  }
 
23
  $userCollection->setPage($page_counter, $elements_per_page);
24
 
25
  try {
26
+ foreach($userCollection as $user){
27
+ $observer->userCallback(array('user_record_id' => $user->getEntityId(), 'timestamp' => $timestamp));
28
+ }
29
+ echo $observer->get_last_processed_user_entity_id();
30
+ die(0);
31
 
32
  } catch (Exception $e){
33
+ Mage::logException($e);
34
+ echo $observer->get_last_processed_user_entity_id();
35
+ die(1);
36
  }
37
 
app/code/community/RetentionScience/Waves/Model/rs_sync_data.php CHANGED
@@ -1,9 +1,10 @@
1
  <?php
 
 
 
2
 
3
  define('MAGENTO', dirname(__FILE__));
4
  require_once MAGENTO . '/../../../../../../app/Mage.php';
5
- // require_once '/Applications/MAMP/htdocs/magento/app/Mage.php';
6
- // require_once '/Users/-/Sites/magento/app/Mage.php';
7
 
8
  $last_processed_order_record_id;
9
  $last_processed_user_entity_id;
@@ -15,177 +16,177 @@ $observer = new RetentionScience_Waves_Model_Observer();
15
  $phpBin = $observer->getPhpBin();
16
  $elementsPerPage = $observer->elementsPerPage();
17
 
18
- // Scripts
19
  $send_orders_script = escapeshellarg(dirname(__FILE__) . "/rs_send_orders.php");
20
  $send_products_script = escapeshellarg(dirname(__FILE__) . "/rs_send_products.php");
21
  $send_users_script = escapeshellarg(dirname(__FILE__) . "/rs_send_users.php");
22
  $rs_send_categories_script = escapeshellarg(dirname(__FILE__) . "/rs_send_categories.php");
23
  $get_save_config_script = escapeshellarg(dirname(__FILE__) . "/rs_get_save_config.php");
24
 
25
- // get / save Config
26
  function getStoreConfig($key) {
27
- global $phpBin;
28
- global $get_save_config_script;
29
- global $store_id;
30
- $output = array();
31
- $return_val = null;
32
- $cmd = "$phpBin $get_save_config_script $store_id GET '" . $key . "'";
33
- exec($cmd, $output, $return_val);
34
- return $output[0];
35
  }
36
 
37
  function saveStoreConfig($key, $val) {
38
- global $phpBin;
39
- global $get_save_config_script;
40
- global $store_id;
41
- $output = array();
42
- $return_val = null;
43
- $cmd = "$phpBin $get_save_config_script $store_id SAVE '" . $key . "' '" . $val . "'";
44
- exec($cmd, $output, $return_val);
45
- return $output[0];
46
  }
47
 
48
  $syncDataStatus = getStoreConfig('waves/rs_sync_settings/sync_data_status');
 
49
  if(stristr($syncDataStatus, "running")){
50
- // Already running
51
- die(1);
52
  }
53
 
54
  // Perform all counts up front, so we don't need to make any further MySQL connections in this script
55
  try {
56
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] Calculating counts at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
57
 
58
- // Count Orders
59
- $last_order_record_id = (int) getStoreConfig('waves/rs_sync_advanced/last_order_record_id');
60
- $orderCollection = Mage::getModel('sales/order')->getCollection();
61
- if($last_order_record_id>0){
62
- $orderCollection->addFieldToFilter('entity_id', array('gt' => $last_order_record_id));
63
- }
64
- $num_orders_to_send = $orderCollection->getSize(); // Don't use count()
65
 
66
- // Count Users
67
- $last_user_record_id = (int) getStoreConfig('waves/rs_sync_advanced/last_user_record_id');
68
- $userCollection = Mage::getModel('customer/customer')
69
- ->getCollection()
70
- ->addAttributeToSelect('name')
71
- ->addAttributeToSelect('*');
72
- if($last_user_record_id>0){
73
- $userCollection->addFieldToFilter('entity_id', array('gt' => $last_user_record_id));
74
- }
75
- $num_users_to_send = $userCollection->getSize(); // Don't use count()
76
 
77
- // Count Products
78
- $productCollection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*');
79
- $num_products_to_send = $productCollection->getSize();
80
 
81
 
82
  } catch(Exception $e) {
83
- Mage::logException($e);
84
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error performing counts at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
85
  }
86
 
87
  // Export Orders
88
  try{
89
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting orders - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
90
 
91
- # this will be updated as we iterate
92
- $last_processed_order_record_id = $last_order_record_id;
93
 
94
- $pages = ceil($num_orders_to_send / $elementsPerPage);
95
- $page_counter = 1;
96
 
97
- while($page_counter <= $pages){
98
- $cmd = "$phpBin $send_orders_script $store_id $timestamp $page_counter $last_order_record_id";
99
- $output = array();
100
- $return_val = null;
101
- exec($cmd, $output, $return_val);
102
- if ($return_val != 0){
103
- var_dump($output);
104
- throw new Exception('Send orders script returned with non-zero return code.');
105
- } else {
106
- $last_processed_order_record_id = $output[0];
107
- }
108
- $page_counter = $page_counter + 1;
109
- }
110
 
111
  } catch(Exception $e) {
112
- Mage::logException($e);
113
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on orders at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
114
  }
115
 
116
  // Export Users
117
  try {
118
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting users - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
119
 
120
 
121
- $pages = ceil($num_users_to_send / $elementsPerPage);
122
- $page_counter = 1;
123
 
124
- while($page_counter <= $pages){
125
- $cmd = "$phpBin $send_users_script $store_id $timestamp $page_counter $last_user_record_id";
126
- $output = array();
127
- $return_val = null;
128
- exec($cmd, $output, $return_val);
129
- if ($return_val != 0){
130
- var_dump($output);
131
- throw new Exception('Send users script returned with non-zero return code.');
132
- } else {
133
- $last_processed_user_record_id = $output[0];
134
- }
135
- $page_counter = $page_counter + 1;
136
- }
137
  } catch (Exception $e){
138
- Mage::logException($e);
139
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on users at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
140
  }
141
 
142
  // Export Products
143
  try{
144
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting products - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
145
 
146
- $pages = ceil($num_products_to_send / $elementsPerPage);
147
- $page_counter = 1;
148
 
149
- while($page_counter <= $pages){
150
- $cmd = "$phpBin $send_products_script $store_id $timestamp $page_counter";
151
- $output = array();
152
- $return_val = null;
153
- exec($cmd, $output, $return_val);
154
- if ($return_val != 0){
155
- var_dump($output);
156
- throw new Exception('Send products script returned with non-zero return code.');
157
- }
158
- $page_counter = $page_counter + 1;
159
- }
160
  } catch (Exception $e){
161
- Mage::logException($e);
162
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on products at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
163
  }
164
 
165
  // Export Categories
166
  try {
167
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting categories - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
168
 
169
- $output = array();
170
- $return_val = null;
171
- $cmd = "$phpBin $rs_send_categories_script $store_id $timestamp";
172
- exec($cmd, $output, $return_val);
173
- if ($return_val != 0){
174
- var_dump($output);
175
- throw new Exception('Send categories script returned with non-zero return code.');
176
- }
177
 
178
  } catch (Exception $e) {
179
- Mage::logException($e);
180
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on categories at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())) );
181
  }
182
 
183
- // Send to rsapi
184
  try {
185
- $observer->sendDataSyncFiles($timestamp);
186
  } catch (Exception $e) {
187
- Mage::logException($e);
188
- saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on upload at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())) );
189
  }
190
 
191
  // Update last exported IDs and status
1
  <?php
2
+ // Runs the sync which will generate all the different file types.
3
+ // Each is done in a separate PHP process for memory efficiency when dealing with extremely large data exports
4
+ // This is much faster and memory efficient than running via 1 single process
5
 
6
  define('MAGENTO', dirname(__FILE__));
7
  require_once MAGENTO . '/../../../../../../app/Mage.php';
 
 
8
 
9
  $last_processed_order_record_id;
10
  $last_processed_user_entity_id;
16
  $phpBin = $observer->getPhpBin();
17
  $elementsPerPage = $observer->elementsPerPage();
18
 
19
+ // Scripts to export data
20
  $send_orders_script = escapeshellarg(dirname(__FILE__) . "/rs_send_orders.php");
21
  $send_products_script = escapeshellarg(dirname(__FILE__) . "/rs_send_products.php");
22
  $send_users_script = escapeshellarg(dirname(__FILE__) . "/rs_send_users.php");
23
  $rs_send_categories_script = escapeshellarg(dirname(__FILE__) . "/rs_send_categories.php");
24
  $get_save_config_script = escapeshellarg(dirname(__FILE__) . "/rs_get_save_config.php");
25
 
26
+ // get / save functions to access the Magento config
27
  function getStoreConfig($key) {
28
+ global $phpBin;
29
+ global $get_save_config_script;
30
+ global $store_id;
31
+ $output = array();
32
+ $return_val = null;
33
+ $cmd = "$phpBin $get_save_config_script $store_id GET '" . $key . "'";
34
+ exec($cmd, $output, $return_val);
35
+ return $output[0];
36
  }
37
 
38
  function saveStoreConfig($key, $val) {
39
+ global $phpBin;
40
+ global $get_save_config_script;
41
+ global $store_id;
42
+ $output = array();
43
+ $return_val = null;
44
+ $cmd = "$phpBin $get_save_config_script $store_id SAVE '" . $key . "' '" . $val . "'";
45
+ exec($cmd, $output, $return_val);
46
+ return $output[0];
47
  }
48
 
49
  $syncDataStatus = getStoreConfig('waves/rs_sync_settings/sync_data_status');
50
+ // If it's already running, just exit
51
  if(stristr($syncDataStatus, "running")){
52
+ die(1);
 
53
  }
54
 
55
  // Perform all counts up front, so we don't need to make any further MySQL connections in this script
56
  try {
57
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] Calculating counts at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
58
 
59
+ // Count Orders
60
+ $last_order_record_id = (int) getStoreConfig('waves/rs_sync_advanced/last_order_record_id');
61
+ $orderCollection = Mage::getModel('sales/order')->getCollection();
62
+ if($last_order_record_id>0){
63
+ $orderCollection->addFieldToFilter('entity_id', array('gt' => $last_order_record_id));
64
+ }
65
+ $num_orders_to_send = $orderCollection->getSize(); // Don't use count()
66
 
67
+ // Count Users
68
+ $last_user_record_id = (int) getStoreConfig('waves/rs_sync_advanced/last_user_record_id');
69
+ $userCollection = Mage::getModel('customer/customer')
70
+ ->getCollection()
71
+ ->addAttributeToSelect('name')
72
+ ->addAttributeToSelect('*');
73
+ if($last_user_record_id>0){
74
+ $userCollection->addFieldToFilter('entity_id', array('gt' => $last_user_record_id));
75
+ }
76
+ $num_users_to_send = $userCollection->getSize(); // Don't use count()
77
 
78
+ // Count Products
79
+ $productCollection = Mage::getModel('catalog/product')->getCollection()->addAttributeToSelect('*');
80
+ $num_products_to_send = $productCollection->getSize();
81
 
82
 
83
  } catch(Exception $e) {
84
+ Mage::logException($e);
85
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error performing counts at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
86
  }
87
 
88
  // Export Orders
89
  try{
90
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting orders - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
91
 
92
+ // this will be updated as we iterate
93
+ $last_processed_order_record_id = $last_order_record_id;
94
 
95
+ $pages = ceil($num_orders_to_send / $elementsPerPage);
96
+ $page_counter = 1;
97
 
98
+ while($page_counter <= $pages){
99
+ $cmd = "$phpBin $send_orders_script $store_id $timestamp $page_counter $last_order_record_id";
100
+ $output = array();
101
+ $return_val = null;
102
+ exec($cmd, $output, $return_val);
103
+ if ($return_val != 0){
104
+ var_dump($output);
105
+ throw new Exception('Send orders script returned with non-zero return code.');
106
+ } else {
107
+ $last_processed_order_record_id = $output[0];
108
+ }
109
+ $page_counter = $page_counter + 1;
110
+ }
111
 
112
  } catch(Exception $e) {
113
+ Mage::logException($e);
114
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on orders at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
115
  }
116
 
117
  // Export Users
118
  try {
119
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting users - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
120
 
121
 
122
+ $pages = ceil($num_users_to_send / $elementsPerPage);
123
+ $page_counter = 1;
124
 
125
+ while($page_counter <= $pages){
126
+ $cmd = "$phpBin $send_users_script $store_id $timestamp $page_counter $last_user_record_id";
127
+ $output = array();
128
+ $return_val = null;
129
+ exec($cmd, $output, $return_val);
130
+ if ($return_val != 0){
131
+ var_dump($output);
132
+ throw new Exception('Send users script returned with non-zero return code.');
133
+ } else {
134
+ $last_processed_user_record_id = $output[0];
135
+ }
136
+ $page_counter = $page_counter + 1;
137
+ }
138
  } catch (Exception $e){
139
+ Mage::logException($e);
140
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on users at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
141
  }
142
 
143
  // Export Products
144
  try{
145
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting products - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
146
 
147
+ $pages = ceil($num_products_to_send / $elementsPerPage);
148
+ $page_counter = 1;
149
 
150
+ while($page_counter <= $pages){
151
+ $cmd = "$phpBin $send_products_script $store_id $timestamp $page_counter";
152
+ $output = array();
153
+ $return_val = null;
154
+ exec($cmd, $output, $return_val);
155
+ if ($return_val != 0){
156
+ var_dump($output);
157
+ throw new Exception('Send products script returned with non-zero return code.');
158
+ }
159
+ $page_counter = $page_counter + 1;
160
+ }
161
  } catch (Exception $e){
162
+ Mage::logException($e);
163
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on products at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
164
  }
165
 
166
  // Export Categories
167
  try {
168
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[running] exporting categories - last updated at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())));
169
 
170
+ $output = array();
171
+ $return_val = null;
172
+ $cmd = "$phpBin $rs_send_categories_script $store_id $timestamp";
173
+ exec($cmd, $output, $return_val);
174
+ if ($return_val != 0){
175
+ var_dump($output);
176
+ throw new Exception('Send categories script returned with non-zero return code.');
177
+ }
178
 
179
  } catch (Exception $e) {
180
+ Mage::logException($e);
181
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on categories at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())) );
182
  }
183
 
184
+ // Send to rs api
185
  try {
186
+ $observer->sendDataSyncFiles($timestamp);
187
  } catch (Exception $e) {
188
+ Mage::logException($e);
189
+ saveStoreConfig('waves/rs_sync_settings/sync_data_status', '[stopped] error on upload at: ' . date("Y-m-d H:i:s", Mage::getModel('core/date')->timestamp(time())) );
190
  }
191
 
192
  // Update last exported IDs and status
app/code/community/RetentionScience/Waves/controllers/AdminController.php CHANGED
@@ -1,15 +1,15 @@
1
  <?php
2
  class RetentionScience_Waves_AdminController extends Mage_Adminhtml_Controller_Action
3
  {
4
- public function updateRScoreAction() {
5
- $obj = new RetentionScience_Waves_Model_Observer();
6
- $rscore_json = $obj->updateRScore();
7
- die($rscore_json);
8
- }
9
 
10
- public function syncDataAction() {
11
- $obj = new RetentionScience_Waves_Model_Observer();
12
- $obj->syncData();
13
- $this->_redirectUrl(Mage::helper('adminhtml')->getUrl("adminhtml/system_config/edit/section/waves/"));
14
- }
15
  }
1
  <?php
2
  class RetentionScience_Waves_AdminController extends Mage_Adminhtml_Controller_Action
3
  {
4
+ public function updateRScoreAction() {
5
+ $obj = new RetentionScience_Waves_Model_Observer();
6
+ $rscore_json = $obj->updateRScore();
7
+ die($rscore_json);
8
+ }
9
 
10
+ public function syncDataAction() {
11
+ $obj = new RetentionScience_Waves_Model_Observer();
12
+ $obj->syncData();
13
+ $this->_redirectUrl(Mage::helper('adminhtml')->getUrl("adminhtml/system_config/edit/section/waves/"));
14
+ }
15
  }
app/code/community/RetentionScience/Waves/controllers/IndexController.php CHANGED
@@ -1,31 +1,31 @@
1
  <?php
2
  class RetentionScience_Waves_IndexController extends Mage_Core_Controller_Front_Action
3
  {
4
- public function scriptRunAction(){
5
- $status = Mage::getStoreConfig('waves/retentionscience_settings/enable');
6
- $siteID = Mage::getStoreConfig('waves/retentionscience_settings/site_id');
7
- if($status && $siteID){
8
 
9
- $result['siteID'] = $siteID;
10
- $result['customerId'] = "";
11
- if(Mage::getSingleton('customer/session')->isLoggedIn()){
12
- $customerId = Mage::getSingleton('customer/session')->getCustomerId();
13
- $result['customerId'] = $customerId;
14
- }
15
 
16
 
17
- $allItems = Mage::getModel('checkout/cart')->getQuote()->getAllItems();
18
- $items = array();
19
- $count = 0;
20
- foreach ($allItems as $item){
21
- $items[$count]['id'] = $item->getProductId();
22
- $items[$count]['name'] = $item->getName();
23
- $items[$count]['price'] = $item->getPrice();
24
- $count++;
25
- }
26
- $result['items'] = json_encode($items);
27
- echo json_encode($result);
28
- die();
29
- }
30
- }
31
  }
1
  <?php
2
  class RetentionScience_Waves_IndexController extends Mage_Core_Controller_Front_Action
3
  {
4
+ public function scriptRunAction(){
5
+ $status = Mage::getStoreConfig('waves/retentionscience_settings/enable');
6
+ $siteID = Mage::getStoreConfig('waves/retentionscience_settings/site_id');
7
+ if($status && $siteID){
8
 
9
+ $result['siteID'] = $siteID;
10
+ $result['customerId'] = "";
11
+ if(Mage::getSingleton('customer/session')->isLoggedIn()){
12
+ $customerId = Mage::getSingleton('customer/session')->getCustomerId();
13
+ $result['customerId'] = $customerId;
14
+ }
15
 
16
 
17
+ $allItems = Mage::getModel('checkout/cart')->getQuote()->getAllItems();
18
+ $items = array();
19
+ $count = 0;
20
+ foreach ($allItems as $item){
21
+ $items[$count]['id'] = $item->getProductId();
22
+ $items[$count]['name'] = $item->getName();
23
+ $items[$count]['price'] = $item->getPrice();
24
+ $count++;
25
+ }
26
+ $result['items'] = json_encode($items);
27
+ echo json_encode($result);
28
+ die();
29
+ }
30
+ }
31
  }
app/code/community/RetentionScience/Waves/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <RetentionScience_Waves>
5
- <version>2.1.7</version>
6
  </RetentionScience_Waves>
7
  </modules>
8
  <global>
@@ -72,7 +72,6 @@
72
  <rs_sync_advanced>
73
  <rs_php_bin>php</rs_php_bin>
74
  <rs_send_bulk_upload>1</rs_send_bulk_upload>
75
- <rs_bulk_use_exec>1</rs_bulk_use_exec>
76
  <last_user_record_id>0</last_user_record_id>
77
  <last_order_record_id>0</last_order_record_id>
78
  </rs_sync_advanced>
2
  <config>
3
  <modules>
4
  <RetentionScience_Waves>
5
+ <version>2.1.8</version>
6
  </RetentionScience_Waves>
7
  </modules>
8
  <global>
72
  <rs_sync_advanced>
73
  <rs_php_bin>php</rs_php_bin>
74
  <rs_send_bulk_upload>1</rs_send_bulk_upload>
 
75
  <last_user_record_id>0</last_user_record_id>
76
  <last_order_record_id>0</last_order_record_id>
77
  </rs_sync_advanced>
app/code/community/RetentionScience/Waves/etc/system.xml CHANGED
@@ -180,16 +180,6 @@
180
  <show_in_website>1</show_in_website>
181
  <show_in_store>1</show_in_store>
182
  </rs_use_bulk_compression>
183
-
184
- <rs_bulk_use_exec translate="label">
185
- <label>Use PHP exec() to save memory</label>
186
- <frontend_type>select</frontend_type>
187
- <source_model>adminhtml/system_config_source_yesno</source_model>
188
- <sort_order>98</sort_order>
189
- <show_in_default>1</show_in_default>
190
- <show_in_website>1</show_in_website>
191
- <show_in_store>1</show_in_store>
192
- </rs_bulk_use_exec>
193
 
194
  <last_user_record_id translate="label">
195
  <label>Last sync'd user record id</label>
180
  <show_in_website>1</show_in_website>
181
  <show_in_store>1</show_in_store>
182
  </rs_use_bulk_compression>
 
 
 
 
 
 
 
 
 
 
183
 
184
  <last_user_record_id translate="label">
185
  <label>Last sync'd user record id</label>
app/design/frontend/base/default/template/waves/waves.phtml CHANGED
@@ -1,12 +1,12 @@
1
  <?php
2
  $status = $this->isEnable();
3
- if($status && $this->getSiteid()){
4
- $loggedIn = $this->customerLoggedIn();
5
- $moduleName = $this->getRequest()->getModuleName();
6
- $controllerName = $this->getRequest()->getControllerName();
7
- $actionName = $this->getRequest()->getActionName();
8
 
9
- ?>
10
  <!-- lmca <?php echo $loggedIn ?> | <?php echo $moduleName ?> | <?php echo $controllerName ?> | <?php echo $actionName ?> -->
11
 
12
 
@@ -74,6 +74,6 @@ $status = $this->isEnable();
74
  <script type="text/javascript">
75
  setAjaxSendCartUrl('<?php echo Mage::getUrl('waves/index/scriptRun') ?>');
76
  </script>
77
- <?php }
78
- }
79
  ?>
1
  <?php
2
  $status = $this->isEnable();
3
+ if($status && $this->getSiteid()){
4
+ $loggedIn = $this->customerLoggedIn();
5
+ $moduleName = $this->getRequest()->getModuleName();
6
+ $controllerName = $this->getRequest()->getControllerName();
7
+ $actionName = $this->getRequest()->getActionName();
8
 
9
+ ?>
10
  <!-- lmca <?php echo $loggedIn ?> | <?php echo $moduleName ?> | <?php echo $controllerName ?> | <?php echo $actionName ?> -->
11
 
12
 
74
  <script type="text/javascript">
75
  setAjaxSendCartUrl('<?php echo Mage::getUrl('waves/index/scriptRun') ?>');
76
  </script>
77
+ <?php }
78
+ }
79
  ?>
js/RetentionScience/retention_science_wave.js CHANGED
@@ -1,38 +1,37 @@
1
  var rSciUrl = "";
2
  function setAjaxSendCartUrl(ajax_send_cart_url){
3
- rSciUrl = ajax_send_cart_url;
4
  }
5
 
6
  function retention_science_send_cart(){
7
- if(rSciUrl!=""){
8
- new Ajax.Request(rSciUrl, {
9
- onSuccess: function(transport) {
10
 
11
- var json = transport.responseText.evalJSON();
12
- siteID = json.siteID;
13
 
14
- rsci_init = function(){
15
- rsci_wave.set_site_id(siteID);
16
- rsci_wave.set_action('shopping_cart');
17
 
18
- if(json.customerId!=""){
19
- rsci_wave.set_user_id(json.customerId);
20
- }
21
 
22
- items = json.items.evalJSON();
23
- items.each(function(item){
24
- var data = {id:item.id, name:item.name, price:item.price };
25
- //var jsonItem = Object.toJSON(data);
26
- rsci_wave.add_item(data);
27
- });
28
- };
29
 
30
- (function() { var iBx = document.createElement('script'); iBx.type = 'text/javascript'; iBx.async =
31
- true; iBx.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'waves.retentionscience.com/w.js';
32
- (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(iBx); })();
33
 
34
- //rsci_init();
35
- }, method: "get"
36
- });
37
- }
38
  }
1
  var rSciUrl = "";
2
  function setAjaxSendCartUrl(ajax_send_cart_url){
3
+ rSciUrl = ajax_send_cart_url;
4
  }
5
 
6
  function retention_science_send_cart(){
7
+ if(rSciUrl!=""){
8
+ new Ajax.Request(rSciUrl, {
9
+ onSuccess: function(transport) {
10
 
11
+ var json = transport.responseText.evalJSON();
12
+ siteID = json.siteID;
13
 
14
+ rsci_init = function(){
15
+ rsci_wave.set_site_id(siteID);
16
+ rsci_wave.set_action('shopping_cart');
17
 
18
+ if(json.customerId!=""){
19
+ rsci_wave.set_user_id(json.customerId);
20
+ }
21
 
22
+ items = json.items.evalJSON();
23
+ items.each(function(item){
24
+ var data = {id:item.id, name:item.name, price:item.price };
25
+ rsci_wave.add_item(data);
26
+ });
27
+ };
 
28
 
29
+ (function() { var iBx = document.createElement('script'); iBx.type = 'text/javascript'; iBx.async =
30
+ true; iBx.src = ('https:' == document.location.protocol ? 'https://' : 'http://') + 'waves.retentionscience.com/w.js';
31
+ (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(iBx); })();
32
 
33
+ //rsci_init();
34
+ }, method: "get"
35
+ });
36
+ }
37
  }
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>RetentionScience_Waves</name>
4
- <version>2.1.7</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</license>
7
  <channel>community</channel>
@@ -16,11 +16,11 @@ We leverage big data analytics and machine learning to optimize retention strate
16
  Our technology enables your store to leverage massive social media, demographic, and behavioral datasets - powerful information sources to help you drive sales. &#xD;
17
  &#xD;
18
  Notes: This extension interfaces with Retention Science, and communicates through the Retention Science API. For more information, and to sign up for API access, please see http://retentionscience.com.</description>
19
- <notes>Render of buttons updated</notes>
20
  <authors><author><name>Retention Science</name><user>auto-converted</user><email>support@retentionscience.com</email></author></authors>
21
- <date>2013-04-04</date>
22
- <time>01:40:33</time>
23
- <contents><target name="magecommunity"><dir name="RetentionScience"><dir name="Waves"><dir name="Block"><dir name="Adminhtml"><file name="Rscore.php" hash="ddaa6fcc9b7c7448ca4546e28ded58f3"/><file name="Syncbutton.php" hash="7cd56fdacd5c9da7e126ab059f568ab2"/></dir><file name="Waves.php" hash="a2c0c64d0dbbb9d458f6d0a8ec854f75"/></dir><dir name="Helper"><file name="Data.php" hash="90490af254a670d4795b744c1ef4319e"/><file name="Storeselect.php" hash="dbfeb7a4e9e1f5c52fdbc2eac9370fcf"/></dir><dir name="Model"><dir name="Source"><dir name="Cron"><file name="Frequency.php" hash="027feb7796f79b7cf811c4236ad7b87a"/><file name="Hours.php" hash="0ab9157003d5e7efed402ed401a46134"/></dir><file name="Categorytree.php" hash="58ca152ea2a34c7992460ece01b12bd8"/><file name="Cronconfig.php" hash="d8ae966b08bad48e68618343f7a27569"/><file name="Rscoredata.php" hash="a60f52a76b6097cdc0fb64e7218939dc"/></dir><file name="Observer.php" hash="b237d553ea8d723cfe02ffed20c48945"/><file name="retention_science_api.php" hash="37f1fecd276c1e5290e94c2fa50e0931"/><file name="rs_get_save_config.php" hash="853c8dcea094437bfa4143c85727037b"/><file name="rs_send_categories.php" hash="ade0f294be0ac6bf064432716014a83a"/><file name="rs_send_orders.php" hash="f985a357e74fc7977fd74252a31f5a73"/><file name="rs_send_products.php" hash="365385b0245e30b50020c0810caa8f08"/><file name="rs_send_users.php" hash="78b93a344e67493dec5f76b0ce42a31e"/><file name="rs_sync_data.php" hash="81845fa42ad0d9cc2be6e5235c286e27"/></dir><dir name="controllers"><file name="AdminController.php" hash="69a9da4bcd7e607569bb73429dfc500a"/><file name="IndexController.php" hash="e59004d457861772704554903b90566f"/></dir><dir name="etc"><file name="adminhtml.xml" hash="1378650fdb7ecc596f9881d7eefca868"/><file name="config.xml" hash="a3799a73e48129f2beada3f694b163bc"/><file name="system.xml" hash="d5eaf4f8ac236c6f46109f5a9a8bac4c"/></dir></dir><file name=".DS_Store" hash="128e595394427daa0503e6d824d6b4ef"/></dir></target><target name="mageweb"><dir name="js"><dir name="RetentionScience"><file name="retention_science_wave.js" hash="2a2584125f96c48c061a6fed5d1e0653"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="waves.xml" hash="7f62bec7d87da48c0e554fc1cf3a9802"/></dir><dir name="template"><dir name="waves"><file name="waves.phtml" hash="344da482b414ab5722c4a8c29b9ec6de"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="waves"><file name="rscore.phtml" hash="4f6af3dd918b23a009bb559e12f23c05"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="RetentionScience_Waves.xml" hash="9dc27ff12e5834f576b22a72a60d02e7"/></dir></target></contents>
24
  <compatible/>
25
  <dependencies/>
26
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>RetentionScience_Waves</name>
4
+ <version>2.1.8</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.apache.org/licenses/LICENSE-2.0.html">Apache License 2.0</license>
7
  <channel>community</channel>
16
  Our technology enables your store to leverage massive social media, demographic, and behavioral datasets - powerful information sources to help you drive sales. &#xD;
17
  &#xD;
18
  Notes: This extension interfaces with Retention Science, and communicates through the Retention Science API. For more information, and to sign up for API access, please see http://retentionscience.com.</description>
19
+ <notes>Formatting updated</notes>
20
  <authors><author><name>Retention Science</name><user>auto-converted</user><email>support@retentionscience.com</email></author></authors>
21
+ <date>2013-06-09</date>
22
+ <time>06:16:47</time>
23
+ <contents><target name="magecommunity"><dir name="RetentionScience"><dir name="Waves"><dir name="Block"><dir name="Adminhtml"><file name="Rscore.php" hash="ddaa6fcc9b7c7448ca4546e28ded58f3"/><file name="Syncbutton.php" hash="f0e364d31e12bffd40a13e88bce3bc97"/></dir><file name="Waves.php" hash="e40dffc0ab52847e560182196a252291"/></dir><dir name="Helper"><file name="Data.php" hash="90490af254a670d4795b744c1ef4319e"/><file name="Storeselect.php" hash="dbfeb7a4e9e1f5c52fdbc2eac9370fcf"/></dir><dir name="Model"><dir name="Source"><dir name="Cron"><file name="Frequency.php" hash="027feb7796f79b7cf811c4236ad7b87a"/><file name="Hours.php" hash="0ab9157003d5e7efed402ed401a46134"/></dir><file name="Categorytree.php" hash="8911fb34a76fed31b9e20a6a9fea0712"/><file name="Cronconfig.php" hash="f2dd3dcd572bd7407663576e250f9d23"/><file name="Rscoredata.php" hash="178f70a1f05415c86b6c5e959fb2fe50"/></dir><file name="Observer.php" hash="bdf08ae6ff20ba85878ca8e368cd9c1a"/><file name="retention_science_api.php" hash="d9d5197492408502cf6084f19def5aa0"/><file name="rs_get_save_config.php" hash="9ff13acecc3cc89066e1476ee48459fb"/><file name="rs_send_categories.php" hash="1633b1c1b01a9c3666c0687586693102"/><file name="rs_send_orders.php" hash="1b4f0260e74fbe11436af16238ecd61b"/><file name="rs_send_products.php" hash="c54656d728ad1c91185be35dd27f86d2"/><file name="rs_send_users.php" hash="0e27f4293d666c35e90ebb852ae83fb7"/><file name="rs_sync_data.php" hash="5b7ed9f5e50e26b343cae9578bf053bd"/></dir><dir name="controllers"><file name="AdminController.php" hash="25905c7233adde08763a74d8792e722f"/><file name="IndexController.php" hash="281b3223e4b71858ec0b43739bcdf97d"/></dir><dir name="etc"><file name="adminhtml.xml" hash="1378650fdb7ecc596f9881d7eefca868"/><file name="config.xml" hash="2928a41064b3a8a3b084306c054d73c2"/><file name="system.xml" hash="b2d00b02e576c1ee4049951577d74610"/></dir></dir><file name=".DS_Store" hash="128e595394427daa0503e6d824d6b4ef"/></dir></target><target name="mageweb"><dir name="js"><dir name="RetentionScience"><file name="retention_science_wave.js" hash="10bb411288770c07290c693ac03700b6"/></dir></dir></target><target name="magedesign"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="waves.xml" hash="7f62bec7d87da48c0e554fc1cf3a9802"/></dir><dir name="template"><dir name="waves"><file name="waves.phtml" hash="c68251968b899428356f743a92b0ce9f"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="template"><dir name="waves"><file name="rscore.phtml" hash="4f6af3dd918b23a009bb559e12f23c05"/></dir></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="RetentionScience_Waves.xml" hash="9dc27ff12e5834f576b22a72a60d02e7"/></dir></target></contents>
24
  <compatible/>
25
  <dependencies/>
26
  </package>