iparcel_carthandoff - Version 1.5.0

Version Notes

Notes

Download this release

Release Info

Developer Bobby Burden
Extension iparcel_carthandoff
Version 1.5.0
Comparing to
See all releases


Code changes from version 1.4.2 to 1.5.0

app/code/community/Iparcel/All/Helper/Api.php CHANGED
@@ -74,7 +74,7 @@ class Iparcel_All_Helper_Api
74
 
75
  /**
76
  * Finds the value of attribute matching the extension's configuration
77
- *
78
  * @param Mage_Catalog_Model_Product $product
79
  * @param string $code Attribute code
80
  * @return string
@@ -747,7 +747,7 @@ class Iparcel_All_Helper_Api
747
  /**
748
  * Accepts a Magento quote or order, then returns an address formatted for
749
  * the API
750
- *
751
  * @param object $object Object to extract address information from
752
  * @param bool $request If provided, this shipping rate request is used
753
  * @return array Address information formatted for API requests
@@ -825,12 +825,12 @@ class Iparcel_All_Helper_Api
825
  // Find the price of the product
826
  $itemPrice = (float) $item->getCalculationPrice();
827
  // if no price and item has parent (is configurable)
828
- if (!$itemPrice && ($parent = $item->getParentItem())) {
829
  // get parent price
830
  $itemPrice = (float)$this->_getProductAttribute($parent->getProduct(), 'final_price') ?: (float)$this->_getProductAttribute($parent->getProduct(), 'price');
831
  }
832
  // if still no price
833
- if (!$itemPrice) {
834
  // get product price
835
  $itemPrice = (float)$this->_getProductAttribute($itemProduct, 'price');
836
  }
74
 
75
  /**
76
  * Finds the value of attribute matching the extension's configuration
77
+ *
78
  * @param Mage_Catalog_Model_Product $product
79
  * @param string $code Attribute code
80
  * @return string
747
  /**
748
  * Accepts a Magento quote or order, then returns an address formatted for
749
  * the API
750
+ *
751
  * @param object $object Object to extract address information from
752
  * @param bool $request If provided, this shipping rate request is used
753
  * @return array Address information formatted for API requests
825
  // Find the price of the product
826
  $itemPrice = (float) $item->getCalculationPrice();
827
  // if no price and item has parent (is configurable)
828
+ if (is_null($itemPrice) && ($parent = $item->getParentItem())) {
829
  // get parent price
830
  $itemPrice = (float)$this->_getProductAttribute($parent->getProduct(), 'final_price') ?: (float)$this->_getProductAttribute($parent->getProduct(), 'price');
831
  }
832
  // if still no price
833
+ if (is_null($itemPrice)) {
834
  // get product price
835
  $itemPrice = (float)$this->_getProductAttribute($itemProduct, 'price');
836
  }
app/code/community/Iparcel/All/Helper/Data.php CHANGED
@@ -101,7 +101,7 @@ class Iparcel_All_Helper_Data extends Mage_Core_Helper_Abstract
101
 
102
  if (is_null($carrier) || $carrier == false) {
103
  $method = $order->getShippingMethod();
104
- if (preg_match('/^iparcel.*/', $method)) {
105
  return true;
106
  }
107
  return false;
101
 
102
  if (is_null($carrier) || $carrier == false) {
103
  $method = $order->getShippingMethod();
104
+ if (preg_match('/^' . $iparcelCarrier->getCarrierCode() . '.*/', $method)) {
105
  return true;
106
  }
107
  return false;
app/code/community/Iparcel/All/Model/Carrier/Iparcel.php CHANGED
@@ -33,7 +33,7 @@ class Iparcel_All_Model_Carrier_Iparcel extends Iparcel_All_Model_Carrier_Abstra
33
  /** @var boolean $internationalOrder */
34
  $internationalOrder = Mage::helper('iparcel')->getIsInternational($request);
35
  if ($internationalOrder && Mage::getStoreConfig('carriers/iparcel/active')) {
36
- /** @var array $iparcel Tax & Duty totals */
37
  $iparcelTaxAndDuty = array();
38
  /** @var Mage_Shipping_Model_Rate_Result $result*/
39
  $result = Mage::getModel('shipping/rate_result');
33
  /** @var boolean $internationalOrder */
34
  $internationalOrder = Mage::helper('iparcel')->getIsInternational($request);
35
  if ($internationalOrder && Mage::getStoreConfig('carriers/iparcel/active')) {
36
+ /** @var array $iparcelTaxAndDuty Tax & Duty totals */
37
  $iparcelTaxAndDuty = array();
38
  /** @var Mage_Shipping_Model_Rate_Result $result*/
39
  $result = Mage::getModel('shipping/rate_result');
app/code/community/Iparcel/All/Model/Catalog/Product/Observer.php CHANGED
@@ -23,12 +23,19 @@ class Iparcel_All_Model_Catalog_Product_Observer
23
  */
24
  public function product_save($observer)
25
  {
26
- if ($this->_isEnabled()) {
27
- $product = $observer->getProduct();
28
- $productCollection = new Varien_Data_Collection();
29
- $productCollection->addItem($product);
30
- Mage::helper('iparcel/api')->submitCatalog($productCollection);
 
 
 
 
 
31
  }
 
 
32
  }
33
 
34
  /**
@@ -56,12 +63,19 @@ class Iparcel_All_Model_Catalog_Product_Observer
56
  */
57
  public function product_delete($observer)
58
  {
59
- if ($this->_isEnabled()) {
60
- $product = $observer->getProduct();
61
- $product->setIsDeleted(true);
62
- $productCollection = new Varien_Data_Collection();
63
- $productCollection->addItem($product);
64
- Mage::helper('iparcel/api')->submitCatalog($productCollection);
 
 
 
 
 
65
  }
 
 
66
  }
67
  }
23
  */
24
  public function product_save($observer)
25
  {
26
+ try {
27
+ if ($this->_isEnabled()) {
28
+ $product = $observer->getProduct();
29
+ $productCollection = new Varien_Data_Collection();
30
+ $productCollection->addItem($product);
31
+ Mage::helper('iparcel/api')->submitCatalog($productCollection);
32
+ }
33
+ } catch (Exception $e) {
34
+ Mage::log('Unable to sync SKU: ' . $product->getSku() . ' to i-parcel catalog.');
35
+ Mage::log($e->getMessage());
36
  }
37
+
38
+ return $this;
39
  }
40
 
41
  /**
63
  */
64
  public function product_delete($observer)
65
  {
66
+ try {
67
+ if ($this->_isEnabled()) {
68
+ $product = $observer->getProduct();
69
+ $product->setIsDeleted(true);
70
+ $productCollection = new Varien_Data_Collection();
71
+ $productCollection->addItem($product);
72
+ Mage::helper('iparcel/api')->submitCatalog($productCollection);
73
+ }
74
+ } catch (Exception $e) {
75
+ Mage::log('Unable to delete SKU: ' . $product->getSku() . ' from i-parcel catalog.');
76
+ Mage::log($e->getMessage());
77
  }
78
+
79
+ return $this;
80
  }
81
  }
app/code/community/Iparcel/All/Model/Observer.php CHANGED
@@ -41,6 +41,11 @@ class Iparcel_All_Model_Observer
41
  */
42
  public function shipment_save_after($observer)
43
  {
 
 
 
 
 
44
  // if autotrack is enabled then order can be tracked when shipped
45
  if (Mage::getStoreConfigFlag('carriers/iparcel/autotrack')) {
46
  // If we are splitting shipments, skip automatic submission.
@@ -109,6 +114,11 @@ class Iparcel_All_Model_Observer
109
  */
110
  public function order_place_after($observer)
111
  {
 
 
 
 
 
112
  /** @var Mage_Sales_Model_Order $order */
113
  $order = $observer->getOrder();
114
 
@@ -119,7 +129,7 @@ class Iparcel_All_Model_Observer
119
  if (!$order->getQuote()) {
120
  return;
121
  }
122
-
123
  $iparcelCarrierCode = Mage::getModel('iparcel/payment_iparcel')->getCode();
124
 
125
  // if it's i-parcel shipping method
41
  */
42
  public function shipment_save_after($observer)
43
  {
44
+ // Do not automatically trigger SubmitParcel with CartHandoff
45
+ if (Mage::helper('iparcel')->isCartHandoffInstalled()) {
46
+ return true;
47
+ }
48
+
49
  // if autotrack is enabled then order can be tracked when shipped
50
  if (Mage::getStoreConfigFlag('carriers/iparcel/autotrack')) {
51
  // If we are splitting shipments, skip automatic submission.
114
  */
115
  public function order_place_after($observer)
116
  {
117
+ // Do not automatically create shipments with CartHandoff
118
+ if (Mage::helper('iparcel')->isCartHandoffInstalled()) {
119
+ return true;
120
+ }
121
+
122
  /** @var Mage_Sales_Model_Order $order */
123
  $order = $observer->getOrder();
124
 
129
  if (!$order->getQuote()) {
130
  return;
131
  }
132
+
133
  $iparcelCarrierCode = Mage::getModel('iparcel/payment_iparcel')->getCode();
134
 
135
  // if it's i-parcel shipping method
app/code/community/Iparcel/All/controllers/Adminhtml/Iparcel/Sync/AjaxController.php CHANGED
@@ -9,51 +9,45 @@
9
  class Iparcel_All_Adminhtml_Iparcel_Sync_AjaxController extends Mage_Adminhtml_Controller_Action
10
  {
11
  /**
12
- * Response for init querry
13
  *
14
- * @return array
15
  */
16
- protected function _initResponse()
17
  {
18
  $step = Mage::getStoreConfig('catalog_mapping/upload/step');
19
- return array('count' => Mage::getModel('catalog/product')->getCollection()->getSize()-floor(Mage::getStoreConfig('catalog_mapping/upload/offset')/$step)*$step);
20
- }
 
 
 
 
21
 
22
- /**
23
- * Response for initCatalog querry
24
- *
25
- * @alias _initResponse
26
- * @return array
27
- */
28
- protected function _initCatalogResponse()
29
- {
30
- return $this->_initResponse();
31
- }
32
 
33
- /**
34
- * Response for initCheckitems querry
35
- *
36
- * @alias _initResponse
37
- * @return array
38
- */
39
- protected function _initCheckitemsResponse()
40
- {
41
- return $this->_initResponse();
42
  }
43
 
44
  /**
45
- * Response for uploadCatalog querry
46
  *
47
- * @param array $params
48
- * @return array
49
  */
50
- protected function _uploadCatalogResponse($params)
51
  {
 
 
52
  $page = $params['page'];
53
  $step = $params['step'];
54
 
55
  $offset = Mage::getStoreConfig('catalog_mapping/upload/offset');
56
- $page += floor($offset/$step);
57
 
58
  $productCollection = Mage::getModel('catalog/product')
59
  ->getCollection()
@@ -64,64 +58,22 @@ class Iparcel_All_Adminhtml_Iparcel_Sync_AjaxController extends Mage_Adminhtml_C
64
  $n = Mage::helper('iparcel/api')->submitCatalog($productCollection);
65
 
66
  if ($n != -1) {
67
- return array(
68
- 'page'=>$page,
69
- 'step'=>$step,
70
- 'uploaded'=>$n
71
- );
72
- } else {
73
- return array(
74
- 'error'=>'1'
75
- );
76
- }
77
- }
78
-
79
- /**
80
- * Response for _uploadCheckitems querry
81
- *
82
- * @param array $params
83
- * @return array
84
- */
85
- protected function _uploadCheckitemsResponse($params)
86
- {
87
- $page = $params['page'];
88
- $step = $params['step'];
89
-
90
- $productCollection = Mage::getModel('catalog/product')
91
- ->getCollection()
92
- ->setPageSize($step)
93
- ->setCurPage($page);
94
- /* var $productCollection Mage_Catalog_Model_Resource_Product_Collection */
95
-
96
- $n = Mage::helper('iparcel/api')->checkItems($productCollection);
97
-
98
- if ($n != -1) {
99
- return array(
100
  'page' => $page,
101
  'step' => $step,
102
  'uploaded' => $n
103
  );
104
  } else {
105
- return array(
106
  'error' => '1'
107
  );
108
  }
109
- }
110
 
111
- /**
112
- * Submit Catalog request json action
113
- */
114
- public function catalogJsonAction()
115
- {
116
- $params = $this->getRequest()->getParams();
117
- $params['type'] = '_'.$params['type'].'CatalogResponse';
118
- if (method_exists($this, $params['type'])) {
119
- $_response = $this->$params['type']($params);
120
- $this->getResponse()
121
- ->setHeader('Content-type', 'application/json', true)
122
- ->setBody(json_encode($_response));
123
- return;
124
- }
125
  }
126
 
127
  /**
@@ -132,29 +84,4 @@ class Iparcel_All_Adminhtml_Iparcel_Sync_AjaxController extends Mage_Adminhtml_C
132
  $this->loadLayout();
133
  $this->renderLayout();
134
  }
135
-
136
- /**
137
- * Check Items request json action
138
- */
139
- public function checkitemsJsonAction()
140
- {
141
- $params = $this->getRequest()->getParams();
142
- $params['type'] = '_'.$params['type'].'CheckItemsResponse';
143
- if (method_exists($this, $params['type'])) {
144
- $_response = $this->$params['type']($params);
145
- $this->getResponse()
146
- ->setHeader('Content-type', 'application/json', true)
147
- ->setBody(json_encode($_response));
148
- return;
149
- }
150
- }
151
-
152
- /**
153
- * Check Items request action
154
- */
155
- public function checkitemsAction()
156
- {
157
- $this->loadLayout();
158
- $this->renderLayout();
159
- }
160
  }
9
  class Iparcel_All_Adminhtml_Iparcel_Sync_AjaxController extends Mage_Adminhtml_Controller_Action
10
  {
11
  /**
12
+ * Response for init query
13
  *
14
+ * @return bool
15
  */
16
+ protected function catalogJsonInitAction()
17
  {
18
  $step = Mage::getStoreConfig('catalog_mapping/upload/step');
19
+ $count = Mage::getModel('catalog/product')
20
+ ->getCollection()
21
+ ->getSize()
22
+ - floor(Mage::getStoreConfig('catalog_mapping/upload/offset')
23
+ / $step
24
+ ) * $step;
25
 
26
+ $response = array(
27
+ 'count' => $count
28
+ );
 
 
 
 
 
 
 
29
 
30
+ $this->getResponse()
31
+ ->setHeader('Content-type', 'application/json', true)
32
+ ->setBody(json_encode($response));
33
+
34
+ return true;
 
 
 
 
35
  }
36
 
37
  /**
38
+ * Response for uploadCatalog query
39
  *
40
+ * @return bool
 
41
  */
42
+ protected function catalogJsonUploadAction()
43
  {
44
+ $params = $this->getRequest()->getParams();
45
+
46
  $page = $params['page'];
47
  $step = $params['step'];
48
 
49
  $offset = Mage::getStoreConfig('catalog_mapping/upload/offset');
50
+ $page += floor($offset / $step);
51
 
52
  $productCollection = Mage::getModel('catalog/product')
53
  ->getCollection()
58
  $n = Mage::helper('iparcel/api')->submitCatalog($productCollection);
59
 
60
  if ($n != -1) {
61
+ $response = array(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  'page' => $page,
63
  'step' => $step,
64
  'uploaded' => $n
65
  );
66
  } else {
67
+ $response = array(
68
  'error' => '1'
69
  );
70
  }
 
71
 
72
+ $this->getResponse()
73
+ ->setHeader('Content-type', 'application/json', true)
74
+ ->setBody(json_encode($response));
75
+
76
+ return true;
 
 
 
 
 
 
 
 
 
77
  }
78
 
79
  /**
84
  $this->loadLayout();
85
  $this->renderLayout();
86
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
  }
app/code/community/Iparcel/All/controllers/Adminhtml/Iparcel/SyncController.php DELETED
@@ -1,18 +0,0 @@
1
- <?php
2
- /**
3
- * Adminhtml i-parcel sync controller
4
- *
5
- * @category Iparcel
6
- * @package Iparcel_All
7
- * @author Bobby Burden <bburden@i-parcel.com>
8
- */
9
- class Iparcel_All_Adminhtml_Iparcel_SyncController extends Mage_Adminhtml_Controller_Action
10
- {
11
- public function salesruleAction()
12
- {
13
- $_salesRuleCollection = Mage::getResourceModel('salesrule/rule_collection');
14
- /* var $_salesRuleCollection Mage_SalesRule_Model_Resource_Rule_Collection */
15
- Mage::helper('iparcel/api')->salesRule($_salesRuleCollection);
16
- $this->_redirectReferer();
17
- }
18
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/community/Iparcel/All/controllers/AjaxController.php CHANGED
@@ -51,7 +51,9 @@ class Iparcel_All_AjaxController extends Mage_Core_Controller_Front_Action
51
  }
52
  }
53
 
54
- $sku = $child->getSku();
 
 
55
 
56
  } else {
57
  /**
51
  }
52
  }
53
 
54
+ if (is_null($child) == false) {
55
+ $sku = $child->getSku();
56
+ }
57
 
58
  } else {
59
  /**
app/code/community/Iparcel/All/sql/iparcel_setup/mysql4-upgrade-1.1.0-1.1.1.php CHANGED
@@ -16,10 +16,13 @@ $options = array(
16
  );
17
 
18
  foreach ($entities as $entity) {
19
- $installer->addAttribute($entity, 'base_iparcel_duty_amount', $options);
20
- $installer->addAttribute($entity, 'iparcel_duty_amount', $options);
21
- $installer->addAttribute($entity, 'base_iparcel_tax_amount', $options);
22
- $installer->addAttribute($entity, 'iparcel_tax_amount', $options);
 
 
 
23
  }
24
 
25
  $installer->endSetup();
16
  );
17
 
18
  foreach ($entities as $entity) {
19
+ $dutyCode = Mage::getModel('iparcel/payment_iparcel')->getDutyCode();
20
+ $taxCode = Mage::getModel('iparcel/payment_iparcel')->getTaxCode();
21
+
22
+ $installer->addAttribute($entity, 'base_' . $dutyCode . '_amount', $options);
23
+ $installer->addAttribute($entity, $dutyCode . '_amount', $options);
24
+ $installer->addAttribute($entity, 'base_' . $taxCode . '_amount', $options);
25
+ $installer->addAttribute($entity, $taxCode . '_amount', $options);
26
  }
27
 
28
  $installer->endSetup();
app/code/community/Iparcel/CartHandoff/.DS_Store ADDED
Binary file
app/code/community/Iparcel/CartHandoff/Helper/Api.php CHANGED
@@ -28,7 +28,11 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
28
  * @param string $returnUrl URL to use once the order is submitted.
29
  * @return mixed Transaction Number, in case of error, returns false
30
  */
31
- public function setCheckout(Mage_Sales_Model_Quote $quote, $cancelUrl = false, $returnUrl = false)
 
 
 
 
32
  {
33
  $customer = $quote->getCustomer();
34
  $billingAddress = null;
@@ -43,12 +47,19 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
43
  // customer.
44
  if ($quoteBillingAddress->getEmail() == null) {
45
  // Pull the default billing address from the customer
46
- $customerDefaultBilling = $helper->getDefaultAddress($customer, false);
 
 
 
47
  if (is_null($customerDefaultBilling)) {
48
  $billingAddress = null;
49
  $phoneNumber = null;
50
  } else {
51
- $billingAddress = $this->_buildAddress($customerDefaultBilling, false, $customer->getEmail());
 
 
 
 
52
  $phoneNumber = $customerDefaultBilling->getTelephone();
53
  }
54
  } else {
@@ -59,15 +70,26 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
59
 
60
  if ($quoteShippingAddress->getAddressId() == null) {
61
  // Pull the default shipping address from the customer
62
- $customerDefaultShipping = $helper->getDefaultAddress($customer, true);
 
 
 
63
  if (is_null($customerDefaultShipping)) {
64
  $shippingAddress = null;
65
  } else {
66
- $shippingAddress = $this->_buildAddress($customerDefaultShipping, true, $billingAddress['email']);
 
 
 
 
67
  }
68
  } else {
69
  // Set the address information from the quote shipping address
70
- $shippingAddress = $this->_buildAddress($quoteShippingAddress, true, $billingAddress['email']);
 
 
 
 
71
  }
72
 
73
  if ($cancelUrl == false) {
@@ -93,11 +115,14 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
93
  'page_currency' => $customerCurrency,
94
  'custom' => $quote->getStoreId(),
95
  'discount_amount_cart' => 0,
 
96
  'reference_number' => $quote->getId(),
97
  'return' => $returnUrl,
98
  'shopping_url' => Mage::getBaseUrl(),
99
  'cancel_return' => $cancelUrl,
100
- 'image_url' => Mage::getDesign()->getSkinUrl(Mage::getStoreConfig('design/header/logo_src')),
 
 
101
  'AddressInfo' => array(
102
  'Billing' => $billingAddress,
103
  'Shipping' => $shippingAddress
@@ -108,31 +133,44 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
108
  );
109
  $totals = $quote->getTotals();
110
 
111
- if(isset($totals['discount'])) {
112
- $request['discount_amount_cart'] = abs($totals['discount']->getValue());
113
- }
114
 
115
- if(isset($totals['ugiftcert'])) {
116
- $request['discount_amount_cart'] += abs($request['discount_amount_cart']) + abs($totals['ugiftcert']->getValue());
 
 
 
 
 
 
 
 
117
  }
118
 
 
 
 
 
 
119
  // Add items to request
120
  $quoteItems = $quote->getAllItems();
121
  $itemDetailsList = array();
122
  foreach($quoteItems as $item) {
123
- if ($item->getProductType() == Mage_Catalog_Model_Product_Type::TYPE_SIMPLE) {
124
- // If no price is attached to this item, load it from the parent item
125
- $price = $item->getPrice();
 
 
 
126
  $qty = $item->getTotalQty();
127
- if ($price == '0' || is_null($price)) {
128
- $parentItem = $item->getParentItem();
129
- if($parentItem) {
130
- $price = $parentItem->getPrice();
131
- $qty = $parentItem->getTotalQty();
132
- } else {
133
- $price = $item->getProduct()->getPrice();
134
- $qty = $item->getTotalQty();
135
- }
136
  }
137
 
138
  $itemDetails = array(
@@ -203,7 +241,14 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
203
 
204
  if ($createOrder) {
205
  try {
206
- $order = $this->_buildOrder($session->getQuote(), $response);
 
 
 
 
 
 
 
207
  } catch (Exception $e) {
208
  Mage::logException($e);
209
  $return = array (
@@ -266,13 +311,30 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
266
  * CheckItems call is used for the product -- no other changes are made.
267
  *
268
  * @param object $collection
 
 
 
 
269
  * @return object
270
  */
271
- public function checkItems($collection)
 
 
 
 
272
  {
273
  $singleProduct = false;
 
 
 
 
 
274
  $remove = true;
275
- if (in_array('Varien_Data_Collection', class_parents($collection)) == false) {
 
 
 
 
276
  $singleProduct = true;
277
  $collection = Mage::getModel('catalog/product')
278
  ->getCollection()
@@ -286,51 +348,101 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
286
  $cookie = Mage::getModel('core/cookie')->get('ipar_iparcelSession');
287
  $cookie = json_decode($cookie);
288
 
 
 
 
 
 
 
 
 
289
  // Get iparcel session ID
290
  $sessID = Mage::getModel('core/cookie')->get('ipar_sess_id');
291
 
292
  if (!isset($cookie->locale) || $cookie->locale == 'US') {
293
- return $collection;
 
 
 
 
 
 
 
294
  }
295
 
296
  // Pass the product collection into the CheckItems class to check the
297
  // previously cached results
298
  $checkItemsModel = Mage::getModel('ipcarthandoff/checkitems');
299
- $cache = $checkItemsModel->getCache($collection, $cookie->locale, $storeId);
 
 
 
 
300
 
301
  $eligibleSKUs = array();
302
  // If the cache count matches the collection, skip sending the request
303
  if (count($cache) != count($collection)) {
304
- $request = array(
305
- 'Key' => Mage::helper('iparcel')->getGuid(),
306
- 'ItemDetailsList' => $this->_prepareCollectionForCheckItems($collection),
307
- 'AddressInfo' => array(
308
- 'Billing' => array(),
309
- 'Shipping' => array(
310
- 'CountryCode' => $cookie->locale,
311
- 'PostalCode' => 'A1A1A1'
312
- ),
313
- ),
314
- 'CurrencyCode' => $cookie->currency,
315
- 'DDP' => true,
316
- 'Insurance' => false,
317
- 'SessionID' => $sessID,
318
- 'ServiceLevel' => 115
319
  );
320
 
321
- $response = $this->_restJSON($request, $this->_checkItems);
 
 
 
 
322
 
323
- Mage::getModel('iparcel/log')
324
- ->setController('CheckItems')
325
- ->setRequest(json_encode($request))
326
- ->setResponse($response)
327
- ->save();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
328
 
329
- $items = json_decode($response, true);
330
- $items = $items['ItemDetailsList'];
331
 
332
  // Cache response from the web service
333
- $checkItemsModel->cacheResponse($items, $collection, $cookie->locale, $storeId);
 
 
 
 
 
334
 
335
  // Load eligible SKUs into the array
336
  foreach ($items as $item) {
@@ -369,10 +481,21 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
369
  }
370
 
371
  if ($singleProduct) {
372
- return $collection->getFirstItem();
 
 
 
 
 
 
 
 
 
 
 
373
  }
374
 
375
- return $collection;
376
  }
377
 
378
  /**
@@ -604,7 +727,11 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
604
 
605
  // Create shipment with tracking number
606
  $order = Mage::getModel('sales/order')->loadByIncrementId($order->getIncrementId());
607
- $order->sendNewOrderEmail();
 
 
 
 
608
  $itemsToShip = array();
609
  foreach ($order->getAllItems() as $item) {
610
  $itemsToShip[$item->getItemId()] = $item->getQtyOrdered();
@@ -671,4 +798,69 @@ class Iparcel_CartHandoff_Helper_Api extends Iparcel_All_Helper_Api
671
 
672
  return $address;
673
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
674
  }
28
  * @param string $returnUrl URL to use once the order is submitted.
29
  * @return mixed Transaction Number, in case of error, returns false
30
  */
31
+ public function setCheckout(
32
+ Mage_Sales_Model_Quote $quote,
33
+ $cancelUrl = false,
34
+ $returnUrl = false
35
+ )
36
  {
37
  $customer = $quote->getCustomer();
38
  $billingAddress = null;
47
  // customer.
48
  if ($quoteBillingAddress->getEmail() == null) {
49
  // Pull the default billing address from the customer
50
+ $customerDefaultBilling = $helper->getDefaultAddress(
51
+ $customer,
52
+ false
53
+ );
54
  if (is_null($customerDefaultBilling)) {
55
  $billingAddress = null;
56
  $phoneNumber = null;
57
  } else {
58
+ $billingAddress = $this->_buildAddress(
59
+ $customerDefaultBilling,
60
+ false,
61
+ $customer->getEmail()
62
+ );
63
  $phoneNumber = $customerDefaultBilling->getTelephone();
64
  }
65
  } else {
70
 
71
  if ($quoteShippingAddress->getAddressId() == null) {
72
  // Pull the default shipping address from the customer
73
+ $customerDefaultShipping = $helper->getDefaultAddress(
74
+ $customer,
75
+ true
76
+ );
77
  if (is_null($customerDefaultShipping)) {
78
  $shippingAddress = null;
79
  } else {
80
+ $shippingAddress = $this->_buildAddress(
81
+ $customerDefaultShipping,
82
+ true,
83
+ $billingAddress['email']
84
+ );
85
  }
86
  } else {
87
  // Set the address information from the quote shipping address
88
+ $shippingAddress = $this->_buildAddress(
89
+ $quoteShippingAddress,
90
+ true,
91
+ $billingAddress['email']
92
+ );
93
  }
94
 
95
  if ($cancelUrl == false) {
115
  'page_currency' => $customerCurrency,
116
  'custom' => $quote->getStoreId(),
117
  'discount_amount_cart' => 0,
118
+ 'prepaidamount' => 0,
119
  'reference_number' => $quote->getId(),
120
  'return' => $returnUrl,
121
  'shopping_url' => Mage::getBaseUrl(),
122
  'cancel_return' => $cancelUrl,
123
+ 'image_url' => Mage::getDesign()->getSkinUrl(
124
+ Mage::getStoreConfig('design/header/logo_src')
125
+ ),
126
  'AddressInfo' => array(
127
  'Billing' => $billingAddress,
128
  'Shipping' => $shippingAddress
133
  );
134
  $totals = $quote->getTotals();
135
 
136
+ // Find prepaid amount for quote
137
+ $request['prepaidamount'] = $this->_findPrepaidAmount($quote);
 
138
 
139
+ // Calculate discount
140
+ $totalKeys = array(
141
+ 'subtotal', 'shipping', 'iparcel_tax', 'iparcel_duty', 'tax'
142
+ );
143
+
144
+ $total = 0;
145
+ foreach ($totalKeys as $key) {
146
+ if (array_key_exists($key, $totals) && is_object($totals[$key])) {
147
+ $total += $totals[$key]->getValue();
148
+ }
149
  }
150
 
151
+ $request['discount_amount_cart'] = round(
152
+ $total - $quote->getGrandTotal(),
153
+ 2
154
+ );
155
+
156
  // Add items to request
157
  $quoteItems = $quote->getAllItems();
158
  $itemDetailsList = array();
159
  foreach($quoteItems as $item) {
160
+ if ($this->_itemRequiresPricing($item)) {
161
+ /**
162
+ * If no price is attached to this item, load it from
163
+ * the parent item
164
+ */
165
+ $price = $item->getCalculationPrice();
166
  $qty = $item->getTotalQty();
167
+ $parentItem = $item->getParentItem();
168
+
169
+ if ($parentItem) {
170
+ $price = $parentItem->getCalculationPrice();
171
+ }
172
+ if (is_null($price)) {
173
+ $price = $item->getProduct()->getPrice();
 
 
174
  }
175
 
176
  $itemDetails = array(
241
 
242
  if ($createOrder) {
243
  try {
244
+ // Make sure the order doesn't exist before attempting
245
+ // to build a new order
246
+ $order = Mage::helper('ipcarthandoff')
247
+ ->loadOrderByTrackingNumber($response->trackingnumber);
248
+
249
+ if ($order == false) {
250
+ $order = $this->_buildOrder($session->getQuote(), $response);
251
+ }
252
  } catch (Exception $e) {
253
  Mage::logException($e);
254
  $return = array (
311
  * CheckItems call is used for the product -- no other changes are made.
312
  *
313
  * @param object $collection
314
+ * @param string $countryCode If set, use this Country Code
315
+ * instead of the user's cookie
316
+ * @param boolean $returnResponse If true, return the response
317
+ * from the API call
318
  * @return object
319
  */
320
+ public function checkItems(
321
+ $collection,
322
+ $countryCode = false,
323
+ $returnResponse = false
324
+ )
325
  {
326
  $singleProduct = false;
327
+
328
+ /**
329
+ * If $collection is a single product, create a collection of
330
+ * that single product to act on
331
+ */
332
  $remove = true;
333
+ $isCollection = in_array(
334
+ 'Varien_Data_Collection',
335
+ class_parents($collection)
336
+ );
337
+ if ($isCollection == false) {
338
  $singleProduct = true;
339
  $collection = Mage::getModel('catalog/product')
340
  ->getCollection()
348
  $cookie = Mage::getModel('core/cookie')->get('ipar_iparcelSession');
349
  $cookie = json_decode($cookie);
350
 
351
+ // If the cookie is empty, create an object to hold the locale/currency
352
+ if ($countryCode !== false) {
353
+ $cookie = (object) array(
354
+ 'locale' => $countryCode,
355
+ 'currency' => 'USD'
356
+ );
357
+ }
358
+
359
  // Get iparcel session ID
360
  $sessID = Mage::getModel('core/cookie')->get('ipar_sess_id');
361
 
362
  if (!isset($cookie->locale) || $cookie->locale == 'US') {
363
+ $return = $collection;
364
+ if ($returnResponse) {
365
+ $return = array(
366
+ 'collection' => $collection,
367
+ 'response' => null
368
+ );
369
+ }
370
+ return $return;
371
  }
372
 
373
  // Pass the product collection into the CheckItems class to check the
374
  // previously cached results
375
  $checkItemsModel = Mage::getModel('ipcarthandoff/checkitems');
376
+ $cache = $checkItemsModel->getCache(
377
+ $collection,
378
+ $cookie->locale,
379
+ $storeId
380
+ );
381
 
382
  $eligibleSKUs = array();
383
  // If the cache count matches the collection, skip sending the request
384
  if (count($cache) != count($collection)) {
385
+
386
+ // Prepare the ItemDetailsList
387
+ $itemDetailsCollection = $this->_prepareCollectionForCheckItems(
388
+ $collection
 
 
 
 
 
 
 
 
 
 
 
389
  );
390
 
391
+ // Split the ItemDetailsList into collections of products
392
+ $itemDetailsCollection = array_chunk(
393
+ $itemDetailsCollection,
394
+ $this->_getChunkSize()
395
+ );
396
 
397
+ $responses = array();
398
+ foreach ($itemDetailsCollection as $itemDetailsList) {
399
+ $request = array(
400
+ 'Key' => Mage::helper('iparcel')->getGuid(),
401
+ 'ItemDetailsList' => $itemDetailsList,
402
+ 'AddressInfo' => array(
403
+ 'Billing' => array(),
404
+ 'Shipping' => array(
405
+ 'CountryCode' => $cookie->locale,
406
+ 'PostalCode' => 'A1A1A1'
407
+ ),
408
+ ),
409
+ 'CurrencyCode' => $cookie->currency,
410
+ 'DDP' => true,
411
+ 'Insurance' => false,
412
+ 'SessionID' => $sessID,
413
+ 'ServiceLevel' => 115
414
+ );
415
+
416
+ $response = $this->_restJSON($request, $this->_checkItems);
417
+
418
+ Mage::getModel('iparcel/log')
419
+ ->setController('CheckItems')
420
+ ->setRequest(json_encode($request))
421
+ ->setResponse($response)
422
+ ->save();
423
+
424
+ $responses[] = json_decode($response, true);
425
+ }
426
+
427
+ // Build the $response from the separate responses.
428
+ $response = array_shift($responses);
429
+ foreach ($responses as $currentResponse) {
430
+ $response['ItemDetailsList'] = array_merge(
431
+ $response['ItemDetailsList'],
432
+ $currentResponse['ItemDetailsList']
433
+ );
434
+ }
435
 
436
+ // Build the $items from the response's ItemDetailsList
437
+ $items = $response['ItemDetailsList'];
438
 
439
  // Cache response from the web service
440
+ $checkItemsModel->cacheResponse(
441
+ $items,
442
+ $collection,
443
+ $cookie->locale,
444
+ $storeId
445
+ );
446
 
447
  // Load eligible SKUs into the array
448
  foreach ($items as $item) {
481
  }
482
 
483
  if ($singleProduct) {
484
+ $return = $collection->getFirstItem();
485
+ }
486
+
487
+ $return = $collection;
488
+
489
+ // If `$returnResponse` is enabled, include the response in
490
+ // the return value
491
+ if ($returnResponse) {
492
+ $return = array (
493
+ 'collection' => $return,
494
+ 'response' => $response
495
+ );
496
  }
497
 
498
+ return $return;
499
  }
500
 
501
  /**
727
 
728
  // Create shipment with tracking number
729
  $order = Mage::getModel('sales/order')->loadByIncrementId($order->getIncrementId());
730
+
731
+ if (Mage::getStoreConfig('payment/ipcarthandoff/send_new_order_emails') != 0) {
732
+ $order->sendNewOrderEmail();
733
+ }
734
+
735
  $itemsToShip = array();
736
  foreach ($order->getAllItems() as $item) {
737
  $itemsToShip[$item->getItemId()] = $item->getQtyOrdered();
798
 
799
  return $address;
800
  }
801
+
802
+ /**
803
+ * Determines if item requires pricing in API request
804
+ *
805
+ * @param $item
806
+ * @return bool
807
+ */
808
+ private function _itemRequiresPricing($item)
809
+ {
810
+ $type = $item->getProductType();
811
+ if ($type == Mage_Catalog_Model_Product_Type::TYPE_GROUPED
812
+ || $type == Mage_Catalog_Model_Product_Type::TYPE_SIMPLE
813
+ || $type == Mage_Catalog_Model_Product_Type::TYPE_BUNDLE
814
+ ) {
815
+ return true;
816
+ }
817
+ return false;
818
+ }
819
+
820
+ /**
821
+ * Finds the prepaid value of a quote.
822
+ *
823
+ * Because there is no baked-in prepayment methods in Magento
824
+ * (except Enterprise Gift Cards) This method has to do the work
825
+ * of supporting third-party prepayment methods
826
+ *
827
+ * @param Mage_Sales_Model_Quote $quote
828
+ * @return float
829
+ */
830
+ private function _findPrepaidAmount(Mage_Sales_Model_Quote $quote)
831
+ {
832
+ $prepaidAmount = 0.00;
833
+
834
+ // Support for AheadWorks_Storecredit
835
+ if (class_exists('AW_Storecredit_Helper_Data', false)) {
836
+ $awStorecreditHelper = Mage::helper('aw_storecredit');
837
+ if ($awStorecreditHelper
838
+ && $awStorecreditHelper->isModuleEnabled()
839
+ ) {
840
+ $awStorecreditTotals = Mage::helper('aw_storecredit/totals');
841
+ $creditCollection = $awStorecreditTotals
842
+ ->getQuoteStoreCredit($quote->getId());
843
+
844
+ foreach ($creditCollection as $credit) {
845
+ $prepaidAmount += $credit->getStorecreditAmount();
846
+ }
847
+ }
848
+ }
849
+
850
+ return $prepaidAmount;
851
+ }
852
+
853
+ /**
854
+ * Returns the chunk size configured for CheckItems API calls
855
+ *
856
+ * @return int
857
+ */
858
+ private function _getChunkSize()
859
+ {
860
+ $chunkSize = Mage::getStoreConfig(
861
+ 'iparcel/international_customer/checkitems_chunk_size'
862
+ );
863
+
864
+ return (int) $chunkSize;
865
+ }
866
  }
app/code/community/Iparcel/CartHandoff/Model/Observer.php CHANGED
@@ -41,4 +41,28 @@ class Iparcel_CartHandoff_Model_Observer
41
 
42
  return;
43
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
41
 
42
  return;
43
  }
44
+
45
+ /**
46
+ * Prevent PayPal checkout on UPS i-parcel CartHandoff orders
47
+ *
48
+ * @param Varien_Event_Observer
49
+ */
50
+ public function paypalPrepareLineItems(Varien_Event_Observer $observer)
51
+ {
52
+ $cart = $observer->getEvent()->getPaypalCart();
53
+ $shippingAddress = $cart->getSalesEntity()->getShippingAddress();
54
+ $totalAbstract = Mage::getModel('iparcel/quote_address_total_abstract');
55
+
56
+ if (!is_object($shippingAddress)) {
57
+ return true;
58
+ }
59
+
60
+ if ($totalAbstract->isIparcelShipping($shippingAddress)) {
61
+ Mage::throwException(
62
+ 'UPS i-parcel orders cannot be paid with PayPal'
63
+ );
64
+ }
65
+
66
+ return true;
67
+ }
68
  }
app/code/community/Iparcel/CartHandoff/controllers/Adminhtml/Ipcarthandoff/Checkitems/CacheController.php CHANGED
@@ -14,10 +14,8 @@ class Iparcel_CartHandoff_Adminhtml_Ipcarthandoff_Checkitems_CacheController ext
14
  public function clearAction()
15
  {
16
  $cache = Mage::getModel('ipcarthandoff/checkitems')
17
- ->getCollection()
18
- ->addFieldToFilter('id', array('gt' => 0))
19
- ->load();
20
-
21
  foreach($cache as $item) {
22
  $item->delete();
23
  }
14
  public function clearAction()
15
  {
16
  $cache = Mage::getModel('ipcarthandoff/checkitems')
17
+ ->getCollection();
18
+
 
 
19
  foreach($cache as $item) {
20
  $item->delete();
21
  }
app/code/community/Iparcel/CartHandoff/controllers/HandoffController.php CHANGED
@@ -168,7 +168,6 @@ class Iparcel_CartHandoff_HandoffController extends Mage_Core_Controller_Front_A
168
  || $this->_quote->getPayment()->getMethod() != 'ipcarthandoff'
169
  ) {
170
  $this->_session->addError("Invalid quote for Cart Handoff review.");
171
- $this->_cancelPayment($transactionId);
172
  $this->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
173
  return;
174
  }
168
  || $this->_quote->getPayment()->getMethod() != 'ipcarthandoff'
169
  ) {
170
  $this->_session->addError("Invalid quote for Cart Handoff review.");
 
171
  $this->getResponse()->setRedirect(Mage::getUrl('checkout/cart'));
172
  return;
173
  }
app/code/community/Iparcel/CartHandoff/etc/config.xml CHANGED
@@ -2,7 +2,7 @@
2
  <config>
3
  <modules>
4
  <Iparcel_CartHandoff>
5
- <version>1.4.2</version>
6
  </Iparcel_CartHandoff>
7
  </modules>
8
  <global>
@@ -28,7 +28,6 @@
28
  <rewrite>
29
  <product_type_price>Iparcel_CartHandoff_Model_Catalog_Product_Type_Price</product_type_price>
30
  <product_type_configurable_price>Iparcel_CartHandoff_Model_Catalog_Product_Type_Configurable_Price</product_type_configurable_price>
31
- <product_type_grouped_price>Iparcel_CartHandoff_Model_Catalog_Product_Type_Grouped_Price</product_type_grouped_price>
32
  <layer>Iparcel_CartHandoff_Model_Catalog_Layer</layer>
33
  </rewrite>
34
  </catalog>
@@ -64,6 +63,15 @@
64
  </ipcarthandoff>
65
  </observers>
66
  </core_block_abstract_prepare_layout_after>
 
 
 
 
 
 
 
 
 
67
  </events>
68
  </global>
69
  <frontend>
@@ -123,6 +131,7 @@
123
  <checkitems>0</checkitems>
124
  <checkitems_price>0</checkitems_price>
125
  <checkitems_cache_lifetime>0</checkitems_cache_lifetime>
 
126
  </international_customer>
127
  </iparcel>
128
  </default>
2
  <config>
3
  <modules>
4
  <Iparcel_CartHandoff>
5
+ <version>1.5.0</version>
6
  </Iparcel_CartHandoff>
7
  </modules>
8
  <global>
28
  <rewrite>
29
  <product_type_price>Iparcel_CartHandoff_Model_Catalog_Product_Type_Price</product_type_price>
30
  <product_type_configurable_price>Iparcel_CartHandoff_Model_Catalog_Product_Type_Configurable_Price</product_type_configurable_price>
 
31
  <layer>Iparcel_CartHandoff_Model_Catalog_Layer</layer>
32
  </rewrite>
33
  </catalog>
63
  </ipcarthandoff>
64
  </observers>
65
  </core_block_abstract_prepare_layout_after>
66
+ <paypal_prepare_line_items>
67
+ <observers>
68
+ <ipcarthandoff>
69
+ <type>singleton</type>
70
+ <class>ipcarthandoff/observer</class>
71
+ <method>paypalPrepareLineItems</method>
72
+ </ipcarthandoff>
73
+ </observers>
74
+ </paypal_prepare_line_items>
75
  </events>
76
  </global>
77
  <frontend>
131
  <checkitems>0</checkitems>
132
  <checkitems_price>0</checkitems_price>
133
  <checkitems_cache_lifetime>0</checkitems_cache_lifetime>
134
+ <checkitems_chunk_size>100</checkitems_chunk_size>
135
  </international_customer>
136
  </iparcel>
137
  </default>
app/code/community/Iparcel/CartHandoff/etc/system.xml CHANGED
@@ -192,9 +192,17 @@
192
  <show_in_website>1</show_in_website>
193
  <show_in_store>1</show_in_store>
194
  </checkitems_clear_cache>
 
 
 
 
 
 
 
 
195
  </fields>
196
  </international_customer>
197
  </groups>
198
  </iparcel>
199
  </sections>
200
- </config>
192
  <show_in_website>1</show_in_website>
193
  <show_in_store>1</show_in_store>
194
  </checkitems_clear_cache>
195
+ <checkitems_chunk_size>
196
+ <label>Amount of products to send in a CheckItems request</label>
197
+ <frontend_type>text</frontend_type>
198
+ <sort_order>120</sort_order>
199
+ <show_in_default>1</show_in_default>
200
+ <show_in_website>1</show_in_website>
201
+ <show_in_store>1</show_in_store>
202
+ </checkitems_chunk_size>
203
  </fields>
204
  </international_customer>
205
  </groups>
206
  </iparcel>
207
  </sections>
208
+ </config>
app/design/adminhtml/default/default/layout/iparcel.xml CHANGED
@@ -35,17 +35,6 @@
35
  <block type="core/template" name="catalog.sync" template="iparcel/sync/ajax/catalog.phtml"/>
36
  </reference>
37
  </adminhtml_iparcel_sync_ajax_catalog>
38
- <adminhtml_iparcel_sync_ajax_checkitems>
39
- <reference name="head">
40
- <action method="addJs"><script>iparcel/jQuery.js</script></action>
41
- <action method="addJs"><script>iparcel/adminhtml/sync.js</script></action>
42
- <action method="addCss"><stylesheet>iparcel/ajaxSync.css</stylesheet></action>
43
- <action method="setTitle"><title>i-parcel Check Items</title></action>
44
- </reference>
45
- <reference name="content">
46
- <block type="core/template" name="checkitems.sync" template="iparcel/sync/ajax/checkitems.phtml" />
47
- </reference>
48
- </adminhtml_iparcel_sync_ajax_checkitems>
49
 
50
  <adminhtml_sales_order_view>
51
  <reference name="order_totals">
35
  <block type="core/template" name="catalog.sync" template="iparcel/sync/ajax/catalog.phtml"/>
36
  </reference>
37
  </adminhtml_iparcel_sync_ajax_catalog>
 
 
 
 
 
 
 
 
 
 
 
38
 
39
  <adminhtml_sales_order_view>
40
  <reference name="order_totals">
app/design/adminhtml/default/default/template/iparcel/sync/ajax/catalog.phtml CHANGED
@@ -5,6 +5,8 @@
5
  * @author Bobby Burden <bburden@i-parcel.com>
6
  * @class Mage_Core_Block_Template
7
  */
 
 
8
  ?>
9
  <div id="starting">
10
  <p>Starting catalog synchronization</p>
@@ -18,6 +20,6 @@
18
  </div>
19
  <script type="text/javascript">
20
  jQuery(document).ready(function() {
21
- var sync = new iparcelSync.sync('<?php echo Mage::helper('adminhtml')->getUrl('adminhtml/iparcel_sync_ajax/catalogJson') ?>', <?php echo Mage::getStoreConfig('catalog_mapping/upload/step'); ?>);
22
  })
23
  </script>
5
  * @author Bobby Burden <bburden@i-parcel.com>
6
  * @class Mage_Core_Block_Template
7
  */
8
+ $initUrl = Mage::helper('adminhtml')->getUrl('adminhtml/iparcel_sync_ajax/catalogJsonInit');
9
+ $uploadUrl = Mage::helper('adminhtml')->getUrl('adminhtml/iparcel_sync_ajax/catalogJsonUpload');
10
  ?>
11
  <div id="starting">
12
  <p>Starting catalog synchronization</p>
20
  </div>
21
  <script type="text/javascript">
22
  jQuery(document).ready(function() {
23
+ var sync = new iparcelSync.sync('<?php echo $initUrl ?>', '<?php echo $uploadUrl ?>', <?php echo Mage::getStoreConfig('catalog_mapping/upload/step'); ?>);
24
  })
25
  </script>
app/design/adminhtml/default/default/template/iparcel/sync/ajax/checkitems.phtml DELETED
@@ -1,21 +0,0 @@
1
- <?php
2
- /**
3
- * @category design
4
- * @package Iparcel_All
5
- * @author Bobby Burden <bburden@i-parcel.com>
6
- * @class Mage_Core_Block_Template
7
- */
8
- ?>
9
- <div id="starting">
10
- <p>Starting checking items</p>
11
- </div>
12
- <div id="sync">
13
- <p><span>0</span> items from <span>0</span> checked</p>
14
- </div>
15
- <div id="end">
16
- <p><span>0</span> items from <span>0</span> successfully checked</p>
17
- <p>There was <span>0</span> errors when checking items</p>
18
- </div>
19
- <script type="text/javascript">
20
- var sync = new iparcelSync.sync('<?php echo Mage::helper('adminhtml')->getUrl('adminhtml/iparcel_sync_ajax/checkitemsJson') ?>', 1);
21
- </script>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
js/iparcel/adminhtml/sync.js CHANGED
@@ -1,87 +1,86 @@
1
  /**
2
  * js lib for i-parcel's ajax sync
3
  *
4
- * @category Iparcel
5
- * @package Iparcel_All
6
- * @author Bobby Burden <bburden@i-parcel.com>
7
  */
8
  var iparcelSync = {
9
- item: null,
10
- sync: null,
11
- end: null,
12
 
13
- /**
14
- * Initialize sync ajax callback
15
- */
16
- init: function (data){
17
- iparcelSync.item.count = data.count;
18
- iparcelSync.sync.eq(1).text(iparcelSync.item.count);
19
- iparcelSync.end.eq(1).text(iparcelSync.item.count);
20
- jQuery('#starting').hide();
21
- jQuery('#sync').show();
22
- jQuery.get(iparcelSync.item.url,{
23
- page: ++iparcelSync.item.page,
24
- step: iparcelSync.item.step,
25
- type: 'upload'
26
- },iparcelSync.refresh);
27
- },
28
 
29
- /**
30
- * Refresh sync ajax callback
31
- */
32
- refresh: function(data){
33
- if (!data.error){
34
- iparcelSync.item.progress += data.uploaded;
35
- iparcelSync.item.errors += iparcelSync.item.step-data.uploaded;
36
- iparcelSync.sync.eq(0).text(iparcelSync.item.progress);
37
- iparcelSync.end.eq(0).text(iparcelSync.item.progress);
38
- }else{
39
- if (iparcelSync.item.page*iparcelSync.item.step > iparcelSync.item.count){
40
- iparcelSync.item.errors += iparcelSync.item.count - iparcelSync.item.progress;
41
- }else{
42
- iparcelSync.item.errors += iparcelSync.item.step;
43
- }
44
- }
45
- if (iparcelSync.item.progress+iparcelSync.item.errors < iparcelSync.item.count){
46
- jQuery.get(iparcelSync.item.url,{
47
- page: ++iparcelSync.item.page,
48
- step: iparcelSync.item.step,
49
- type: 'upload'
50
- },iparcelSync.refresh);
51
- }else{
52
- iparcelSync.finish();
53
- }
54
- },
55
 
56
- /**
57
- * Finish sync
58
- */
59
- finish: function(){
60
- iparcelSync.end.eq(2).text(iparcelSync.item.errors);
61
- jQuery('#sync').hide();
62
- jQuery('#end').show();
63
- },
64
 
65
- /**
66
- * Sync object
67
- */
68
- sync: function(url, step){
69
- this.url = url;
70
- this.step = step;
71
- this.progress = 0;
72
- this.errors = 0;
73
- this.count = 0;
74
- this.page = 0;
 
75
 
76
- iparcelSync.sync = jQuery('#sync span');
77
- iparcelSync.end = jQuery('#end span');
78
 
79
- this.run = function (){
80
- jQuery.get(this.url,{type: 'init'}, iparcelSync.init);
81
- }
82
 
83
- iparcelSync.item = this;
84
 
85
- this.run();
86
- }
87
  }
1
  /**
2
  * js lib for i-parcel's ajax sync
3
  *
4
+ * @category Iparcel
5
+ * @package Iparcel_All
6
+ * @author Bobby Burden <bburden@i-parcel.com>
7
  */
8
  var iparcelSync = {
9
+ item: null,
10
+ sync: null,
11
+ end: null,
12
 
13
+ /**
14
+ * Initialize sync ajax callback
15
+ */
16
+ init: function (data) {
17
+ iparcelSync.item.count = data.count;
18
+ iparcelSync.sync.eq(1).text(iparcelSync.item.count);
19
+ iparcelSync.end.eq(1).text(iparcelSync.item.count);
20
+ jQuery('#starting').hide();
21
+ jQuery('#sync').show();
22
+ jQuery.get(iparcelSync.item.uploadUrl, {
23
+ page: ++iparcelSync.item.page,
24
+ step: iparcelSync.item.step,
25
+ }, iparcelSync.refresh);
26
+ },
 
27
 
28
+ /**
29
+ * Refresh sync ajax callback
30
+ */
31
+ refresh: function (data) {
32
+ if (!data.error) {
33
+ iparcelSync.item.progress += data.uploaded;
34
+ iparcelSync.item.errors += iparcelSync.item.step - data.uploaded;
35
+ iparcelSync.sync.eq(0).text(iparcelSync.item.progress);
36
+ iparcelSync.end.eq(0).text(iparcelSync.item.progress);
37
+ } else {
38
+ if (iparcelSync.item.page * iparcelSync.item.step > iparcelSync.item.count) {
39
+ iparcelSync.item.errors += iparcelSync.item.count - iparcelSync.item.progress;
40
+ } else {
41
+ iparcelSync.item.errors += iparcelSync.item.step;
42
+ }
43
+ }
44
+ if (iparcelSync.item.progress + iparcelSync.item.errors < iparcelSync.item.count) {
45
+ jQuery.get(iparcelSync.item.uploadUrl, {
46
+ page: ++iparcelSync.item.page,
47
+ step: iparcelSync.item.step,
48
+ }, iparcelSync.refresh);
49
+ } else {
50
+ iparcelSync.finish();
51
+ }
52
+ },
 
53
 
54
+ /**
55
+ * Finish sync
56
+ */
57
+ finish: function () {
58
+ iparcelSync.end.eq(2).text(iparcelSync.item.errors);
59
+ jQuery('#sync').hide();
60
+ jQuery('#end').show();
61
+ },
62
 
63
+ /**
64
+ * Sync object
65
+ */
66
+ sync: function (initUrl, uploadUrl, step) {
67
+ this.initUrl = initUrl;
68
+ this.uploadUrl = uploadUrl;
69
+ this.step = step;
70
+ this.progress = 0;
71
+ this.errors = 0;
72
+ this.count = 0;
73
+ this.page = 0;
74
 
75
+ iparcelSync.sync = jQuery('#sync span');
76
+ iparcelSync.end = jQuery('#end span');
77
 
78
+ this.run = function () {
79
+ jQuery.get(this.initUrl, {type: 'init'}, iparcelSync.init);
80
+ }
81
 
82
+ iparcelSync.item = this;
83
 
84
+ this.run();
85
+ }
86
  }
js/iparcel/cart-buttons.js CHANGED
@@ -1,9 +1,5 @@
1
  document.observe("dom:loaded", function(){
2
- if (ipar_Session.locale != 'US') {
3
- setButtonVisibility('ipcarthandoff-button', 'block');
4
- setButtonVisibility('btn-proceed-checkout', 'none');
5
- setCheckoutMethodVisibility(false);
6
- }
7
 
8
  if ($('country')) {
9
  $('country').observe('change', function(){
@@ -20,6 +16,21 @@ document.observe("dom:loaded", function(){
20
  }
21
  });
22
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
23
  function setButtonVisibility(buttonClass, displayValue)
24
  {
25
  if (buttonClass == 'btn-proceed-checkout' && cartHandoff_hideCheckout == false) {
@@ -45,4 +56,4 @@ function setCheckoutMethodVisibility(visibility)
45
  $(li).style.display = '';
46
  }
47
  });
48
- }
1
  document.observe("dom:loaded", function(){
2
+ window.watchIparSession = setInterval(checkLocale, 500);
 
 
 
 
3
 
4
  if ($('country')) {
5
  $('country').observe('change', function(){
16
  }
17
  });
18
 
19
+ function checkLocale()
20
+ {
21
+ if (typeof ipar_Session == "undefined" || ipar_Session == null) {
22
+ return;
23
+ }
24
+
25
+ if (ipar_Session.locale != 'US') {
26
+ setButtonVisibility('ipcarthandoff-button', 'block');
27
+ setButtonVisibility('btn-proceed-checkout', 'none');
28
+ setCheckoutMethodVisibility(false);
29
+ }
30
+
31
+ clearInterval(window.watchIparSession);
32
+ }
33
+
34
  function setButtonVisibility(buttonClass, displayValue)
35
  {
36
  if (buttonClass == 'btn-proceed-checkout' && cartHandoff_hideCheckout == false) {
56
  $(li).style.display = '';
57
  }
58
  });
59
+ }
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>iparcel_carthandoff</name>
4
- <version>1.4.2</version>
5
  <stability>stable</stability>
6
  <license>GPL</license>
7
  <channel>community</channel>
@@ -16,9 +16,9 @@
16
  <email>bburden@i-parcel.com</email>
17
  </author>
18
  </authors>
19
- <date>2016-07-29</date>
20
- <time>20:16:18</time>
21
- <contents><target name="mageweb"><dir name="app"><dir name="etc"><dir name="modules"><file name="Iparcel_CartHandoff.xml" hash="ffb746b30fb5ff90dd7807211f6a4e9f"/><file name="Iparcel_All.xml" hash="89e4b47a6ac9aa0b82f70b1539d587ea"/></dir></dir><dir name="code"><dir name="community"><dir name="Iparcel"><dir name="CartHandoff"><dir name="Block"><dir name="Adminhtml"><dir name="Checkitems"><file name="Button.php" hash="996c59c0e070bfe0abcfbc75c33d9181"/></dir></dir><file name="Button.php" hash="f0973ed80adca37577c9183d543ffca6"/><file name="Estimate.php" hash="ed76666cb286b1bd36235c7aa23ab098"/><dir name="Form"><file name="Button.php" hash="15c90ba070756ebc2aec36546dd5854b"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Ipcarthandoff"><dir name="Checkitems"><file name="CacheController.php" hash="8d73c7c25b536538d4e5a1d603f34f12"/></dir></dir></dir><file name="HandoffController.php" hash="f4537926416afe1d689926475b83cce3"/><file name="StatusController.php" hash="511f645fec406059f956aa915c9138b4"/></dir><dir name="etc"><file name="adminhtml.xml" hash="e4f3a503dfa55aa0540b87d644cf0631"/><file name="config.xml" hash="6ca4bd354b7b40d51a0a513a06bef203"/><file name="system.xml" hash="460d426c8b8007051b50e3b9aaa1c3ff"/></dir><dir name="Helper"><file name="Api.php" hash="72679e7cbb51d23e47bc2cf007a71c40"/><file name="Data.php" hash="b7cca184d2968a2fcc9f7078afc60293"/></dir><dir name="Model"><dir name="Catalog"><file name="Layer.php" hash="b7410cb6b76bcf6282d0de45fcfd4214"/><dir name="Product"><dir name="Type"><dir name="Configurable"><file name="Price.php" hash="9757c4a3a06ab09e20f505b83197a864"/></dir><file name="Price.php" hash="0b5b030df7a614b880a07642d9166888"/></dir></dir></dir><file name="Checkitems.php" hash="b86446862f8eb0b48cda130dc8e4b83a"/><file name="Observer.php" hash="a9e5f4e690008acee3adbef357d1d60f"/><dir name="Payment"><file name="Ipcarthandoff.php" hash="80a584da0c50a446c552c1359a14aeab"/></dir><dir name="Resource"><dir name="Checkitems"><file name="Collection.php" hash="9a488c5a6c0b3d16f63817afd691ae80"/></dir><file name="Checkitems.php" hash="03ba687675e6eef24e6fed32c4767e55"/><dir name="Mysql4"><file name="Setup.php" hash="c7609fb203ba82fa7e1a39457f1edb3b"/></dir></dir><dir name="Sales"><file name="Order.php" hash="93008416ea3552d2adc0ed63016dc7b1"/></dir><dir name="System"><dir name="Config"><dir name="Source"><file name="Buttonplacement.php" hash="7f8a7cfd897ef5a12a082251eb397451"/><file name="Shippingaddress.php" hash="12630442dcf038ee8d7b7bf9b203b0eb"/><dir name="Checkitems"><file name="Cache.php" hash="ea4566851a70fee0473a283a7bfa0a2c"/></dir></dir></dir></dir></dir><dir name="sql"><dir name="ipcarthandoff_setup"><file name="mysql4-upgrade-1.2.0-1.3.0.php" hash="178b64c5cd9aded939a8973d4c0ac3e6"/></dir></dir></dir><dir name="All"><dir name="Block"><dir name="Adminhtml"><dir name="Catalog"><dir name="Mapping"><file name="Button.php" hash="dfdaf5a2fbf824a10fccc952fdccf567"/></dir></dir><dir name="Iparcel"><file name="Dashboard.php" hash="ec9dddd10368136f1bdfe79fddd4500c"/><file name="Logs.php" hash="5823bbc2a78666972dd02d5fd3e9d05d"/><dir name="Logs"><file name="Grid.php" hash="9c472c78640c8aecb5de4b638372e6f5"/></dir><dir name="Shipment"><dir name="Split"><file name="Form.php" hash="db44693b1eda47cb1d87b8a69ac9a5a0"/></dir><file name="Split.php" hash="4cb66f91987f842c699bd2d6c42f2249"/></dir></dir><dir name="System"><dir name="Config"><dir name="Form"><dir name="Field"><file name="Method.php" hash="935a3d4adad09d6c049cd6bb4cefb8db"/></dir></dir></dir></dir></dir><dir name="Catalog"><dir name="Product"><file name="List.php" hash="5de6102a56f4a9301f1b81004da39ef8"/></dir><file name="Product.php" hash="71a865c01574fd10ee0ffa7475cee378"/></dir><dir name="Catalogsearch"><dir name="Advanced"><file name="Result.php" hash="ad5a157444b80a284e0f9e7a91187b55"/></dir><file name="Result.php" hash="33e4ab0994bde9ba5dd87ade63869bee"/></dir><dir name="Html"><dir name="Head"><file name="Iparcel.php" hash="dd1737d041e9357269fa35b27dbef0bd"/><file name="Jquery.php" hash="3fd23960111c32d5696cc3de63e41b6e"/><file name="Post.php" hash="793d578cf82fb3ba83e1edc87b79ff95"/></dir></dir><dir name="Sales"><dir name="Order"><dir name="Totals"><file name="Abstract.php" hash="71cdfdce9a538b2f78b83b7b5eac8b19"/><file name="Duty.php" hash="2ca06e658c24b74d5e3dfa2a6950b010"/><file name="Tax.php" hash="7b630e60c6ff9340bedefdc84e99cef4"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Iparcel"><file name="LogController.php" hash="94e2095979140ad6d7c149080be30d38"/><file name="ShipmentController.php" hash="a9b8896d816b7612e1dc0638a2f8b740"/><file name="SyncController.php" hash="9378f5db27d059bbb36ff1e71bd38d32"/><dir name="Shipment"><file name="SplitController.php" hash="6a294947cf9399e42e90c890a6da2caa"/></dir><dir name="Sync"><file name="AjaxController.php" hash="4ded0f9d50382ca0137d4778176d7c88"/></dir></dir></dir><file name="AjaxController.php" hash="f6b0573eefbb21d7ac863fd029783b3c"/><file name="InfoController.php" hash="ab1bdf953dac27d87e9c5c8023ed9380"/><file name="InternationalController.php" hash="5250af3266389ddf0f5ea3a806652328"/></dir><dir name="etc"><file name="adminhtml.xml" hash="50bc0bee93b5612763321eae11cfdc51"/><file name="config.xml" hash="4bd33ca7a2dca415a545f524165ced48"/><file name="system.xml" hash="823d3690c187d8c3db42912d83a6303b"/></dir><dir name="Helper"><file name="Api.php" hash="4ab64cc17f7817268517f69486def609"/><file name="Data.php" hash="cababe5f5ba754a09df2aed6405643e7"/><file name="International.php" hash="7bba0cd23188eaa3f99ed3d32ffccd14"/></dir><dir name="Model"><dir name="Api"><file name="Quote.php" hash="2e938bda13d007e73f8c2238aff76fa1"/></dir><dir name="Carrier"><file name="Abstract.php" hash="87ebc5b402ea74709a00abcf2a8aa856"/><file name="Iparcel.php" hash="f0ea2e007c04f56befed34bc6676de80"/></dir><dir name="Catalog"><dir name="Product"><file name="Observer.php" hash="d16d89cea8eea6352a7d9b1193cd9512"/></dir></dir><dir name="Config"><dir name="Script"><file name="Js.php" hash="f29fc9a7535bc886b3ccf8b2e5b7ebfc"/></dir></dir><file name="Cron.php" hash="670d37cd6cdbe60aa69fad8eb0a0759e"/><file name="Log.php" hash="8c87e5f356f8ca77a186430dda106097"/><file name="Observer.php" hash="f6d8d758ed1772ab3c8fd782f2c95183"/><dir name="Order"><dir name="Creditmemo"><dir name="Total"><file name="Duty.php" hash="33b91a5b8fa32293bfe0eab4460b04f9"/><file name="Tax.php" hash="7cd4046231eb8cb9031ae160720390da"/></dir></dir><dir name="Invoice"><dir name="Total"><file name="Duty.php" hash="5a4010994ea502afe88632ddd2699c63"/><file name="Tax.php" hash="c4c95aaaae9662860dd635238150aa46"/></dir></dir></dir><dir name="Payment"><file name="Iparcel.php" hash="d7881d795edbbd7279888e3a86fff2c8"/></dir><dir name="Quote"><dir name="Address"><dir name="Total"><file name="Abstract.php" hash="c5f5a251d5cf9f6ddb5a6d92efad157b"/><file name="Collector.php" hash="f805c3fc373f931d912b92cf38a15154"/><file name="Duty.php" hash="41adb9e60a5a22e1e552eb12aa83f858"/><file name="Tax.php" hash="67bce5ef6a1ec130cebaaa3526b97112"/></dir></dir></dir><dir name="Resource"><dir name="Api"><file name="Quote.php" hash="84d032b89c5df67ef24a112ad7846302"/></dir><dir name="Log"><file name="Collection.php" hash="7cb78be07207a599eff71c1e18ba0b7a"/></dir><file name="Log.php" hash="d14c2eb8314456a18adadbb52856e0b5"/><dir name="Mysql4"><file name="Setup.php" hash="9f9cf4b5934b70bd00b394beacb245f7"/></dir></dir><dir name="System"><dir name="Config"><dir name="Catalog"><file name="Mapping.php" hash="3d44f4b4ee157333556f588d7d8cd25b"/></dir><dir name="Data"><dir name="Date"><file name="Monthday.php" hash="baec5b8a27c5b037529ba935aae0370a"/><file name="Weekday.php" hash="173edc075325d932f8dad6d4674b8153"/></dir><dir name="Time"><file name="Hour.php" hash="ddad98b85290d9b13ec9f65fbe8a10b3"/><file name="Minute.php" hash="4a76af0057d60e8ff0ff7fedc1d50575"/></dir></dir><file name="Guid.php" hash="311c7f8072f02a6be9e25b6411298c5c"/><dir name="Script"><file name="Js.php" hash="3e3f23b38ecdc361bf6ff6cee1871e92"/></dir><dir name="Source"><dir name="Catalog"><dir name="Mapping"><dir name="Configurable"><file name="Price.php" hash="f9116fd446914467e7fb31bed5a6dd0b"/></dir><file name="Mode.php" hash="36140a050ea65ff23d45264fa67e1a2b"/></dir><dir name="Product"><dir name="Attribute"><file name="Boolean.php" hash="ca1883122659f1b48890ecd46a1590ee"/></dir><file name="Attribute.php" hash="8ca9c929cda497400865751ffba991e6"/></dir></dir><dir name="Date"><file name="Weekday.php" hash="143c26f9661e5dc995ff064e333a2018"/></dir><dir name="Sales"><dir name="Order"><file name="Status.php" hash="f1e414c08c43ebb2fcc6ccf5b41a2ff2"/></dir></dir><dir name="Tax"><file name="Mode.php" hash="fb09f17b54ef8ffa22580741cc66ac14"/></dir></dir></dir></dir><dir name="Tax"><dir name="Quote"><file name="Shipping.php" hash="e4b0f82aaef3666be520bc2da28af098"/><file name="Subtotal.php" hash="6824b6e6e86dc423fd493a31b15aa28d"/><file name="Tax.php" hash="7ee0528db7b7f9e89cd00a0b0c74dda9"/></dir></dir></dir><dir name="sql"><dir name="iparcel_setup"><file name="mysql4-upgrade-1.0.0-1.1.0.php" hash="4df6e3a3f2adf96eeb6ccdac213e3f1e"/><file name="mysql4-upgrade-1.1.0-1.1.1.php" hash="cfb9fbc137e7e551dfaece00ac6bb2f4"/><file name="mysql4-upgrade-1.1.1-1.2.0.php" hash="1f04c5c71a6a79aaf74810e87670d998"/><file name="mysql4-upgrade-1.2.0-1.2.1.php" hash="de1c9caa713dd194595aa2dd15a829ac"/></dir></dir></dir></dir></dir></dir><dir name="design"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="ipcarthandoff.xml" hash="ed7faf180d54254f9bd4bfde21cdec1d"/><file name="iparcel.xml" hash="55aec816cb242fe44aab3a2e0d9de0ba"/><file name="iparcel.xml" hash="55aec816cb242fe44aab3a2e0d9de0ba"/></dir><dir name="template"><dir name="iparcel"><dir name="carthandoff"><file name="button.phtml" hash="4724ea247d4fb514373bd25290f8ee96"/><file name="estimate.phtml" hash="4613986760ea91bbfe607336008da870"/><dir name="form"><file name="button.phtml" hash="603683fdeb5153c8ce4649f72967180a"/></dir></dir><dir name="html"><dir name="head"><file name="iparcel.phtml" hash="07091c9914189cfef06af8cc6e41855c"/><file name="jquery.phtml" hash="c287cb0aa4ddd1f04f27cb5df605a27d"/><file name="post.phtml" hash="1a53e744668b250175ba275b4260050b"/><file name="iparcel.phtml" hash="07091c9914189cfef06af8cc6e41855c"/><file name="jquery.phtml" hash="c287cb0aa4ddd1f04f27cb5df605a27d"/><file name="post.phtml" hash="1a53e744668b250175ba275b4260050b"/></dir></dir><dir name="post"><file name="list.phtml" hash="20e5d7d7f82e1f8d951a1509921eb3bf"/><file name="list.phtml" hash="20e5d7d7f82e1f8d951a1509921eb3bf"/></dir><file name="post.phtml" hash="3827cab2dba981556aeb8ec915ab03cc"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="iparcel.xml" hash="c6be54da5875c9356bba8988fa8c264c"/></dir><dir name="template"><dir name="iparcel"><dir name="order"><dir name="totals"><file name="duty.phtml" hash="7af41c6d47dafeb890a520d8e6e39910"/><file name="tax.phtml" hash="25bffd2b58554cf28e5f4abe4b4e1e7c"/></dir></dir><dir name="sync"><dir name="ajax"><file name="catalog.phtml" hash="ee1ecd2cf9e8e175e5ca5ceddb197376"/><file name="checkitems.phtml" hash="b47b923ef7f433e41a9bc0d118401659"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="locale"><dir name="en_US"><file name="iparcel.csv" hash="cbcb75a490376ca0b63c8c66622c1656"/></dir></dir></dir><dir name="js"><dir name="iparcel"><file name="cart-buttons.js" hash="ee7d7c02f98b9cd4803d3934d987123a"/><file name="jQuery.js" hash="8ec1680e4d815ff93f661214efa06276"/><file name="lib.js" hash="42c556650eb62797de469f1770bde3f0"/><file name="post.js" hash="c710697e3d4905a6a707222728485047"/><file name="jQuery.js" hash="8ec1680e4d815ff93f661214efa06276"/><file name="lib.js" hash="42c556650eb62797de469f1770bde3f0"/><file name="post.js" hash="c710697e3d4905a6a707222728485047"/><file name="jQuery.js" hash="8ec1680e4d815ff93f661214efa06276"/><file name="lib.js" hash="42c556650eb62797de469f1770bde3f0"/><file name="post.js" hash="c710697e3d4905a6a707222728485047"/><dir name="adminhtml"><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f4525e5c6bce01f9a5cea562f23618e7"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f4525e5c6bce01f9a5cea562f23618e7"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f4525e5c6bce01f9a5cea562f23618e7"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f4525e5c6bce01f9a5cea562f23618e7"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f4525e5c6bce01f9a5cea562f23618e7"/></dir></dir></dir><dir name="skin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="iparcel"><file name="ajaxSync.css" hash="c622b9e4b77589bc0f3c0555124d2751"/></dir></dir></dir></dir></dir></target></contents>
22
  <compatible/>
23
  <dependencies>
24
  <required>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>iparcel_carthandoff</name>
4
+ <version>1.5.0</version>
5
  <stability>stable</stability>
6
  <license>GPL</license>
7
  <channel>community</channel>
16
  <email>bburden@i-parcel.com</email>
17
  </author>
18
  </authors>
19
+ <date>2016-08-29</date>
20
+ <time>17:46:49</time>
21
+ <contents><target name="mageweb"><dir name="app"><dir name="etc"><dir name="modules"><file name="Iparcel_CartHandoff.xml" hash="ffb746b30fb5ff90dd7807211f6a4e9f"/><file name="Iparcel_All.xml" hash="89e4b47a6ac9aa0b82f70b1539d587ea"/></dir></dir><dir name="code"><dir name="community"><dir name="Iparcel"><dir name="CartHandoff"><file name=".DS_Store" hash="dfb9481803d164ba9ec4e857204c243e"/><dir name="Block"><dir name="Adminhtml"><dir name="Checkitems"><file name="Button.php" hash="996c59c0e070bfe0abcfbc75c33d9181"/></dir></dir><file name="Button.php" hash="f0973ed80adca37577c9183d543ffca6"/><file name="Estimate.php" hash="ed76666cb286b1bd36235c7aa23ab098"/><dir name="Form"><file name="Button.php" hash="15c90ba070756ebc2aec36546dd5854b"/></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Ipcarthandoff"><dir name="Checkitems"><file name="CacheController.php" hash="dc682b48cd1d76cbe5431340ad15d10b"/></dir></dir></dir><file name="HandoffController.php" hash="e7d6991c2e76e1f5519b7376ce98e230"/><file name="StatusController.php" hash="511f645fec406059f956aa915c9138b4"/></dir><dir name="etc"><file name="adminhtml.xml" hash="e4f3a503dfa55aa0540b87d644cf0631"/><file name="config.xml" hash="4d4db1aa64e78ae8c6617fe6b90fbffc"/><file name="system.xml" hash="1100d55b1cff4f7aee9f9ecf31725cd0"/></dir><dir name="Helper"><file name="Api.php" hash="a7b84c5ebf077e460515f09e6695cee2"/><file name="Data.php" hash="b7cca184d2968a2fcc9f7078afc60293"/></dir><dir name="Model"><dir name="Catalog"><file name="Layer.php" hash="b7410cb6b76bcf6282d0de45fcfd4214"/><dir name="Product"><dir name="Type"><dir name="Configurable"><file name="Price.php" hash="9757c4a3a06ab09e20f505b83197a864"/></dir><file name="Price.php" hash="0b5b030df7a614b880a07642d9166888"/></dir></dir></dir><file name="Checkitems.php" hash="b86446862f8eb0b48cda130dc8e4b83a"/><file name="Observer.php" hash="f7ab4f37d2732fdd39fc8c0231b64910"/><dir name="Payment"><file name="Ipcarthandoff.php" hash="80a584da0c50a446c552c1359a14aeab"/></dir><dir name="Resource"><dir name="Checkitems"><file name="Collection.php" hash="9a488c5a6c0b3d16f63817afd691ae80"/></dir><file name="Checkitems.php" hash="03ba687675e6eef24e6fed32c4767e55"/><dir name="Mysql4"><file name="Setup.php" hash="c7609fb203ba82fa7e1a39457f1edb3b"/></dir></dir><dir name="Sales"><file name="Order.php" hash="93008416ea3552d2adc0ed63016dc7b1"/></dir><dir name="System"><dir name="Config"><dir name="Source"><file name="Buttonplacement.php" hash="7f8a7cfd897ef5a12a082251eb397451"/><file name="Shippingaddress.php" hash="12630442dcf038ee8d7b7bf9b203b0eb"/><dir name="Checkitems"><file name="Cache.php" hash="ea4566851a70fee0473a283a7bfa0a2c"/></dir></dir></dir></dir></dir><dir name="sql"><dir name="ipcarthandoff_setup"><file name="mysql4-upgrade-1.2.0-1.3.0.php" hash="178b64c5cd9aded939a8973d4c0ac3e6"/></dir></dir></dir><dir name="All"><dir name="Block"><dir name="Adminhtml"><dir name="Catalog"><dir name="Mapping"><file name="Button.php" hash="dfdaf5a2fbf824a10fccc952fdccf567"/></dir></dir><dir name="Iparcel"><file name="Dashboard.php" hash="ec9dddd10368136f1bdfe79fddd4500c"/><file name="Logs.php" hash="5823bbc2a78666972dd02d5fd3e9d05d"/><dir name="Logs"><file name="Grid.php" hash="9c472c78640c8aecb5de4b638372e6f5"/></dir><dir name="Shipment"><dir name="Split"><file name="Form.php" hash="db44693b1eda47cb1d87b8a69ac9a5a0"/></dir><file name="Split.php" hash="4cb66f91987f842c699bd2d6c42f2249"/></dir></dir><dir name="System"><dir name="Config"><dir name="Form"><dir name="Field"><file name="Method.php" hash="935a3d4adad09d6c049cd6bb4cefb8db"/></dir></dir></dir></dir></dir><dir name="Catalog"><dir name="Product"><file name="List.php" hash="5de6102a56f4a9301f1b81004da39ef8"/></dir><file name="Product.php" hash="71a865c01574fd10ee0ffa7475cee378"/></dir><dir name="Catalogsearch"><dir name="Advanced"><file name="Result.php" hash="ad5a157444b80a284e0f9e7a91187b55"/></dir><file name="Result.php" hash="33e4ab0994bde9ba5dd87ade63869bee"/></dir><dir name="Html"><dir name="Head"><file name="Iparcel.php" hash="dd1737d041e9357269fa35b27dbef0bd"/><file name="Jquery.php" hash="3fd23960111c32d5696cc3de63e41b6e"/><file name="Post.php" hash="793d578cf82fb3ba83e1edc87b79ff95"/></dir></dir><dir name="Sales"><dir name="Order"><dir name="Totals"><file name="Abstract.php" hash="71cdfdce9a538b2f78b83b7b5eac8b19"/><file name="Duty.php" hash="2ca06e658c24b74d5e3dfa2a6950b010"/><file name="Tax.php" hash="7b630e60c6ff9340bedefdc84e99cef4"/></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Iparcel"><file name="LogController.php" hash="94e2095979140ad6d7c149080be30d38"/><file name="ShipmentController.php" hash="a9b8896d816b7612e1dc0638a2f8b740"/><dir name="Shipment"><file name="SplitController.php" hash="6a294947cf9399e42e90c890a6da2caa"/></dir><dir name="Sync"><file name="AjaxController.php" hash="224df904979eb90a3f639a8f5c89787a"/></dir></dir></dir><file name="AjaxController.php" hash="9069724f071742b25c83b2d0cc368871"/><file name="InfoController.php" hash="ab1bdf953dac27d87e9c5c8023ed9380"/><file name="InternationalController.php" hash="5250af3266389ddf0f5ea3a806652328"/></dir><dir name="etc"><file name="adminhtml.xml" hash="50bc0bee93b5612763321eae11cfdc51"/><file name="config.xml" hash="4bd33ca7a2dca415a545f524165ced48"/><file name="system.xml" hash="823d3690c187d8c3db42912d83a6303b"/></dir><dir name="Helper"><file name="Api.php" hash="3d3dc72a52c948964c22e94c47356cfa"/><file name="Data.php" hash="2e4f16bb0a3f1fe1345b5d21df59dbae"/><file name="International.php" hash="7bba0cd23188eaa3f99ed3d32ffccd14"/></dir><dir name="Model"><dir name="Api"><file name="Quote.php" hash="2e938bda13d007e73f8c2238aff76fa1"/></dir><dir name="Carrier"><file name="Abstract.php" hash="87ebc5b402ea74709a00abcf2a8aa856"/><file name="Iparcel.php" hash="add977e3b85ae8c08914874f02a288b3"/></dir><dir name="Catalog"><dir name="Product"><file name="Observer.php" hash="2fd0ce66f180cb7d0dfbe752e5227636"/></dir></dir><dir name="Config"><dir name="Script"><file name="Js.php" hash="f29fc9a7535bc886b3ccf8b2e5b7ebfc"/></dir></dir><file name="Cron.php" hash="670d37cd6cdbe60aa69fad8eb0a0759e"/><file name="Log.php" hash="8c87e5f356f8ca77a186430dda106097"/><file name="Observer.php" hash="9d53f374789eaa0b13349843d3e2c7fd"/><dir name="Order"><dir name="Creditmemo"><dir name="Total"><file name="Duty.php" hash="33b91a5b8fa32293bfe0eab4460b04f9"/><file name="Tax.php" hash="7cd4046231eb8cb9031ae160720390da"/></dir></dir><dir name="Invoice"><dir name="Total"><file name="Duty.php" hash="5a4010994ea502afe88632ddd2699c63"/><file name="Tax.php" hash="c4c95aaaae9662860dd635238150aa46"/></dir></dir></dir><dir name="Payment"><file name="Iparcel.php" hash="d7881d795edbbd7279888e3a86fff2c8"/></dir><dir name="Quote"><dir name="Address"><dir name="Total"><file name="Abstract.php" hash="c5f5a251d5cf9f6ddb5a6d92efad157b"/><file name="Collector.php" hash="f805c3fc373f931d912b92cf38a15154"/><file name="Duty.php" hash="41adb9e60a5a22e1e552eb12aa83f858"/><file name="Tax.php" hash="67bce5ef6a1ec130cebaaa3526b97112"/></dir></dir></dir><dir name="Resource"><dir name="Api"><file name="Quote.php" hash="84d032b89c5df67ef24a112ad7846302"/></dir><dir name="Log"><file name="Collection.php" hash="7cb78be07207a599eff71c1e18ba0b7a"/></dir><file name="Log.php" hash="d14c2eb8314456a18adadbb52856e0b5"/><dir name="Mysql4"><file name="Setup.php" hash="9f9cf4b5934b70bd00b394beacb245f7"/></dir></dir><dir name="System"><dir name="Config"><dir name="Catalog"><file name="Mapping.php" hash="3d44f4b4ee157333556f588d7d8cd25b"/></dir><dir name="Data"><dir name="Date"><file name="Monthday.php" hash="baec5b8a27c5b037529ba935aae0370a"/><file name="Weekday.php" hash="173edc075325d932f8dad6d4674b8153"/></dir><dir name="Time"><file name="Hour.php" hash="ddad98b85290d9b13ec9f65fbe8a10b3"/><file name="Minute.php" hash="4a76af0057d60e8ff0ff7fedc1d50575"/></dir></dir><file name="Guid.php" hash="311c7f8072f02a6be9e25b6411298c5c"/><dir name="Script"><file name="Js.php" hash="3e3f23b38ecdc361bf6ff6cee1871e92"/></dir><dir name="Source"><dir name="Catalog"><dir name="Mapping"><dir name="Configurable"><file name="Price.php" hash="f9116fd446914467e7fb31bed5a6dd0b"/></dir><file name="Mode.php" hash="36140a050ea65ff23d45264fa67e1a2b"/></dir><dir name="Product"><dir name="Attribute"><file name="Boolean.php" hash="ca1883122659f1b48890ecd46a1590ee"/></dir><file name="Attribute.php" hash="8ca9c929cda497400865751ffba991e6"/></dir></dir><dir name="Date"><file name="Weekday.php" hash="143c26f9661e5dc995ff064e333a2018"/></dir><dir name="Sales"><dir name="Order"><file name="Status.php" hash="f1e414c08c43ebb2fcc6ccf5b41a2ff2"/></dir></dir><dir name="Tax"><file name="Mode.php" hash="fb09f17b54ef8ffa22580741cc66ac14"/></dir></dir></dir></dir><dir name="Tax"><dir name="Quote"><file name="Shipping.php" hash="e4b0f82aaef3666be520bc2da28af098"/><file name="Subtotal.php" hash="6824b6e6e86dc423fd493a31b15aa28d"/><file name="Tax.php" hash="7ee0528db7b7f9e89cd00a0b0c74dda9"/></dir></dir></dir><dir name="sql"><dir name="iparcel_setup"><file name="mysql4-upgrade-1.0.0-1.1.0.php" hash="4df6e3a3f2adf96eeb6ccdac213e3f1e"/><file name="mysql4-upgrade-1.1.0-1.1.1.php" hash="358045d3bf4a53a477e52b573289fe4c"/><file name="mysql4-upgrade-1.1.1-1.2.0.php" hash="1f04c5c71a6a79aaf74810e87670d998"/><file name="mysql4-upgrade-1.2.0-1.2.1.php" hash="de1c9caa713dd194595aa2dd15a829ac"/></dir></dir></dir></dir></dir></dir><dir name="design"><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="ipcarthandoff.xml" hash="ed7faf180d54254f9bd4bfde21cdec1d"/><file name="iparcel.xml" hash="55aec816cb242fe44aab3a2e0d9de0ba"/><file name="iparcel.xml" hash="55aec816cb242fe44aab3a2e0d9de0ba"/></dir><dir name="template"><dir name="iparcel"><dir name="carthandoff"><file name="button.phtml" hash="4724ea247d4fb514373bd25290f8ee96"/><file name="estimate.phtml" hash="4613986760ea91bbfe607336008da870"/><dir name="form"><file name="button.phtml" hash="603683fdeb5153c8ce4649f72967180a"/></dir></dir><dir name="html"><dir name="head"><file name="iparcel.phtml" hash="07091c9914189cfef06af8cc6e41855c"/><file name="jquery.phtml" hash="c287cb0aa4ddd1f04f27cb5df605a27d"/><file name="post.phtml" hash="1a53e744668b250175ba275b4260050b"/><file name="iparcel.phtml" hash="07091c9914189cfef06af8cc6e41855c"/><file name="jquery.phtml" hash="c287cb0aa4ddd1f04f27cb5df605a27d"/><file name="post.phtml" hash="1a53e744668b250175ba275b4260050b"/></dir></dir><dir name="post"><file name="list.phtml" hash="20e5d7d7f82e1f8d951a1509921eb3bf"/><file name="list.phtml" hash="20e5d7d7f82e1f8d951a1509921eb3bf"/></dir><file name="post.phtml" hash="3827cab2dba981556aeb8ec915ab03cc"/></dir></dir></dir></dir></dir><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="iparcel.xml" hash="b6e4778db9cebc970e1dc58cae12eb85"/></dir><dir name="template"><dir name="iparcel"><dir name="order"><dir name="totals"><file name="duty.phtml" hash="7af41c6d47dafeb890a520d8e6e39910"/><file name="tax.phtml" hash="25bffd2b58554cf28e5f4abe4b4e1e7c"/></dir></dir><dir name="sync"><dir name="ajax"><file name="catalog.phtml" hash="54ad431bc5f9b6d8dc50a1160e6d6ab5"/></dir></dir></dir></dir></dir></dir></dir></dir><dir name="locale"><dir name="en_US"><file name="iparcel.csv" hash="cbcb75a490376ca0b63c8c66622c1656"/></dir></dir></dir><dir name="js"><dir name="iparcel"><file name="cart-buttons.js" hash="98e45ffd14e94c6c33184fea62fce296"/><file name="jQuery.js" hash="8ec1680e4d815ff93f661214efa06276"/><file name="lib.js" hash="42c556650eb62797de469f1770bde3f0"/><file name="post.js" hash="c710697e3d4905a6a707222728485047"/><file name="jQuery.js" hash="8ec1680e4d815ff93f661214efa06276"/><file name="lib.js" hash="42c556650eb62797de469f1770bde3f0"/><file name="post.js" hash="c710697e3d4905a6a707222728485047"/><file name="jQuery.js" hash="8ec1680e4d815ff93f661214efa06276"/><file name="lib.js" hash="42c556650eb62797de469f1770bde3f0"/><file name="post.js" hash="c710697e3d4905a6a707222728485047"/><dir name="adminhtml"><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f755af215fb6121c766644bd9a0f399d"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f755af215fb6121c766644bd9a0f399d"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f755af215fb6121c766644bd9a0f399d"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f755af215fb6121c766644bd9a0f399d"/><file name="shipping-methods.js" hash="eca91e8a5cf152fce7af0eb5bf2991bb"/><file name="sync.js" hash="f755af215fb6121c766644bd9a0f399d"/></dir></dir></dir><dir name="skin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="iparcel"><file name="ajaxSync.css" hash="c622b9e4b77589bc0f3c0555124d2751"/></dir></dir></dir></dir></dir></target></contents>
22
  <compatible/>
23
  <dependencies>
24
  <required>