CornerDrop_Collect - Version 1.2.0

Version Notes

Initial release

Download this release

Release Info

Developer CornerDrop
Extension CornerDrop_Collect
Version 1.2.0
Comparing to
See all releases


Version 1.2.0

Files changed (94) hide show
  1. app/code/community/CornerDrop/Collect/Block/Adminhtml/Form/Field/Account/Balance.php +22 -0
  2. app/code/community/CornerDrop/Collect/Block/Checkout/Success.php +52 -0
  3. app/code/community/CornerDrop/Collect/Block/Checkout/Switch.php +79 -0
  4. app/code/community/CornerDrop/Collect/Block/Sales/Order/Totals.php +31 -0
  5. app/code/community/CornerDrop/Collect/Helper/Api.php +45 -0
  6. app/code/community/CornerDrop/Collect/Helper/Config.php +250 -0
  7. app/code/community/CornerDrop/Collect/Helper/Data.php +212 -0
  8. app/code/community/CornerDrop/Collect/Helper/Order.php +280 -0
  9. app/code/community/CornerDrop/Collect/Model/Api/Action.php +157 -0
  10. app/code/community/CornerDrop/Collect/Model/Api/Action/OrderCancel.php +7 -0
  11. app/code/community/CornerDrop/Collect/Model/Api/Action/OrderCreate.php +7 -0
  12. app/code/community/CornerDrop/Collect/Model/Api/Action/OrderDispatch.php +7 -0
  13. app/code/community/CornerDrop/Collect/Model/Api/Action/OrderReserve.php +7 -0
  14. app/code/community/CornerDrop/Collect/Model/Api/Action/Search.php +8 -0
  15. app/code/community/CornerDrop/Collect/Model/Api/Action/Status.php +7 -0
  16. app/code/community/CornerDrop/Collect/Model/Api/Request.php +205 -0
  17. app/code/community/CornerDrop/Collect/Model/Api/Response.php +138 -0
  18. app/code/community/CornerDrop/Collect/Model/Api/Response/Empty.php +24 -0
  19. app/code/community/CornerDrop/Collect/Model/Cron.php +126 -0
  20. app/code/community/CornerDrop/Collect/Model/Observer.php +219 -0
  21. app/code/community/CornerDrop/Collect/Model/Resource/Setup.php +5 -0
  22. app/code/community/CornerDrop/Collect/Model/Sales/Order/Creditmemo/Total/CornerDrop/Fee.php +39 -0
  23. app/code/community/CornerDrop/Collect/Model/Sales/Order/Invoice/Total/CornerDrop/Fee.php +46 -0
  24. app/code/community/CornerDrop/Collect/Model/Sales/Quote/Address/Total/CornerDrop/Fee.php +111 -0
  25. app/code/community/CornerDrop/Collect/Test/.DS_Store +0 -0
  26. app/code/community/CornerDrop/Collect/Test/Config/Base.php +14 -0
  27. app/code/community/CornerDrop/Collect/Test/Helper/Data.php +115 -0
  28. app/code/community/CornerDrop/Collect/Test/Model/Api/Action.php +52 -0
  29. app/code/community/CornerDrop/Collect/Test/Model/Api/Action/fixtures/testExecute.yaml +2 -0
  30. app/code/community/CornerDrop/Collect/Test/Model/Api/Request.php +64 -0
  31. app/code/community/CornerDrop/Collect/Test/Model/Api/Response.php +19 -0
  32. app/code/community/CornerDrop/Collect/Test/Model/Api/Response/providers/response_testIsSuccessful.yaml +16 -0
  33. app/code/community/CornerDrop/Collect/Test/Model/Api/Test/Case.php +19 -0
  34. app/code/community/CornerDrop/Collect/Test/Model/Api/data/data_response_success.json +7 -0
  35. app/code/community/CornerDrop/Collect/Test/Model/Api/data/response_failed.json +5 -0
  36. app/code/community/CornerDrop/Collect/Test/Model/Api/data/response_nojson.json +1 -0
  37. app/code/community/CornerDrop/Collect/Test/Model/Api/data/response_valid.json +7 -0
  38. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/Fee.php +73 -0
  39. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/fixtures/testCornerDropFeeAddedWithNoTax.yaml +356 -0
  40. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/fixtures/testCornerDropFeeAddedWithTax.yaml +356 -0
  41. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/fixtures/testCornerDropFeeNotAdded.yaml +356 -0
  42. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee.php +54 -0
  43. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithNoTax.yaml +382 -0
  44. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithTax.yaml +382 -0
  45. app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee/fixtures/testCornerDropFeeNotAdded.yaml +382 -0
  46. app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee.php +94 -0
  47. app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithNoTax.yaml +438 -0
  48. app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithTax.yaml +438 -0
  49. app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee/fixtures/testCornerDropFeeNotAdded.yaml +273 -0
  50. app/code/community/CornerDrop/Collect/controllers/Adminhtml/Cornerdrop/Collect/SearchController.php +68 -0
  51. app/code/community/CornerDrop/Collect/controllers/SearchController.php +70 -0
  52. app/code/community/CornerDrop/Collect/data/cornerdrop_collect_setup/data-install-1.0.0.php +74 -0
  53. app/code/community/CornerDrop/Collect/etc/adminhtml.xml +22 -0
  54. app/code/community/CornerDrop/Collect/etc/config.xml +232 -0
  55. app/code/community/CornerDrop/Collect/etc/system.xml +172 -0
  56. app/code/community/CornerDrop/Collect/sql/cornerdrop_collect_setup/install-1.0.0.php +75 -0
  57. app/code/community/CornerDrop/Collect/sql/cornerdrop_collect_setup/upgrade-1.0.0-1.1.0.php +33 -0
  58. app/code/community/CornerDrop/Collect/sql/cornerdrop_collect_setup/upgrade-1.1.0-1.2.0.php +36 -0
  59. app/design/adminhtml/default/default/layout/cornerdrop/collect.xml +99 -0
  60. app/design/adminhtml/default/default/template/cornerdrop/collect/order/create/form/address/shipping.phtml +175 -0
  61. app/design/frontend/base/default/layout/cornerdrop/collect.xml +126 -0
  62. app/design/frontend/base/default/template/cornerdrop/collect/checkout/success.phtml +4 -0
  63. app/design/frontend/base/default/template/cornerdrop/collect/checkout/switch.phtml +31 -0
  64. app/design/frontend/base/default/template/cornerdrop/collect/email/shipment.phtml +6 -0
  65. app/design/frontend/base/default/template/cornerdrop/collect/search.phtml +38 -0
  66. app/etc/modules/CornerDrop_Collect.xml +12 -0
  67. app/locale/en_US/template/email/cornerdrop/collect/code.html +73 -0
  68. js/cornerdrop/collect/adminhtml.js +222 -0
  69. js/cornerdrop/collect/adminhtml_search.js +15 -0
  70. js/cornerdrop/collect/adminhtml_ui.js +15 -0
  71. js/cornerdrop/collect/event.simulate.js +64 -0
  72. js/cornerdrop/collect/geolocationAPI.js +89 -0
  73. js/cornerdrop/collect/gmaps.js +171 -0
  74. js/cornerdrop/collect/search.js +211 -0
  75. js/cornerdrop/collect/switch.js +185 -0
  76. js/cornerdrop/collect/ui.js +558 -0
  77. package.xml +36 -0
  78. skin/adminhtml/default/default/cornerdrop/collect/css/collect.css +136 -0
  79. skin/adminhtml/default/default/cornerdrop/collect/images/ajax-loader.gif +0 -0
  80. skin/adminhtml/default/default/cornerdrop/collect/images/geolocation.png +0 -0
  81. skin/adminhtml/default/default/cornerdrop/collect/images/reset.png +0 -0
  82. skin/adminhtml/default/default/cornerdrop/collect/images/search.png +0 -0
  83. skin/frontend/base/default/cornerdrop/collect/.DS_Store +0 -0
  84. skin/frontend/base/default/cornerdrop/collect/css/collect.css +198 -0
  85. skin/frontend/base/default/cornerdrop/collect/images/ajax-loader.gif +0 -0
  86. skin/frontend/base/default/cornerdrop/collect/images/droppoint_active.png +0 -0
  87. skin/frontend/base/default/cornerdrop/collect/images/droppoint_inactive.png +0 -0
  88. skin/frontend/base/default/cornerdrop/collect/images/droppoint_muted.png +0 -0
  89. skin/frontend/base/default/cornerdrop/collect/images/geolocation.png +0 -0
  90. skin/frontend/base/default/cornerdrop/collect/images/logo_125.jpg +0 -0
  91. skin/frontend/base/default/cornerdrop/collect/images/logo_250.jpg +0 -0
  92. skin/frontend/base/default/cornerdrop/collect/images/logo_500.jpg +0 -0
  93. skin/frontend/base/default/cornerdrop/collect/images/reset.png +0 -0
  94. skin/frontend/base/default/cornerdrop/collect/images/search.png +0 -0
app/code/community/CornerDrop/Collect/Block/Adminhtml/Form/Field/Account/Balance.php ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Block_Adminhtml_Form_Field_Account_Balance extends Mage_Adminhtml_Block_System_Config_Form_Field
4
+ {
5
+
6
+ /**
7
+ * Return the account balance or "Unknown" if it's not known.
8
+ *
9
+ * @param Varien_Data_Form_Element_Abstract $element
10
+ *
11
+ * @return string
12
+ */
13
+ protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element)
14
+ {
15
+ if (is_numeric($element->getEscapedValue())) {
16
+ return $element->getEscapedValue();
17
+ }
18
+
19
+ return "Unknown";
20
+ }
21
+
22
+ }
app/code/community/CornerDrop/Collect/Block/Checkout/Success.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Block_Checkout_Success extends Mage_Core_Block_Template
4
+ {
5
+ protected $order;
6
+
7
+ /**
8
+ * Get the current order model.
9
+ *
10
+ * @return Mage_Sales_Model_Order
11
+ */
12
+ public function getOrder()
13
+ {
14
+ if (!$this->order) {
15
+ if ($orderId = Mage::getSingleton("checkout/session")->getLastOrderId()) {
16
+ $this->order = Mage::getModel("sales/order")->load($orderId);
17
+ }
18
+ }
19
+
20
+ return $this->order;
21
+ }
22
+
23
+ /**
24
+ * Check if CornerDrop was selected for the current order.
25
+ *
26
+ * @return bool
27
+ */
28
+ public function isCornerDropOrder()
29
+ {
30
+ return $this->getModuleHelper()->isOrderCornerDrop($this->getOrder());
31
+ }
32
+
33
+ /**
34
+ * Get CornerDrop logo HTML.
35
+ *
36
+ * @return string
37
+ */
38
+ public function getLogoHtml()
39
+ {
40
+ return $this->getModuleHelper()->getLogoHtml();
41
+ }
42
+
43
+ /**
44
+ * Get the module helper.
45
+ *
46
+ * @return CornerDrop_Collect_Helper_Data
47
+ */
48
+ protected function getModuleHelper()
49
+ {
50
+ return Mage::helper("cornerdrop_collect");
51
+ }
52
+ }
app/code/community/CornerDrop/Collect/Block/Checkout/Switch.php ADDED
@@ -0,0 +1,79 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Block_Checkout_Switch extends Mage_Checkout_Block_Onepage_Abstract
4
+ {
5
+ const SKIN_IMAGE_PATH = 'cornerdrop/collect/images/';
6
+
7
+ /**
8
+ * Check if CornerDrop Collect is enabled for this checkout.
9
+ *
10
+ * @return bool
11
+ */
12
+ public function isEnabled()
13
+ {
14
+ return !$this->getQuote()->isVirtual() && $this->getConfig()->isExtensionEnabled();
15
+ }
16
+
17
+ /**
18
+ * Get the switch checkbox label.
19
+ *
20
+ * @return string
21
+ */
22
+ public function getCheckboxLabel()
23
+ {
24
+ if ($this->getConfig()->getAdditionalFee()) {
25
+ return $this->getModuleHelper()->__("Click & Collect with %s (+%s)", $this->getModuleHelper()->getLogoHtml(), $this->getConfig()->getFormattedFee());
26
+ } else {
27
+ return $this->getModuleHelper()->__("Click & Collect with %s", $this->getModuleHelper()->getLogoHtml());
28
+ }
29
+ }
30
+
31
+ /**
32
+ * Check if CornerDrop Collect is selected for the current quote.
33
+ *
34
+ * @return bool
35
+ */
36
+ public function getValue()
37
+ {
38
+ return $this->getModuleHelper()->isCornerDropAddress($this->getQuote()->getShippingAddress());
39
+ }
40
+
41
+ /**
42
+ * Get search template HTML.
43
+ *
44
+ * @return string
45
+ */
46
+ public function getSearchTemplateHtml()
47
+ {
48
+ return $this->getChildHtml('search_template');
49
+ }
50
+
51
+ /**
52
+ * Get the URL for the given image in skin.
53
+ *
54
+ * @return string
55
+ */
56
+ public function getImageUrl($filename) {
57
+ return $this->getSkinUrl(static::SKIN_IMAGE_PATH . $filename);
58
+ }
59
+
60
+ /**
61
+ * Get the module helper.
62
+ *
63
+ * @return CornerDrop_Collect_Helper_Data
64
+ */
65
+ protected function getModuleHelper()
66
+ {
67
+ return Mage::helper("cornerdrop_collect");
68
+ }
69
+
70
+ /**
71
+ * Get the config helper.
72
+ *
73
+ * @return CornerDrop_Collect_Helper_Config
74
+ */
75
+ protected function getConfig()
76
+ {
77
+ return Mage::helper("cornerdrop_collect/config");
78
+ }
79
+ }
app/code/community/CornerDrop/Collect/Block/Sales/Order/Totals.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Block_Sales_Order_Totals extends Mage_Core_Block_Abstract {
4
+
5
+ /**
6
+ * Add the CornerDrop Fee Total to Totals
7
+ *
8
+ * @Return void
9
+ */
10
+ public function initTotals() {
11
+ $helper = Mage::helper('cornerdrop_collect');
12
+
13
+ /** @var Mage_Sales_Block_Order_Totals $parent */
14
+ $parent = $this->getParentBlock();
15
+ $source = $parent->getSource();
16
+ $shipping_address = $source->getShippingAddress();
17
+ if($shipping_address && $helper->isCornerDropAddress($source->getShippingAddress())) {
18
+ $parent->addTotalBefore(
19
+ new Varien_Object(array(
20
+ 'code' => CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT,
21
+ 'value' => $source->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT),
22
+ 'base_value'=> $source->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT),
23
+ 'label' => $helper->getCornerDropFeeLabel()
24
+ )
25
+ ),
26
+ 'shipping'
27
+ );
28
+ }
29
+ }
30
+
31
+ }
app/code/community/CornerDrop/Collect/Helper/Api.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Helper_Api extends Mage_Core_Helper_Abstract
4
+ {
5
+
6
+ const DEFAULT_API_IDENTIFIER = 'MAGENTO';
7
+
8
+ const STATUS_CODE_SUCCESS = "2000";
9
+ const STATUS_CODE_INVALID_HEADER_INFORMATION = "4001";
10
+ const STATUS_CODE_API_KEY_NOT_SUPPLIED = "4010";
11
+ const STATUS_CODE_API_KEY_INVALID = "4011";
12
+ const STATUS_CODE_AUTHORIZATION_DENIED = "4030";
13
+ const STATUS_CODE_PACKAGE_ACTIVATION_NO_CREDITS = "4020";
14
+ const STATUS_CODE_PACKAGE_ACTIVATION_DROP_POINT_NO_CAPACITY = "4021";
15
+ const STATUS_CODE_PACKAGE_ACTIVATION_DROP_POINT_DAILY_LIMIT_EXCEEDED = "4022";
16
+ const STATUS_CODE_REFERENCE_NOT_FOUND = "4041";
17
+ const STATUS_CODE_TERMINATE = "4100";
18
+
19
+ /**
20
+ * Return the current version of the module
21
+ *
22
+ * @return string
23
+ */
24
+ public function getVersion()
25
+ {
26
+ return Mage::getConfig()->getModuleConfig('CornerDrop_Collect')->version;
27
+ }
28
+
29
+ public function getApiIdentifier()
30
+ {
31
+ return self::DEFAULT_API_IDENTIFIER . '-' . $this->getVersion();
32
+ }
33
+
34
+ /**
35
+ * Build & prepare API endpoint url.
36
+ * @param string $endpoint
37
+ * @param Mage_Core_Model_Store|int|null $store_id
38
+ * @return string
39
+ */
40
+ public function buildEndpoint($endpoint, $store_id)
41
+ {
42
+ $uri = Mage::helper('cornerdrop_collect/config')->getApiUri($store_id);
43
+ return rtrim($uri, '/') . $endpoint;
44
+ }
45
+ }
app/code/community/CornerDrop/Collect/Helper/Config.php ADDED
@@ -0,0 +1,250 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Helper_Config extends Mage_Core_Helper_Abstract
4
+ {
5
+
6
+ const XML_PATH_STATUS_BALANCE = 'cornerdrop_collect/status/balance';
7
+ const XML_PATH_STATUS_LAST_CHECKED = 'cornerdrop_collect/status/last_checked';
8
+
9
+ const XML_PATH_SETTINGS_ENABLED = 'cornerdrop_collect/settings/enable';
10
+ const XML_PATH_SETTINGS_API_KEY = 'cornerdrop_collect/settings/api_key';
11
+ const XML_PATH_SETTINGS_API_URI = 'cornerdrop_collect/settings/api_uri';
12
+ const XML_PATH_SETTINGS_CODE_EMAIL_TEMPLATE = 'cornerdrop_collect/settings/code_email_template';
13
+ const XML_PATH_FEE_SETTINGS_ADDITIONAL_FEE = 'cornerdrop_collect/fee_settings/additional_fee';
14
+ const XML_PATH_FEE_SETTINGS_INCLUDE_TAX = 'cornerdrop_collect/fee_settings/include_tax';
15
+ const XML_PATH_FEE_SETTINGS_TAX_CLASS = 'cornerdrop_collect/fee_settings/tax_class';
16
+
17
+ const XML_PATH_PREFIX_ADDRESS_TEMPLATE = 'cornerdrop_collect/address_templates/';
18
+
19
+ const DATETIME_FORMAT = "Y-m-d H:i:s T";
20
+
21
+ /**
22
+ * Set the account credit balance.
23
+ *
24
+ * @param int $value
25
+ *
26
+ * @return $this
27
+ */
28
+ public function setAccountBalance($value)
29
+ {
30
+ $this->setGlobalConfig(static::XML_PATH_STATUS_BALANCE, $value);
31
+
32
+ return $this;
33
+ }
34
+
35
+ /**
36
+ * Get the account credit balance.
37
+ *
38
+ * @return int
39
+ */
40
+ public function getAccountBalance()
41
+ {
42
+ $balance = Mage::getStoreConfig(static::XML_PATH_STATUS_BALANCE);
43
+
44
+ $balance = (is_numeric($balance)) ? intval($balance) : null;
45
+
46
+ return $balance;
47
+ }
48
+
49
+ /**
50
+ * Get the account credit balance after taking into account
51
+ * any CornerDrop orders that the API has not been notified about
52
+ * yet.
53
+ *
54
+ * @return int
55
+ */
56
+ public function getAvailableAccountBalance()
57
+ {
58
+ $api_balance = $this->getAccountBalance();
59
+
60
+ $pending_orders = Mage::helper("cornerdrop_collect/order")->getCornerDropOrderCollection()
61
+ ->addFieldToFilter(CornerDrop_Collect_Helper_Data::ORDERED_NOTIFICATION_COLUMN, array("neq" => 1))
62
+ ->getSize();
63
+
64
+ $balance = $api_balance - $pending_orders;
65
+
66
+ return ($balance > 0) ? $balance : 0;
67
+ }
68
+
69
+ /**
70
+ * Set the time when the account status was last checked.
71
+ * Uses admin store timezone.
72
+ *
73
+ * @param DateTime|string $datetime
74
+ *
75
+ * @return $this
76
+ */
77
+ public function setStatusLastChecked($datetime = "now")
78
+ {
79
+ if (!$datetime instanceof DateTime) {
80
+ $datetime = new DateTime($datetime, $this->getAdminTimezone());
81
+ }
82
+
83
+ $this->setGlobalConfig(static::XML_PATH_STATUS_LAST_CHECKED, $datetime->format(static::DATETIME_FORMAT));
84
+
85
+ return $this;
86
+ }
87
+
88
+ /**
89
+ * Get the time when the account status was last checked.
90
+ * Uses admin store timezone.
91
+ *
92
+ * @return DateTime|null
93
+ */
94
+ public function getStatusLastChecked()
95
+ {
96
+ $value = Mage::getStoreConfig(static::XML_PATH_STATUS_LAST_CHECKED);
97
+
98
+ return ($value) ? DateTime::createFromFormat(static::DATETIME_FORMAT, $value, $this->getAdminTimezone()) : null;
99
+ }
100
+
101
+ /**
102
+ * Get the System Configuration setting to enable the module.
103
+ *
104
+ * @param Mage_Core_Model_Store|int|null $store_id
105
+ *
106
+ * @return bool
107
+ */
108
+ public function getEnabledFlag($store_id = null)
109
+ {
110
+ return Mage::getStoreConfigFlag(self::XML_PATH_SETTINGS_ENABLED, $store_id);
111
+ }
112
+
113
+ /**
114
+ * Check if the extension functionality is enabled.
115
+ * Includes checking the enabled flag in the configuration and
116
+ * the available account balance.
117
+ *
118
+ * @param Mage_Core_Model_Store|int|null $store_id
119
+ *
120
+ * @return bool
121
+ */
122
+ public function isExtensionEnabled($store_id = null)
123
+ {
124
+ return $this->getEnabledFlag($store_id) && $this->getAvailableAccountBalance() > 0;
125
+ }
126
+
127
+ /**
128
+ * @param Mage_Core_Model_Store|int|null $store_id
129
+ *
130
+ * @return string
131
+ */
132
+ public function getApiKey($store_id = null)
133
+ {
134
+ return Mage::getStoreConfig(self::XML_PATH_SETTINGS_API_KEY, $store_id);
135
+ }
136
+
137
+ /**
138
+ * Get the email template to use for the package collection
139
+ * code email.
140
+ *
141
+ * @param Mage_Core_Model_Store|int|null $store
142
+ *
143
+ * @return string
144
+ */
145
+ public function getCodeEmailTemplate($store = null)
146
+ {
147
+ return Mage::getStoreConfig(static::XML_PATH_SETTINGS_CODE_EMAIL_TEMPLATE, $store);
148
+ }
149
+
150
+ /**
151
+ * @param Mage_Core_Model_Store|int|null $store_id
152
+ *
153
+ * @return string
154
+ */
155
+ public function getAdditionalFee($store_id = null)
156
+ {
157
+ return Mage::getStoreConfig(self::XML_PATH_FEE_SETTINGS_ADDITIONAL_FEE, $store_id);
158
+ }
159
+
160
+ /**
161
+ * Get the configured additional fee for the given store, formatted for printing.
162
+ *
163
+ * @param Mage_Core_Model_Store|int|null $store
164
+ *
165
+ * @return string
166
+ */
167
+ public function getFormattedFee($store = null)
168
+ {
169
+ $store = Mage::app()->getStore($store);
170
+
171
+ return $store->formatPrice($this->getAdditionalFee($store), false);
172
+ }
173
+
174
+ /**
175
+ * @param Mage_Core_Model_Store|int|null $store_id
176
+ *
177
+ * @return bool
178
+ */
179
+ public function isIncludeTax($store_id = null)
180
+ {
181
+ return Mage::getStoreConfigFlag(self::XML_PATH_FEE_SETTINGS_INCLUDE_TAX, $store_id);
182
+ }
183
+
184
+ /**
185
+ * @param Mage_Core_Model_Store|int|null $store_id
186
+ *
187
+ * @return string
188
+ */
189
+ public function getTaxClass($store_id = null)
190
+ {
191
+ return Mage::getStoreConfig(self::XML_PATH_FEE_SETTINGS_TAX_CLASS, $store_id);
192
+ }
193
+
194
+ /**
195
+ * Fetch the URI used API calls.
196
+ *
197
+ * @param Mage_Core_Model_Store|int|null $store_id
198
+ *
199
+ * @return string
200
+ */
201
+ public function getApiUri($store_id = null)
202
+ {
203
+ return Mage::getStoreConfig(self::XML_PATH_SETTINGS_API_URI, $store_id);
204
+ }
205
+
206
+ /**
207
+ * Get the customer address template suffix for the specified address format.
208
+ *
209
+ * @param string $type_code
210
+ * @param Mage_Core_Model_Store|int|null $store_id
211
+ *
212
+ * @return mixed
213
+ */
214
+ public function getAddressTemplate($type_code, $store_id = null)
215
+ {
216
+ return Mage::getStoreConfig(sprintf("%s%s", static::XML_PATH_PREFIX_ADDRESS_TEMPLATE, $type_code), $store_id);
217
+ }
218
+
219
+ /**
220
+ * Set the value of the given System Configuraiton path in the global scope.
221
+ *
222
+ * @param string $path
223
+ * @param string $value
224
+ *
225
+ * @return $this
226
+ */
227
+ protected function setGlobalConfig($path, $value)
228
+ {
229
+ Mage::getConfig()
230
+ ->saveConfig($path, $value, "default")
231
+ ->reinit();
232
+
233
+ return $this;
234
+ }
235
+
236
+ /**
237
+ * Get the timezone for the admin store.
238
+ *
239
+ * @return DateTimeZone
240
+ */
241
+ protected function getAdminTimezone()
242
+ {
243
+ return new DateTimeZone(
244
+ Mage::app()
245
+ ->getStore(Mage_Core_Model_Store::ADMIN_CODE)
246
+ ->getConfig(Mage_Core_Model_Locale::XML_PATH_DEFAULT_TIMEZONE)
247
+ );
248
+ }
249
+
250
+ }
app/code/community/CornerDrop/Collect/Helper/Data.php ADDED
@@ -0,0 +1,212 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Helper_Data extends Mage_Core_Helper_Abstract
4
+ {
5
+
6
+ const CORNERDROP_FEE_AMOUNT = 'cornerdrop_fee_amount';
7
+ const BASE_CORNERDROP_FEE_AMOUNT = 'base_cornerdrop_fee_amount';
8
+ const CORNERDROP_TAX = 'cornerdrop_tax_amount';
9
+ const BASE_CORNERDROP_TAX = 'base_cornerdrop_tax_amount';
10
+ const ORDERED_NOTIFICATION_COLUMN = 'cornerdrop_notification_ordered';
11
+ const SHIPPED_NOTIFICATION_COLUMN = 'cornerdrop_notification_shipped';
12
+ const CANCELLED_NOTIFICATION_COLUMN = 'cornerdrop_notification_cancelled';
13
+
14
+ const IS_CORNERDROP_COLLECT = 'is_cornerdrop_collect';
15
+ const CORNERDROP_STORE_ID_COLUMN = 'cornerdrop_store_id';
16
+ const CORNERDROP_FEE_CODE = 'cornerdrop_fee';
17
+ const CORNERDROP_RESERVATION_CODE = 'cornerdrop_reservation_code';
18
+
19
+ /**
20
+ * Log a message to a log file.
21
+ *
22
+ * @param $message
23
+ * @param int $level
24
+ */
25
+ public function log($message, $level = Zend_Log::DEBUG)
26
+ {
27
+ Mage::log($message, $level, 'cornerdrop.log');
28
+ }
29
+
30
+ /**
31
+ * Check if the given address is a CornerDrop Collect address.
32
+ *
33
+ * @param Mage_Sales_Model_Quote_Address|Mage_Sales_Model_Order_Address $address
34
+ *
35
+ * @return bool
36
+ */
37
+ public function isCornerDropAddress($address) {
38
+ return $address->getData(static::IS_CORNERDROP_COLLECT) == 1;
39
+ }
40
+
41
+ /**
42
+ * Check if the quote is using CornerDrop
43
+ *
44
+ * @param Mage_Sales_Model_Quote $quote
45
+ *
46
+ * @return bool
47
+ */
48
+ public function isQuoteCornerDrop(Mage_Sales_Model_Quote $quote)
49
+ {
50
+ return !$quote->isVirtual() && $this->isCornerDropAddress($quote->getShippingAddress());
51
+ }
52
+
53
+ /**
54
+ * Check if the order is using CornerDrop, the check can be done by the Invoice and Creditmemo blocks too.
55
+ *
56
+ * @param Mage_Sales_Model_Order|Mage_Sales_Model_Order_Invoice|Mage_Sales_Model_Order_Creditmemo $source
57
+ *
58
+ * @return bool
59
+ */
60
+ public function isOrderCornerDrop($source)
61
+ {
62
+ return !$source->getIsVirtual() && $this->isCornerDropAddress($source->getShippingAddress());
63
+ }
64
+
65
+ /**
66
+ * Get the Label for CornerDrop
67
+ *
68
+ * @return string
69
+ */
70
+ public function getCornerDropFeeLabel()
71
+ {
72
+ return $this->__('CornerDrop Fee');
73
+ }
74
+
75
+ /**
76
+ * Get the HTML to print a CornerDrop logo for the current theme.
77
+ *
78
+ * @return string
79
+ */
80
+ public function getLogoHtml()
81
+ {
82
+ $sources = array(
83
+ "1x" => "cornerdrop/collect/images/logo_125.jpg",
84
+ "2x" => "cornerdrop/collect/images/logo_250.jpg",
85
+ "4x" => "cornerdrop/collect/images/logo_500.jpg"
86
+ );
87
+
88
+ return sprintf('<img src="%s" srcset="%s" width="125" alt="CornerDrop" class="cdc-logo" />',
89
+ Mage::getDesign()->getSkinUrl($sources["1x"]),
90
+ implode(",", array_map(function ($path, $cond) {
91
+ return sprintf("%s %s", Mage::getDesign()->getSkinUrl($path), $cond);
92
+ }, $sources, array_keys($sources)))
93
+ );
94
+ }
95
+
96
+ /**
97
+ * Perform a search for CornerDrop Collect locations using the API
98
+ * and return the results as an array. Returns null if the search
99
+ * failed.
100
+ *
101
+ * @param Mage_Sales_Model_Quote $quote
102
+ * @param string $query
103
+ * @param string $lat
104
+ * @param string $long
105
+ *
106
+ * @return array|null
107
+ */
108
+ public function search($quote, $query, $lat, $long)
109
+ {
110
+ try {
111
+ $response = Mage::getModel("cornerdrop_collect/api_action_search")->execute(
112
+ $quote->getId(),
113
+ $quote->getRemoteIp(),
114
+ array(
115
+ "searchString" => $query,
116
+ "latitude" => $lat,
117
+ "longitude" => $long
118
+ )
119
+ );
120
+ } catch (Exception $e) {
121
+ Mage::logException($e);
122
+
123
+ return null;
124
+ }
125
+
126
+ if ($response->isSuccessful()) {
127
+ $results = array();
128
+
129
+ $data = $response->getResult();
130
+
131
+ if ($data && array_key_exists("results", $data) && is_array($data["results"])) {
132
+ $default_address = $this->getCustomerAddress($quote);
133
+
134
+ foreach ($data["results"] as $result) {
135
+ $results[] = $this->buildResult($result, $default_address);
136
+ }
137
+ }
138
+
139
+ return $results;
140
+ }
141
+
142
+ return null;
143
+ }
144
+
145
+ /**
146
+ * Get the customer billing address fields as an array from the given quote.
147
+ *
148
+ * @param Mage_Sales_Model_Quote $quote
149
+ *
150
+ * @return array
151
+ */
152
+ protected function getCustomerAddress($quote)
153
+ {
154
+ $address = $quote->getBillingAddress()->exportCustomerAddress()->toArray();
155
+
156
+ // Remove internal VAT fields
157
+ unset($address["vat_is_valid"]);
158
+ unset($address["vat_request_id"]);
159
+ unset($address["vat_request_date"]);
160
+ unset($address["vat_request_success"]);
161
+
162
+ unset($address["region_id"]);
163
+
164
+ return $address;
165
+ }
166
+
167
+ /**
168
+ * Build a result array out of the raw data returned by the API.
169
+ *
170
+ * @param array $data
171
+ * @param array $default_address
172
+ *
173
+ * @return array
174
+ */
175
+ protected function buildResult($data, $default_address) {
176
+ $result = array(
177
+ "id" => $data["id"],
178
+ "name" => $data["displayName"],
179
+ "description" => $data["siteMarketing"],
180
+ "address" => $default_address,
181
+ "addressHtml" => $data["fullAddressHtml"],
182
+ "location" => array(
183
+ "distance" => $data["distance"],
184
+ "latitude" => $data["latitude"],
185
+ "longitude" => $data["longitude"]
186
+ ),
187
+ "availability" => array(
188
+ "available" => $data["availableSlots"],
189
+ "total" => $data["totalSlots"]
190
+ ),
191
+ "openingHoursHtml" => $data["openingHoursHtml"]
192
+ );
193
+
194
+ foreach (array(
195
+ "displayName" => "company",
196
+ "city" => "city",
197
+ "contactPhone" => "telephone",
198
+ "countryCode" => "country_id",
199
+ "county" => "region",
200
+ "postCode" => "postcode"
201
+ ) as $source => $destination) {
202
+ $result["address"][$destination] = $data[$source];
203
+ }
204
+
205
+ $result["address"]["firstname"] = "CornerDrop";
206
+ $result["address"]["lastname"] = "code";
207
+ $result["address"]["street"] = array($data["address1"], $data["address2"], $data["address3"]);
208
+
209
+ return $result;
210
+ }
211
+
212
+ }
app/code/community/CornerDrop/Collect/Helper/Order.php ADDED
@@ -0,0 +1,280 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Helper_Order extends Mage_Core_Helper_Abstract
4
+ {
5
+ const RESULT_SUCCESS = 1;
6
+ const RESULT_FAILED = 2;
7
+ const RESULT_TERMINATE = 3;
8
+
9
+ /**
10
+ * Get an order collection filtered to only include CornerDrop orders.
11
+ *
12
+ * @return Mage_Sales_Model_Resource_Order_Collection
13
+ */
14
+ public function getCornerDropOrderCollection()
15
+ {
16
+ $collection = Mage::getModel("sales/order")->getCollection()
17
+ ->addAddressFields()
18
+ ->addFieldToFilter("shipping_o_a." . CornerDrop_Collect_Helper_Data::IS_CORNERDROP_COLLECT, 1);
19
+
20
+ return $collection;
21
+ }
22
+
23
+ /**
24
+ * Place a reservation for our quote against the CornerDrop API. If successful, assign
25
+ * the returned `addressCodeId` to the quote for submission during the order creation
26
+ * call.
27
+ *
28
+ * @param Mage_Sales_Model_Quote $quote
29
+ * @param $drop_point_node_id
30
+ *
31
+ * @return int
32
+ */
33
+ public function reserve(Mage_Sales_Model_Quote $quote, $drop_point_node_id)
34
+ {
35
+ try {
36
+ $response = Mage::getModel('cornerdrop_collect/api_action_orderReserve')->execute(
37
+ $quote->getId(),
38
+ $quote->getRemoteIp(),
39
+ array(
40
+ "dropPointNodeId" => $drop_point_node_id
41
+ )
42
+ );
43
+ } catch (Exception $e) {
44
+ Mage::logException($e);
45
+
46
+ return static::RESULT_FAILED;
47
+ }
48
+
49
+ if ($response->isSuccessful()) {
50
+ $response_data = $response->getResult();
51
+ $address_code_id = $response_data['addressCodeId'];
52
+
53
+ $quote->getShippingAddress()->setData(
54
+ CornerDrop_Collect_Helper_Data::CORNERDROP_RESERVATION_CODE,
55
+ $address_code_id
56
+ );
57
+
58
+ $quote->save();
59
+
60
+ return static::RESULT_SUCCESS;
61
+ } else if ($response->getCode() == CornerDrop_Collect_Helper_Api::STATUS_CODE_TERMINATE) {
62
+ return static::RESULT_TERMINATE;
63
+ }
64
+
65
+ return static::RESULT_FAILED;
66
+ }
67
+
68
+ /**
69
+ * Submit a new order to the CornerDrop API and, if successful, update the order
70
+ * shipping address with a CornerDrop reference and notify the customer of their
71
+ * tracking code.
72
+ *
73
+ * @param Mage_Sales_Model_Order $order
74
+ * @param bool $save Save the order model after setting the CornerDrop reference.
75
+ * @param bool $notify Email the secret PIN to the customer.
76
+ *
77
+ * @return int
78
+ */
79
+ public function create($order, $save = true, $notify = true)
80
+ {
81
+ $orderData = $this->getOrderData($order);
82
+
83
+ try {
84
+ $response = Mage::getModel("cornerdrop_collect/api_action_orderCreate")->execute(
85
+ $order->getQuoteId(),
86
+ $order->getRemoteIp(),
87
+ $orderData
88
+ );
89
+ } catch (Exception $e) {
90
+ Mage::logException($e);
91
+
92
+ return static::RESULT_FAILED;
93
+ }
94
+
95
+ if ($response->isSuccessful()) {
96
+ $result = $response->getResult();
97
+
98
+ if ($result["addressCodePublic"]) {
99
+ // Set reference as the lastname and reset all other optional name fields
100
+ $order->getShippingAddress()->addData(array(
101
+ "prefix" => "",
102
+ "firstname" => "Ref.",
103
+ "middlename" => "",
104
+ "lastname" => $result["addressCodePublic"],
105
+ "suffix" => ""
106
+ ));
107
+
108
+ if ($save) {
109
+ $order->save();
110
+ }
111
+
112
+ if ($notify && $result["secretPin"]) {
113
+ $store_id = $order->getStore()->getId();
114
+
115
+ try {
116
+ Mage::getModel("core/email_template")->sendTransactional(
117
+ Mage::helper("cornerdrop_collect/config")->getCodeEmailTemplate($store_id),
118
+ "sales",
119
+ $order->getCustomerEmail(),
120
+ $order->getCustomerName(),
121
+ array(
122
+ "order" => $order,
123
+ "cornerdrop_ref" => $result["addressCodePublic"],
124
+ "cornerdrop_pin" => $result["secretPin"]
125
+ ),
126
+ $store_id
127
+ );
128
+ } catch (Exception $e) {
129
+ Mage::logException($e);
130
+
131
+ Mage::helper("cornerdrop_collect")->log(sprintf(
132
+ "Failed to notify the customer about the CornerDrop Code (Reference: %s, Code: %s): %s",
133
+ $result["addressCodePublic"],
134
+ $result["secretPin"],
135
+ $e->getMessage()
136
+ ));
137
+ }
138
+ }
139
+ }
140
+
141
+ return static::RESULT_SUCCESS;
142
+ } else if ($response->getCode() == CornerDrop_Collect_Helper_Api::STATUS_CODE_TERMINATE) {
143
+ return static::RESULT_TERMINATE;
144
+ }
145
+
146
+ return static::RESULT_FAILED;
147
+ }
148
+
149
+ /**
150
+ * Send an order dispatch notification to the CornerDrop API.
151
+ *
152
+ * @param Mage_Sales_Model_Order $order
153
+ *
154
+ * @return int
155
+ */
156
+ public function dispatch($order)
157
+ {
158
+ try {
159
+ $response = Mage::getModel("cornerdrop_collect/api_action_orderDispatch")->execute(
160
+ $order->getQuoteId(),
161
+ $order->getRemoteIp(),
162
+ array(
163
+ "externalOrderReference" => $order->getId()
164
+ )
165
+ );
166
+ } catch (Exception $e) {
167
+ Mage::logException($e);
168
+
169
+ return static::RESULT_FAILED;
170
+ }
171
+
172
+ if ($response->isSuccessful()) {
173
+ return static::RESULT_SUCCESS;
174
+ } else if ($response->getCode() == CornerDrop_Collect_Helper_Api::STATUS_CODE_TERMINATE) {
175
+ return static::RESULT_TERMINATE;
176
+ }
177
+
178
+ return static::RESULT_FAILED;
179
+ }
180
+
181
+ /**
182
+ * Send a cancelled order notification to the CornerDrop API.
183
+ *
184
+ * @param Mage_Sales_Model_Order $order
185
+ *
186
+ * @return int
187
+ */
188
+ public function cancel($order)
189
+ {
190
+ try {
191
+ $response = Mage::getModel("cornerdrop_collect/api_action_orderCancel")->execute(
192
+ $order->getQuoteId(),
193
+ $order->getRemoteIp(),
194
+ array(
195
+ "externalOrderReference" => $order->getId(),
196
+ "cancellationReason" => "Not available"
197
+ )
198
+ );
199
+ } catch (Exception $e) {
200
+ Mage::logException($e);
201
+
202
+ return static::RESULT_FAILED;
203
+ }
204
+
205
+ if ($response->isSuccessful()) {
206
+ return static::RESULT_SUCCESS;
207
+ } else if ($response->getCode() == CornerDrop_Collect_Helper_Api::STATUS_CODE_TERMINATE) {
208
+ return static::RESULT_TERMINATE;
209
+ }
210
+
211
+ return static::RESULT_FAILED;
212
+ }
213
+
214
+ /**
215
+ * Get an array of order data used by CornerDrop for the given order.
216
+ *
217
+ * @param Mage_Sales_Model_Order $order
218
+ *
219
+ * @return array
220
+ */
221
+ protected function getOrderData($order)
222
+ {
223
+ $address = $order->getBillingAddress();
224
+ $shipping_address = $order->getShippingAddress();
225
+
226
+ $cornerdrop_store_id = $shipping_address
227
+ ->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_STORE_ID_COLUMN);
228
+
229
+ $cornerdrop_reservation_code = $shipping_address
230
+ ->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_RESERVATION_CODE);
231
+
232
+ $data = array(
233
+ "dropPointNodeId" => $cornerdrop_store_id,
234
+ "addressCodeId" => $cornerdrop_reservation_code,
235
+ "externalOrderReference" => $order->getId(),
236
+ "prefix" => $order->getCustomerPrefix(),
237
+ "firstName" => $order->getCustomerFirstname(),
238
+ "middleName" => $order->getCustomerMiddlename(),
239
+ "lastName" => $order->getCustomerLastname(),
240
+ "suffix" => $order->getCustomerSuffix(),
241
+ "company" => $address->getCompany(),
242
+ "address1" => $address->getStreet1(),
243
+ "address2" => $address->getStreet2(),
244
+ "address3" => $address->getStreet3(),
245
+ "city" => $address->getCity(),
246
+ "state" => $address->getRegion(),
247
+ "country" => $address->getCountry(),
248
+ "postCode" => $address->getPostcode(),
249
+ "email" => $order->getCustomerEmail(),
250
+ "phone" => $address->getTelephone(),
251
+ "fax" => $address->getFax(),
252
+ "vatNumber" => $order->getCustomerTaxvat(),
253
+ "orderDate" => $order->getCreatedAtDate()->getIso(),
254
+ "paymentMethod" => $order->getPayment()->getMethod(),
255
+ "subTotalAmount" => $order->getSubtotal(),
256
+ "discountAmount" => $order->getDiscountAmount(),
257
+ "taxAmount" => $order->getTaxAmount(),
258
+ "totalAmount" => $order->getGrandTotal(),
259
+ "shippingMethod" => $order->getShippingMethod(),
260
+ "shippingAmount" => $order->getShippingAmount(),
261
+ "couponCode" => $order->getCouponCode(),
262
+ "items" => array()
263
+ );
264
+
265
+ foreach ($order->getAllVisibleItems() as $item) {
266
+ /** @var Mage_Sales_Model_Order_Item $item */
267
+ $data["items"][] = array(
268
+ "itemName" => $item->getName(),
269
+ "itemDescription" => $item->getDescription(),
270
+ "itemSku" => $item->getSku(),
271
+ "itemPrice" => $item->getPriceInclTax(),
272
+ "itemWeight" => $item->getWeight(),
273
+ "itemQuantity" => $item->getQtyOrdered(),
274
+ "itemRowTotal" => $item->getRowTotalInclTax()
275
+ );
276
+ }
277
+
278
+ return $data;
279
+ }
280
+ }
app/code/community/CornerDrop/Collect/Model/Api/Action.php ADDED
@@ -0,0 +1,157 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Action extends Varien_Object
4
+ {
5
+ const ENDPOINT = "";
6
+ const METHOD = "GET";
7
+
8
+ const DEFAULT_REQUEST_MODEL = 'cornerdrop_collect/api_request';
9
+ const DEFAULT_RESPONSE_MODEL = 'cornerdrop_collect/api_response';
10
+
11
+ /** @var CornerDrop_Collect_Model_Api_Request $request */
12
+ protected $request;
13
+
14
+ /** @var CornerDrop_Collect_Model_Api_Response $response */
15
+ protected $response;
16
+
17
+ /** @var Mage_Core_Model_Store|int|null $store */
18
+ protected $store;
19
+
20
+ /** @var CornerDrop_Collect_Helper_Api */
21
+ protected $apiHelper;
22
+
23
+ protected $apiIdentifier;
24
+
25
+ public function __construct()
26
+ {
27
+ parent::__construct();
28
+
29
+ $this->apiHelper = Mage::helper('cornerdrop_collect/api');
30
+ }
31
+
32
+ /**
33
+ * Set the request model to use for the API action
34
+ *
35
+ * @param CornerDrop_Collect_Model_Api_Request $request
36
+ * @return $this
37
+ */
38
+ public function setRequest(CornerDrop_Collect_Model_Api_Request $request)
39
+ {
40
+ $this->request = $request;
41
+
42
+ return $this;
43
+ }
44
+
45
+ /**
46
+ * Returns the request model used for this API action
47
+ *
48
+ * @return CornerDrop_Collect_Model_Api_Request
49
+ */
50
+ public function getRequest()
51
+ {
52
+ if (!$this->request) {
53
+ $this->request = Mage::getModel(static::DEFAULT_REQUEST_MODEL);
54
+ }
55
+
56
+ return $this->request;
57
+ }
58
+
59
+ /**
60
+ * Set the response model to use for the API action
61
+ *
62
+ * @param CornerDrop_Collect_Model_Api_Response $response
63
+ * @return $this
64
+ */
65
+ public function setResponse(CornerDrop_Collect_Model_Api_Response $response)
66
+ {
67
+ $this->response = $response;
68
+
69
+ return $this;
70
+ }
71
+
72
+ /**
73
+ * Returns the response model used for this API action
74
+ *
75
+ * @return CornerDrop_Collect_Model_Api_Response
76
+ */
77
+ public function getResponse()
78
+ {
79
+ if (!$this->response) {
80
+ $this->response = Mage::getModel(static::DEFAULT_RESPONSE_MODEL);
81
+ }
82
+
83
+ return $this->response;
84
+ }
85
+
86
+ /**
87
+ * Set the store to use for the API action
88
+ *
89
+ * @param Mage_Core_Model_Store|int|null $store
90
+ * @return $this
91
+ */
92
+ public function setStore($store)
93
+ {
94
+ $this->store = $store;
95
+
96
+ return $this;
97
+ }
98
+
99
+ /**
100
+ * Return a store used for the API action
101
+ *
102
+ * @return int|Mage_Core_Model_Store
103
+ */
104
+ public function getStore()
105
+ {
106
+ if (!$this->store) {
107
+ $this->store = Mage::app()->getStore();
108
+ }
109
+
110
+ return $this->store;
111
+ }
112
+
113
+ /**
114
+ * Execute the API call, and return the response
115
+ * $session_id = quote id
116
+ * $user_host_address = remote ip from quote.
117
+ *
118
+ * @param string $session_id
119
+ * @param string $user_host_address
120
+ * @param array $parameters
121
+ * @return CornerDrop_Collect_Model_Api_Response
122
+ */
123
+ public function execute($session_id, $user_host_address, $parameters = array())
124
+ {
125
+ $request = $this->getRequest();
126
+ $store = $this->getStore();
127
+ $api_key = Mage::helper('cornerdrop_collect/config')->getApiKey($store);
128
+
129
+ $request
130
+ ->setResponseModel($this->getResponse())
131
+ ->setEndpoint($this->apiHelper->buildEndpoint(static::ENDPOINT, $store))
132
+ ->setMethod(static::METHOD)
133
+ ->setHeader('ApiKey', $api_key)
134
+ ->setHeader('Identifier', $this->getApiIdentifier())
135
+ ->setHeader('SessionId', $session_id)
136
+ ->setHeader('UserHostAddress', $user_host_address)
137
+ ->setData($parameters);
138
+
139
+ return $request->send();
140
+ }
141
+
142
+ public function getApiIdentifier()
143
+ {
144
+ if (!$this->apiIdentifier) {
145
+ $this->apiIdentifier = $this->apiHelper->getApiIdentifier();
146
+ }
147
+
148
+ return $this->apiIdentifier;
149
+ }
150
+
151
+ public function setApiIdentifier($api_identifier)
152
+ {
153
+ $this->apiIdentifier = $api_identifier;
154
+
155
+ return $this;
156
+ }
157
+ }
app/code/community/CornerDrop/Collect/Model/Api/Action/OrderCancel.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Action_OrderCancel extends CornerDrop_Collect_Model_Api_Action
4
+ {
5
+ const ENDPOINT = "/order/cancel";
6
+ const METHOD = "POST";
7
+ }
app/code/community/CornerDrop/Collect/Model/Api/Action/OrderCreate.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Action_OrderCreate extends CornerDrop_Collect_Model_Api_Action
4
+ {
5
+ const ENDPOINT = "/order/create";
6
+ const METHOD = "POST";
7
+ }
app/code/community/CornerDrop/Collect/Model/Api/Action/OrderDispatch.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Action_OrderDispatch extends CornerDrop_Collect_Model_Api_Action
4
+ {
5
+ const ENDPOINT = "/order/dispatch";
6
+ const METHOD = "POST";
7
+ }
app/code/community/CornerDrop/Collect/Model/Api/Action/OrderReserve.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Action_OrderReserve extends CornerDrop_Collect_Model_Api_Action
4
+ {
5
+ const ENDPOINT = "/order/reserve";
6
+ const METHOD = "POST";
7
+ }
app/code/community/CornerDrop/Collect/Model/Api/Action/Search.php ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Action_Search extends CornerDrop_Collect_Model_Api_Action
4
+ {
5
+ const ENDPOINT = "/search";
6
+ const METHOD = "GET";
7
+
8
+ }
app/code/community/CornerDrop/Collect/Model/Api/Action/Status.php ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Action_Status extends CornerDrop_Collect_Model_Api_Action
4
+ {
5
+ const ENDPOINT = "/status";
6
+ const METHOD = "GET";
7
+ }
app/code/community/CornerDrop/Collect/Model/Api/Request.php ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Request extends Varien_Object
4
+ {
5
+ protected $endpoint;
6
+
7
+ protected $method;
8
+
9
+ protected $headers;
10
+
11
+ protected $responseModel;
12
+
13
+ protected $client;
14
+
15
+ /** @var CornerDrop_Collect_Helper_Data $_helper */
16
+ protected $_helper;
17
+
18
+ public function _construct()
19
+ {
20
+ parent::_construct();
21
+
22
+ $this->method = Zend_Http_Client::GET;
23
+ $this->headers = array();
24
+ $this->responseModel = Mage::getModel('cornerdrop_collect/api_response');
25
+ $this->_helper = Mage::helper('cornerdrop_collect');
26
+ }
27
+
28
+ /**
29
+ * @param string $url
30
+ * @return $this
31
+ */
32
+ public function setEndpoint($url)
33
+ {
34
+ $this->endpoint = $url;
35
+
36
+ return $this;
37
+ }
38
+
39
+ /**
40
+ * @return string
41
+ */
42
+ public function getEndpoint()
43
+ {
44
+ return $this->endpoint;
45
+ }
46
+
47
+ /**
48
+ * @param string $method
49
+ * @return $this
50
+ */
51
+ public function setMethod($method)
52
+ {
53
+ $this->method = $method;
54
+
55
+ return $this;
56
+ }
57
+
58
+ /**
59
+ * @return string
60
+ */
61
+ public function getMethod()
62
+ {
63
+ return $this->method;
64
+ }
65
+
66
+ /**
67
+ * @param string $name
68
+ * @param string $value
69
+ * @return $this
70
+ */
71
+ public function setHeader($name, $value)
72
+ {
73
+ $this->headers[$name] = $value;
74
+
75
+ return $this;
76
+ }
77
+
78
+ /**
79
+ * @return array
80
+ */
81
+ public function getHeaders()
82
+ {
83
+ return $this->headers;
84
+ }
85
+
86
+
87
+ /**
88
+ * @param CornerDrop_Collect_Model_Api_Response $response
89
+ * @return $this
90
+ */
91
+ public function setResponseModel(CornerDrop_Collect_Model_Api_Response $response)
92
+ {
93
+ $this->responseModel = $response;
94
+
95
+ return $this;
96
+ }
97
+
98
+ /**
99
+ * @return CornerDrop_Collect_Model_Api_Response
100
+ */
101
+ public function getResponseModel()
102
+ {
103
+ return $this->responseModel;
104
+ }
105
+
106
+ public function setClient($client)
107
+ {
108
+ $this->client = $client;
109
+
110
+ return $this;
111
+ }
112
+
113
+ public function getClient()
114
+ {
115
+ if (!$this->client) {
116
+ $this->client = new Zend_Http_Client();
117
+ }
118
+ return $this->client;
119
+ }
120
+
121
+ /**
122
+ * @return CornerDrop_Collect_Model_Api_Response
123
+ * @throws Mage_Core_Exception
124
+ * @throws Zend_Http_Client_Exception
125
+ */
126
+ public function send()
127
+ {
128
+ if (!$this->getEndpoint()) {
129
+ // Can't make a request without a URL
130
+ Mage::throwException("Unable to send a CornerDrop API request: No URL specified.");
131
+ }
132
+
133
+ $client = $this->getClient();
134
+
135
+ $raw_request = $client
136
+ ->setUri($this->getEndpoint())
137
+ ->setMethod($this->getMethod())
138
+ ->setHeaders($this->getHeaders());
139
+
140
+ if ($this->getMethod() == Zend_Http_Client::GET) {
141
+ $raw_request->setParameterGet($this->getData());
142
+ }
143
+
144
+ if ($this->getMethod() == Zend_Http_Client::POST) {
145
+ $raw_request->setHeaders("Content-Type", "application/json");
146
+ $raw_request->setRawData(json_encode($this->getData()));
147
+ }
148
+
149
+ $this->_helper->log(sprintf("API request:\n%s", $this->__toString()));
150
+
151
+ try {
152
+ $raw_response = $raw_request->request();
153
+ } catch (Zend_Http_Client_Exception $e) {
154
+ $this->_helper->log(sprintf('HTTP error: %s', $e->getMessage()));
155
+ Mage::logException($e);
156
+ return Mage::getModel('cornerdrop_collect/api_response_empty');
157
+ }
158
+
159
+ $response = $this->getResponseModel();
160
+ $response->setRawResponse($raw_response);
161
+ $this->_helper->log(sprintf(
162
+ "API response:\n%s",
163
+ $response->__toString()
164
+ ), Zend_Log::DEBUG);
165
+
166
+ return $response;
167
+ }
168
+
169
+ /**
170
+ * Return the string representation of the API request.
171
+ *
172
+ * @return string
173
+ */
174
+ public function __toString()
175
+ {
176
+ $endpoint = $this->getEndpoint();
177
+ if ($this->getMethod() == Zend_Http_Client::GET) {
178
+ if ($params = $this->getData()) {
179
+ array_walk($params, function (&$value, $key) {
180
+ $value = sprintf("%s=%s", $key, $value);
181
+ });
182
+ $endpoint = sprintf("%s?%s", $endpoint, implode("&", $params));
183
+ }
184
+ }
185
+
186
+ $headers = $this->getHeaders();
187
+ if (count($headers) > 0) {
188
+ array_walk($headers, function (&$value, $key) {
189
+ $value = ($value !== null && $value !== false) ? sprintf("%s: %s", $key, $value) : null;
190
+ });
191
+ }
192
+
193
+ $body = "";
194
+ if ($this->getMethod() == Zend_Http_Client::POST) {
195
+ $body = json_encode($this->getData());
196
+ }
197
+
198
+ return sprintf("%s %s\n%s%s\n",
199
+ $this->getMethod(),
200
+ $endpoint,
201
+ implode("\n", array_filter($headers)),
202
+ ($body) ? sprintf("\n%s", $body) : ""
203
+ );
204
+ }
205
+ }
app/code/community/CornerDrop/Collect/Model/Api/Response.php ADDED
@@ -0,0 +1,138 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Class CornerDrop_Collect_Model_Api_Response
5
+ *
6
+ * @method int getCode()
7
+ */
8
+ class CornerDrop_Collect_Model_Api_Response extends Varien_Object
9
+ {
10
+ /**
11
+ * @var Zend_Http_Response
12
+ */
13
+ protected $rawResponse;
14
+
15
+ /**
16
+ * @var bool
17
+ */
18
+ protected $successful;
19
+
20
+ /**
21
+ * @var array
22
+ */
23
+ protected $headers;
24
+
25
+ /** @var CornerDrop_Collect_Helper_Data $_helper */
26
+ protected $_helper;
27
+
28
+ public function _construct()
29
+ {
30
+ parent::_construct();
31
+ $this->_helper = Mage::helper('cornerdrop_collect');
32
+ $this->successful = false;
33
+ }
34
+
35
+ /**
36
+ * Set response object
37
+ *
38
+ * @param Zend_Http_Response $response
39
+ * @return $this
40
+ */
41
+ public function setRawResponse(Zend_Http_Response $response)
42
+ {
43
+ $this->rawResponse = $response;
44
+
45
+ $this->parseRawResponse($response);
46
+
47
+ return $this;
48
+ }
49
+
50
+ public function getRawResponse()
51
+ {
52
+ return $this->rawResponse;
53
+ }
54
+
55
+ /**
56
+ * Bool check if the response was successful
57
+ *
58
+ * @return bool
59
+ */
60
+ public function isSuccessful()
61
+ {
62
+ return $this->successful;
63
+ }
64
+
65
+ /**
66
+ * Set Response Headers
67
+ *
68
+ * @param array $headers
69
+ * @return $this
70
+ */
71
+ public function setHeaders($headers)
72
+ {
73
+ $this->headers = $headers;
74
+
75
+ return $this;
76
+ }
77
+
78
+ /**
79
+ * Return the response headers as an array.
80
+ *
81
+ * @return array
82
+ */
83
+ public function getHeaders()
84
+ {
85
+ return $this->headers;
86
+ }
87
+
88
+ /**
89
+ * Process the response and handle errors
90
+ *
91
+ * @param Zend_Http_Response $response
92
+ * @return $this
93
+ */
94
+ protected function parseRawResponse(Zend_Http_Response $response)
95
+ {
96
+ $this->successful = false;
97
+
98
+ $this->setHeaders($response->getHeaders());
99
+
100
+ $json = json_decode($response->getBody(), true);
101
+ if (is_array($json)) {
102
+ $this->setData($json);
103
+ } else {
104
+ $this->setData('message', 'Response body is empty');
105
+ }
106
+
107
+ if ($response->isSuccessful()) {
108
+ if ($this->getCode() == CornerDrop_Collect_Helper_Api::STATUS_CODE_SUCCESS) {
109
+ $this->successful = true;
110
+ }
111
+ } else {
112
+ $this->_helper->log(
113
+ sprintf(
114
+ "Unsuccessful HTTP response: %s %s",
115
+ $response->getStatus(),
116
+ $response->responseCodeAsText($response->getStatus())
117
+ ),
118
+ Zend_Log::ERR
119
+ );
120
+ }
121
+
122
+ return $this;
123
+ }
124
+
125
+ /**
126
+ * Return the raw response as a string.
127
+ *
128
+ * @return string
129
+ */
130
+ public function __toString()
131
+ {
132
+ return sprintf("%s\n%s",
133
+ $this->getRawResponse()->getHeadersAsString(true, "\n"),
134
+ $this->getRawResponse()->getBody()
135
+ );
136
+ }
137
+
138
+ }
app/code/community/CornerDrop/Collect/Model/Api/Response/Empty.php ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Api_Response_Empty extends CornerDrop_Collect_Model_Api_Response {
4
+
5
+ public function _construct() {
6
+ $this->successful = false;
7
+ $this->addData(array(
8
+ 'message' => "No HTTP response received. If you are using PHP version 5.4, please make sure to enable the php_openssl.dll module in your php.ini file."
9
+ ));
10
+ }
11
+
12
+ /**
13
+ * Override the parse response method, this API response is static.
14
+ *
15
+ * @param Zend_Http_Response $response
16
+ *
17
+ * @return $this
18
+ */
19
+ protected function parseRawResponse(Zend_Http_Response $response) {
20
+ // Do nothing
21
+ return $this;
22
+ }
23
+
24
+ }
app/code/community/CornerDrop/Collect/Model/Cron.php ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Cron extends Varien_Object
4
+ {
5
+ const STATUS_NOT_NOTIFIED = 0;
6
+ const STATUS_NOTIFICATION_SUCCESSFUL = 1;
7
+ const STATUS_NOTIFICATION_TERMINATED = 99;
8
+
9
+ /**
10
+ * Send all pending order notifications to the CornerDrop API.
11
+ */
12
+ public function sendNotifications()
13
+ {
14
+ $this->sendNewOrderNotifications();
15
+ $this->sendShippedOrderNotifications();
16
+ $this->sendCancelledOrderNotifications();
17
+ }
18
+
19
+ /**
20
+ * Send notifications to CornerDrop API for all new CornerDrop orders.
21
+ */
22
+ public function sendNewOrderNotifications()
23
+ {
24
+ $collection = $this->getOrderHelper()->getCornerDropOrderCollection()
25
+ ->addFieldToFilter(
26
+ CornerDrop_Collect_Helper_Data::ORDERED_NOTIFICATION_COLUMN,
27
+ array("eq" => static::STATUS_NOT_NOTIFIED)
28
+ );
29
+
30
+ foreach ($collection as $order) {
31
+ $status = null;
32
+ switch ($this->getOrderHelper()->create($order, false)) {
33
+ case CornerDrop_Collect_Helper_Order::RESULT_SUCCESS:
34
+ $status = static::STATUS_NOTIFICATION_SUCCESSFUL;
35
+ break;
36
+ case CornerDrop_Collect_Helper_Order::RESULT_TERMINATE:
37
+ $status = static::STATUS_NOTIFICATION_TERMINATED;
38
+ break;
39
+ }
40
+
41
+ if ($status !== null) {
42
+ $order
43
+ ->setData(CornerDrop_Collect_Helper_Data::ORDERED_NOTIFICATION_COLUMN, $status)
44
+ ->save();
45
+ }
46
+ }
47
+ }
48
+
49
+ /**
50
+ * Send notifications to CornerDrop API for all dispatched CornerDrop orders.
51
+ */
52
+ public function sendShippedOrderNotifications()
53
+ {
54
+ $collection = $this->getOrderHelper()->getCornerDropOrderCollection();
55
+ $collection
56
+ ->addFieldToFilter(
57
+ CornerDrop_Collect_Helper_Data::SHIPPED_NOTIFICATION_COLUMN,
58
+ array("eq" => static::STATUS_NOT_NOTIFIED)
59
+ )
60
+ ->join(
61
+ array("shipment" => "sales/shipment"),
62
+ "shipment.order_id = main_table.entity_id",
63
+ null
64
+ )
65
+ ->getSelect()->group("main_table.entity_id");
66
+
67
+ foreach ($collection as $order) {
68
+ $status = null;
69
+ switch ($this->getOrderHelper()->dispatch($order)) {
70
+ case CornerDrop_Collect_Helper_Order::RESULT_SUCCESS:
71
+ $status = static::STATUS_NOTIFICATION_SUCCESSFUL;
72
+ break;
73
+ case CornerDrop_Collect_Helper_Order::RESULT_TERMINATE:
74
+ $status = static::STATUS_NOTIFICATION_TERMINATED;
75
+ break;
76
+ }
77
+
78
+ if ($status !== null) {
79
+ $order
80
+ ->setData(CornerDrop_Collect_Helper_Data::SHIPPED_NOTIFICATION_COLUMN, $status)
81
+ ->save();
82
+ }
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Send notifications to CornerDrop API for all cancelled CornerDrop orders.
88
+ */
89
+ public function sendCancelledOrderNotifications()
90
+ {
91
+ $collection = $this->getOrderHelper()->getCornerDropOrderCollection()
92
+ ->addFieldToFilter("state", Mage_Sales_Model_Order::STATE_CANCELED)
93
+ ->addFieldToFilter(
94
+ CornerDrop_Collect_Helper_Data::CANCELLED_NOTIFICATION_COLUMN,
95
+ array("eq" => static::STATUS_NOT_NOTIFIED)
96
+ );
97
+
98
+ foreach ($collection as $order) {
99
+ $status = null;
100
+ switch ($this->getOrderHelper()->cancel($order)) {
101
+ case CornerDrop_Collect_Helper_Order::RESULT_SUCCESS:
102
+ $status = static::STATUS_NOTIFICATION_SUCCESSFUL;
103
+ break;
104
+ case CornerDrop_Collect_Helper_Order::RESULT_TERMINATE:
105
+ $status = static::STATUS_NOTIFICATION_TERMINATED;
106
+ break;
107
+ }
108
+
109
+ if ($status !== null) {
110
+ $order
111
+ ->setData(CornerDrop_Collect_Helper_Data::CANCELLED_NOTIFICATION_COLUMN, $status)
112
+ ->save();
113
+ }
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Get the order helper.
119
+ *
120
+ * @return CornerDrop_Collect_Helper_Order
121
+ */
122
+ protected function getOrderHelper()
123
+ {
124
+ return Mage::helper("cornerdrop_collect/order");
125
+ }
126
+ }
app/code/community/CornerDrop/Collect/Model/Observer.php ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Observer extends Varien_Object
4
+ {
5
+
6
+ /**
7
+ * Perform the account status check through the API and, if
8
+ * successful, save the result to system configuration.
9
+ *
10
+ * @event admin_system_config_changed_section_cornerdrop_collect
11
+ *
12
+ * @param Varien_Event_Observer|null $observer
13
+ *
14
+ * @return $this
15
+ */
16
+ public function checkAccountStatus(Varien_Event_Observer $observer = null)
17
+ {
18
+ try {
19
+ $response = Mage::getModel("cornerdrop_collect/api_action_status")->execute(null, null);
20
+ } catch (Exception $e) {
21
+ Mage::logException($e);
22
+
23
+ if ($observer instanceof Varien_Event_Observer
24
+ && preg_match("/admin/", $observer->getEvent()->getName())
25
+ ) {
26
+ Mage::getSingleton("adminhtml/session")
27
+ ->addWarning($this->getHelper()->__("Account status check failed!"));
28
+ }
29
+
30
+ return $this;
31
+ }
32
+
33
+ if ($response->isSuccessful()) {
34
+ $result = $response->getData("result");
35
+ if (isset($result["creditBalance"]) && is_numeric($result["creditBalance"])) {
36
+ $this->getConfig()
37
+ ->setAccountBalance($result["creditBalance"])
38
+ ->setStatusLastChecked("now");
39
+ }
40
+ }
41
+
42
+ return $this;
43
+ }
44
+
45
+ /**
46
+ * Set the CornerDrop Collect flag on the shipping address if
47
+ * CornerDrop was selected as a destination on the billing step
48
+ * of the checkout.
49
+ *
50
+ * @event controller_action_predispatch_checkout_onepage_saveBilling
51
+ *
52
+ * @param Varien_Event_Observer $observer
53
+ */
54
+ public function setCornerDropCollectFlag(Varien_Event_Observer $observer)
55
+ {
56
+ /** @var Mage_Checkout_OnepageController $controller */
57
+ $controller = $observer->getControllerAction();
58
+
59
+ if ($controller->getRequest()->isPost()) {
60
+ $data = $controller->getRequest()->getPost("billing", array());
61
+ $flag = array_key_exists("ship_to_cornerdrop", $data) ? $data["ship_to_cornerdrop"] : null;
62
+
63
+ if (!is_null($flag)) {
64
+ $address = $controller->getOnepage()->getQuote()->getShippingAddress();
65
+
66
+ $address
67
+ ->setData(CornerDrop_Collect_Helper_Data::IS_CORNERDROP_COLLECT, $flag ? 1 : 0)
68
+ ->save();
69
+ }
70
+ }
71
+ }
72
+
73
+ /**
74
+ * Process incoming JSON refreshes on the admin order creation page, setting the
75
+ * cornerdrop flag, and reserving the place, if we detect a store id on the address
76
+ *
77
+ * @event adminhtml_sales_order_create_process_data
78
+ *
79
+ * @param Varien_Event_Observer $observer
80
+ * @throws Exception
81
+ */
82
+ public function setAdminCornerDropCollectFlagAndReserve(Varien_Event_Observer $observer)
83
+ {
84
+ /** @var Mage_Adminhtml_Model_Sales_Order_Create $order_create_model */
85
+ $order_create_model = $observer->getData('order_create_model');
86
+
87
+ $quote = $order_create_model->getQuote();
88
+ $shipping_address = $quote->getShippingAddress();
89
+ $cornerdrop_store_id = $shipping_address->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_STORE_ID_COLUMN);
90
+
91
+ $is_cornerdrop_collect = $cornerdrop_store_id && is_numeric($cornerdrop_store_id);
92
+
93
+ $shipping_address
94
+ ->setData(CornerDrop_Collect_Helper_Data::IS_CORNERDROP_COLLECT, ($is_cornerdrop_collect) ? 1 : 0)
95
+ ->save();
96
+
97
+ $order_create_model->setRecollect(true)->recollectCart();
98
+
99
+ if ($is_cornerdrop_collect) {
100
+ $reservation_result = Mage::helper('cornerdrop_collect/order')->reserve($quote, $cornerdrop_store_id);
101
+
102
+ if ($reservation_result !== CornerDrop_Collect_Helper_Order::RESULT_SUCCESS) {
103
+ Mage::throwException(Mage::helper('cornerdrop_collect')->__(
104
+ "Unable to reserve collection at this location. Please try select another location, or try again later."
105
+ ));
106
+ }
107
+ }
108
+ }
109
+
110
+ /**
111
+ * If the CornerDrop flag is set then make a reservation for the selected
112
+ * drop point.
113
+ *
114
+ * @event controller_action_predispatch_checkout_onepage_saveShipping
115
+ *
116
+ * @param Varien_Event_Observer $observer
117
+ */
118
+ public function makeCornerDropCollectReservation(Varien_Event_Observer $observer) {
119
+ /** @var Mage_Checkout_OnepageController $controller */
120
+ $controller = $observer->getControllerAction();
121
+
122
+ if ($controller->getRequest()->isPost()) {
123
+ $data = $controller->getRequest()->getPost("shipping", array());
124
+
125
+ $is_cornerdrop = array_key_exists("is_cornerdrop_collect", $data) ? $data["is_cornerdrop_collect"] == '1' : false;
126
+ $store_id = array_key_exists("cornerdrop_store_id", $data) ? intval($data["cornerdrop_store_id"]) : null;
127
+
128
+ if ($is_cornerdrop) {
129
+ $quote = $controller->getOnepage()->getQuote();
130
+
131
+ $reservation_result = Mage::helper('cornerdrop_collect/order')->reserve($quote, $store_id);
132
+
133
+ if ($reservation_result !== CornerDrop_Collect_Helper_Order::RESULT_SUCCESS) {
134
+ $controller->setFlag('', Mage_Core_Controller_Varien_Action::FLAG_NO_DISPATCH, true);
135
+ $controller->getResponse()->setBody(Mage::helper('core')->jsonEncode(array(
136
+ "error" => 1,
137
+ "message" => Mage::helper('cornerdrop_collect')->__(
138
+ "Unable to reserve collection at this location. Please try select another location, or try again later."
139
+ )
140
+ )));
141
+ }
142
+ }
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Convert total to line order for Paypal.
148
+ *
149
+ * @event paypal_prepare_line_items
150
+ *
151
+ * @param Varien_Event_Observer $observer
152
+ *
153
+ * @return void
154
+ */
155
+ public function addTotalToPaypal(Varien_Event_Observer $observer)
156
+ {
157
+ /** @var Mage_Paypal_Model_Cart $paypal_cart */
158
+ $paypal_cart = $observer->getPaypalCart();
159
+
160
+ $sales_entity = $paypal_cart->getSalesEntity();
161
+ if ($sales_entity instanceof Mage_Sales_Model_Quote) {
162
+ if ($sales_entity->isVirtual()) {
163
+ return;
164
+ }
165
+ } else {
166
+ if ($sales_entity->getIsVirtual() || !$sales_entity->getShippingAddress()) {
167
+ return;
168
+ }
169
+ }
170
+
171
+ if ($this->getHelper()->isCornerDropAddress($sales_entity->getShippingAddress())) {
172
+ $paypal_cart->addItem(
173
+ $this->getHelper()->getCornerDropFeeLabel(),
174
+ 1,
175
+ $sales_entity->getCornerdropFeeAmount(),
176
+ CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_CODE
177
+ );
178
+ }
179
+ }
180
+
181
+ /**
182
+ * Append the CornerDrop address template to the customer
183
+ * address template if the address is a CornerDrop address.
184
+ *
185
+ * @event customer_address_format
186
+ * @param Varien_Event_Observer $observer
187
+ */
188
+ public function addCustomerAddressTemplate(Varien_Event_Observer $observer)
189
+ {
190
+ if ($this->getHelper()->isCornerDropAddress($observer->getAddress())) {
191
+ $formatType = $observer->getType();
192
+
193
+ $formatType->setDefaultFormat(sprintf("%s%s",
194
+ $formatType->getDefaultFormat(),
195
+ $this->getConfig()->getAddressTemplate($formatType->getCode())
196
+ ));
197
+ }
198
+ }
199
+
200
+ /**
201
+ * Get the config helper.
202
+ *
203
+ * @return CornerDrop_Collect_Helper_Config
204
+ */
205
+ protected function getConfig()
206
+ {
207
+ return Mage::helper("cornerdrop_collect/config");
208
+ }
209
+
210
+ /**
211
+ * Get the module helper.
212
+ *
213
+ * @return CornerDrop_Collect_Helper_Data
214
+ */
215
+ protected function getHelper()
216
+ {
217
+ return Mage::helper("cornerdrop_collect");
218
+ }
219
+ }
app/code/community/CornerDrop/Collect/Model/Resource/Setup.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Resource_Setup extends Mage_Eav_Model_Entity_Setup {
4
+
5
+ }
app/code/community/CornerDrop/Collect/Model/Sales/Order/Creditmemo/Total/CornerDrop/Fee.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Sales_Order_Creditmemo_Total_CornerDrop_Fee extends Mage_Sales_Model_Order_Creditmemo_Total_Abstract
4
+ {
5
+
6
+ /**
7
+ * Set the CornerDrop Fee total.
8
+ *
9
+ * @param Mage_Sales_Model_Order_Creditmemo $creditmemo
10
+ *
11
+ * @return $this
12
+ */
13
+ public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo)
14
+ {
15
+ $order = $creditmemo->getOrder();
16
+
17
+ $cornerdrop_fee = $order->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT);
18
+ $base_cornerdrop_fee = $order->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT);
19
+ $cornerdrop_tax = $order->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX);
20
+ $base_cornerdrop_tax = $order->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX);
21
+
22
+ if ($cornerdrop_fee) {
23
+ $creditmemo->addData(array(
24
+ CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT => $cornerdrop_fee,
25
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT => $base_cornerdrop_fee,
26
+ CornerDrop_Collect_Helper_Data::CORNERDROP_TAX => $cornerdrop_tax,
27
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX => $base_cornerdrop_tax
28
+ ));
29
+
30
+ $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $cornerdrop_tax);
31
+ $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $base_cornerdrop_tax);
32
+ $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $cornerdrop_fee + $cornerdrop_tax);
33
+ $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $base_cornerdrop_fee + $base_cornerdrop_tax);
34
+ }
35
+
36
+ return $this;
37
+ }
38
+
39
+ }
app/code/community/CornerDrop/Collect/Model/Sales/Order/Invoice/Total/CornerDrop/Fee.php ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Sales_Order_Invoice_Total_CornerDrop_Fee extends Mage_Sales_Model_Order_Invoice_Total_Abstract {
4
+
5
+ /**
6
+ * Set the CornerDrop Fee total.
7
+ *
8
+ * @param Mage_Sales_Model_Order_Invoice $invoice
9
+ * @return $this
10
+ */
11
+ public function collect(Mage_Sales_Model_Order_Invoice $invoice) {
12
+ $order = $invoice->getOrder();
13
+
14
+ $cornerdrop_fee = $order->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT);
15
+ $base_cornerdrop_fee = $order->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT);
16
+ $cornerdrop_tax = $order->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX);
17
+ $base_cornerdrop_tax = $order->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX);
18
+
19
+ if ($cornerdrop_fee) {
20
+ // Only add CornerDrop Collect fee to the first invoice
21
+ foreach ($invoice->getOrder()->getInvoiceCollection() as $previous_invoice) {
22
+ if (
23
+ $previous_invoice->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT)
24
+ && !$previous_invoice->isCanceled()
25
+ ) {
26
+ return $this;
27
+ }
28
+ }
29
+
30
+ $invoice->addData(array(
31
+ CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT => $cornerdrop_fee,
32
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT => $base_cornerdrop_fee,
33
+ CornerDrop_Collect_Helper_Data::CORNERDROP_TAX => $cornerdrop_tax,
34
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX => $base_cornerdrop_tax
35
+ ));
36
+
37
+ $invoice->setTaxAmount($invoice->getTaxAmount() + $cornerdrop_tax);
38
+ $invoice->setBaseTaxAmount($invoice->getBaseTaxAmount() + $base_cornerdrop_tax);
39
+ $invoice->setGrandTotal($invoice->getGrandTotal() + $cornerdrop_fee + $cornerdrop_tax);
40
+ $invoice->setBaseGrandTotal($invoice->getBaseGrandTotal() + $base_cornerdrop_fee + $base_cornerdrop_tax);
41
+ }
42
+
43
+ return $this;
44
+ }
45
+
46
+ }
app/code/community/CornerDrop/Collect/Model/Sales/Quote/Address/Total/CornerDrop/Fee.php ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Model_Sales_Quote_Address_Total_CornerDrop_Fee extends Mage_Sales_Model_Quote_Address_Total_Abstract {
4
+
5
+ /**
6
+ * Total Code name
7
+ *
8
+ * @var string
9
+ */
10
+ protected $_code = CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_CODE;
11
+
12
+ /**
13
+ * Set the CornerDrop Fee total.
14
+ *
15
+ * @param Mage_Sales_Model_Quote_Address $address
16
+ * @return $this
17
+ */
18
+ public function collect(Mage_Sales_Model_Quote_Address $address) {
19
+ $config_helper = Mage::helper('cornerdrop_collect/config');
20
+
21
+ if (!$this->isCornerDropAvailable($address)) {
22
+ return $this;
23
+ }
24
+
25
+ $store = $address->getQuote()->getStore();
26
+
27
+ $base_additional_fee = $config_helper->getAdditionalFee($store);
28
+ if(!$base_additional_fee) {
29
+ return $this;
30
+ }
31
+
32
+ parent::collect($address);
33
+
34
+ $this->_setAmount(0)
35
+ ->_setBaseAmount(0);
36
+
37
+ $items = $this->_getAddressItems($address);
38
+ if (!count($items)) {
39
+ return $this;
40
+ }
41
+
42
+ if(!$config_helper->isIncludeTax($store)) {
43
+ $custTaxClassId = $address->getQuote()->getCustomerTaxClassId();
44
+ $taxCalculationModel = Mage::getSingleton('tax/calculation');
45
+ $request = $taxCalculationModel->getRateRequest(
46
+ $address,
47
+ $address->getQuote()->getBillingAddress(),
48
+ $custTaxClassId,
49
+ $store
50
+ );
51
+
52
+ $request->setProductClassId($config_helper->getTaxClass($store));
53
+
54
+ if ($rate = $taxCalculationModel->getRate($request)) {
55
+ $base_cornerdrop_tax = $store->roundPrice($base_additional_fee * $rate/100);
56
+ $cornerdrop_tax = $store->convertPrice($base_cornerdrop_tax);
57
+ $address->setTaxAmount($address->getTaxAmount() + $cornerdrop_tax);
58
+ $address->setBaseTaxAmount($address->getBaseTaxAmount() + $base_cornerdrop_tax);
59
+ $address->setData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX, $cornerdrop_tax);
60
+ $address->setData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX, $base_cornerdrop_tax);
61
+ }
62
+ }
63
+ $additional_fee = $store->convertPrice($base_additional_fee, false);
64
+ $address->setTotalAmount($this->_code, $additional_fee);
65
+ $address->setBaseTotalAmount($this->_code, $base_additional_fee);
66
+
67
+ return $this;
68
+ }
69
+
70
+ /**
71
+ * @param Mage_Sales_Model_Quote_Address $address
72
+ *
73
+ * @return CornerDrop_Collect_Model_Sales_Quote_Total_Additional_Fee
74
+ */
75
+ public function fetch(Mage_Sales_Model_Quote_Address $address) {
76
+ if ($this->isCornerDropAvailable($address)) {
77
+ $address->addTotal(array(
78
+ 'code' => $this->getCode(),
79
+ 'title' => $this->getLabel(),
80
+ 'value' => $address->getCornerdropFeeAmount()
81
+ ));
82
+ }
83
+
84
+ return $this;
85
+ }
86
+
87
+ /**
88
+ * Get CornerDrop Collect additional fee label
89
+ *
90
+ * @return string
91
+ */
92
+ public function getLabel()
93
+ {
94
+ return Mage::helper('cornerdrop_collect')->getCornerDropFeeLabel();
95
+ }
96
+
97
+ /**
98
+ * Check if the given address is a CornerDrop Collect address.
99
+ *
100
+ * @param Mage_Sales_Model_Quote_Address $address
101
+ *
102
+ * @return bool
103
+ */
104
+ protected function isCornerDropAvailable($address)
105
+ {
106
+ $is_enabled = Mage::helper("cornerdrop_collect/config")->isExtensionEnabled($address->getQuote()->getStore());
107
+ $is_cornerdrop = Mage::helper("cornerdrop_collect")->isCornerDropAddress($address);
108
+
109
+ return $is_enabled && $is_cornerdrop;
110
+ }
111
+ }
app/code/community/CornerDrop/Collect/Test/.DS_Store ADDED
Binary file
app/code/community/CornerDrop/Collect/Test/Config/Base.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Config_Base extends EcomDev_PHPUnit_Test_Case_Config {
4
+
5
+ /**
6
+ * @test
7
+ */
8
+ public function testClassAlias() {
9
+ $this->assertHelperAlias('cornerdrop_collect/test', 'CornerDrop_Collect_Helper_Test');
10
+ $this->assertBlockAlias('cornerdrop_collect/test', 'CornerDrop_Collect_Block_Test');
11
+ $this->assertModelAlias('cornerdrop_collect/test', 'CornerDrop_Collect_Model_Test');
12
+ }
13
+
14
+ }
app/code/community/CornerDrop/Collect/Test/Helper/Data.php ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Helper_Data extends EcomDev_PHPUnit_Test_Case
4
+ {
5
+
6
+ /** @var CornerDrop_Collect_Helper_Data $helper */
7
+ protected $helper;
8
+
9
+ protected function setUp()
10
+ {
11
+ parent::setUp();
12
+
13
+ $this->helper = Mage::helper("cornerdrop_collect");
14
+ }
15
+
16
+ protected function tearDown()
17
+ {
18
+ unset($this->helper);
19
+
20
+ parent::tearDown();
21
+ }
22
+
23
+ public function testSearchReturnsResults()
24
+ {
25
+ $response_body = '{"result":{"results":[{"id":1,"displayName":"Test","latitude":51.320601,"longitude":-2.207436,"distance":7.6051834780367,"fullAddressHtml":"Test Street<br>Test City<br>Test County<br>AB1 1AB","address1":"Test Street","address2":"","address3":"","city":"Test City","county":"Test Region","country":"GB","postCode":"AB1 1AB","contactPhone":"123456789","openingHoursHtml":"Mon - Fri: 09:00 - 17:00<br>Sat: 09:00 - 17:00<br>","siteMarketing":"Test Description","availableSlots":5,"totalSlots":5}]},"code":2000,"message":"Success"}';
26
+ $result = array(
27
+ array(
28
+ "id" => 1,
29
+ "name" => "Test",
30
+ "description" => "Test Description",
31
+ "address" => array(
32
+ "vat_id" => null,
33
+ "prefix" => null,
34
+ "firstname" => null,
35
+ "middlename" => null,
36
+ "lastname" => null,
37
+ "suffix" => null,
38
+ "company" => "Test",
39
+ "street" => array(
40
+ "Test Street",
41
+ "",
42
+ ""
43
+ ),
44
+ "city" => "Test City",
45
+ "region" => "Test Region",
46
+ "postcode" => "AB1 1AB",
47
+ "country_id" => "GB",
48
+ "telephone" => "123456789",
49
+ "fax" => null,
50
+ "email" => null
51
+ ),
52
+ "addressHtml" => "Test Street<br>Test City<br>Test County<br>AB1 1AB",
53
+ "location" => array(
54
+ "distance" => 7.6051834780367,
55
+ "latitude" => 51.320601,
56
+ "longitude" => -2.207436
57
+ ),
58
+ "availability" => array(
59
+ "available" => 5,
60
+ "total" => 5
61
+ ),
62
+ "openingHoursHtml" => "Mon - Fri: 09:00 - 17:00<br>Sat: 09:00 - 17:00<br>"
63
+ )
64
+ );
65
+
66
+ $api_action = $this->getModelMock("cornerdrop_collect/api_action_search", array("execute"));
67
+ $api_action
68
+ ->expects($this->once())
69
+ ->method("execute")
70
+ ->will($this->returnValue(
71
+ Mage::getModel("cornerdrop_collect/api_response")
72
+ ->setRawResponse(new Zend_Http_Response(200, array(), $response_body))
73
+ ));
74
+ $this->replaceByMock("model", "cornerdrop_collect/api_action_search", $api_action);
75
+
76
+ $this->assertEquals(
77
+ $result,
78
+ $this->helper->search(Mage::getModel("sales/quote"), "1", "1", "1"),
79
+ "Failed asserting that search method returns results array on success."
80
+ );
81
+ }
82
+
83
+ public function testSearchReturnsNullOnFailure()
84
+ {
85
+ $api_action = $this->getModelMock("cornerdrop_collect/api_action_search", array("execute"));
86
+ $api_action
87
+ ->expects($this->once())
88
+ ->method("execute")
89
+ ->will($this->returnValue(
90
+ Mage::getModel("cornerdrop_collect/api_response")
91
+ ->setRawResponse(new Zend_Http_Response(500, array(), ""))
92
+ ));
93
+ $this->replaceByMock("model", "cornerdrop_collect/api_action_search", $api_action);
94
+
95
+ $this->assertNull(
96
+ $this->helper->search(Mage::getModel("sales/quote"), "1", "1", "1"),
97
+ "Failed asserting that search method returns null on failure."
98
+ );
99
+ }
100
+
101
+ public function testSearchReturnsNullOnError()
102
+ {
103
+ $api_action = $this->getModelMock("cornerdrop_collect/api_action_search", array("execute"));
104
+ $api_action
105
+ ->expects($this->once())
106
+ ->method("execute")
107
+ ->will($this->throwException(new Exception("Test exception")));
108
+ $this->replaceByMock("model", "cornerdrop_collect/api_action_search", $api_action);
109
+
110
+ $this->assertNull(
111
+ $this->helper->search(Mage::getModel("sales/quote"), "1", "1", "1"),
112
+ "Failed asserting that search method returns null on error."
113
+ );
114
+ }
115
+ }
app/code/community/CornerDrop/Collect/Test/Model/Api/Action.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Model_Api_Action extends CornerDrop_Collect_Test_Model_Api_Test_Case
4
+ {
5
+ public function setUp()
6
+ {
7
+ parent::setUp();
8
+
9
+ @session_start(); // Ignore header errors when attempting to start a session
10
+ }
11
+
12
+ /**
13
+ * @loadFixture
14
+ * @test
15
+ */
16
+ public function testExecute()
17
+ {
18
+ $response_model = Mage::getModel('cornerdrop_collect/api_response');
19
+ $response_model
20
+ ->setRawResponse(new Zend_Http_Response(200, array(), 'test response'));
21
+
22
+ $request_model = $this->getModelMock('cornerdrop_collect/api_request', array('send'));
23
+ $request_model
24
+ ->expects($this->once())
25
+ ->method('send')
26
+ ->will($this->returnValue($response_model));
27
+
28
+ $action = Mage::getModel('cornerdrop_collect/api_action_status');
29
+ $action
30
+ ->setApiIdentifier('test')
31
+ ->setRequest($request_model)
32
+ ->setResponse($response_model);
33
+
34
+ // Ensure the response matches our expected response.
35
+ $this->assertEquals($response_model, $action->execute(null, null));
36
+
37
+ // Ensure the request method is correct
38
+ $this->assertEquals('GET', $action->getRequest()->getMethod());
39
+
40
+ // Ensure the endpoint is correct
41
+ $this->assertEquals('https://testapi.cornerdrop.com/status', $action->getRequest()->getEndpoint());
42
+
43
+ // Ensure the headers are correct
44
+ $headers = array(
45
+ 'ApiKey' => null,
46
+ 'Identifier' => 'test',
47
+ 'SessionId' => null,
48
+ 'UserHostAddress' => null
49
+ );
50
+ $this->assertEquals($headers, $action->getRequest()->getHeaders());
51
+ }
52
+ }
app/code/community/CornerDrop/Collect/Test/Model/Api/Action/fixtures/testExecute.yaml ADDED
@@ -0,0 +1,2 @@
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/api_uri: https://testapi.cornerdrop.com
app/code/community/CornerDrop/Collect/Test/Model/Api/Request.php ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Model_Api_Request extends CornerDrop_Collect_Test_Model_Api_Test_Case
4
+ {
5
+ /**
6
+ * @test
7
+ * @expectedException Mage_Core_Exception
8
+ */
9
+ public function testSendNoEndpoint()
10
+ {
11
+ $model = $this->getModelMock('cornerdrop_collect/api_request', array('getClient'));
12
+ $model
13
+ ->expects($this->never())
14
+ ->method('getClient');
15
+
16
+ $model->send();
17
+ }
18
+
19
+ /**
20
+ * @test
21
+ */
22
+ public function testSendNoResponse()
23
+ {
24
+ $http_client = $this->getMock('Zend_Http_Client', array('request'));
25
+ $http_client
26
+ ->expects($this->once())
27
+ ->method('request')
28
+ ->will($this->throwException(new Zend_Http_Client_Exception('Test exception')));
29
+
30
+ $model = Mage::getModel('cornerdrop_collect/api_request');
31
+ $model
32
+ ->setClient($http_client)
33
+ ->setEndpoint('http://test.cornerdrop.com/');
34
+
35
+ $this->assertInstanceOf('CornerDrop_Collect_Model_Api_Response_Empty', $model->send());
36
+ }
37
+
38
+ /**
39
+ * @test
40
+ */
41
+ public function testSendValidResponse()
42
+ {
43
+ $test_raw_response = new Zend_Http_Response(200, array());
44
+
45
+ $http_client = $this->getMock('Zend_Http_Client', array('request'));
46
+ $http_client
47
+ ->expects($this->once())
48
+ ->method('request')
49
+ ->will($this->returnValue($test_raw_response));
50
+
51
+ $response_model = $this->getModelMock('cornerdrop_collect/api_response', array('getRawResponse'));
52
+ $response_model
53
+ ->method('getRawResponse')
54
+ ->will($this->returnValue($test_raw_response));
55
+
56
+ $request_model = Mage::getModel('cornerdrop_collect/api_request');
57
+ $request_model
58
+ ->setClient($http_client)
59
+ ->setEndpoint('http://test.cornerdrop.com/')
60
+ ->setResponseModel($response_model);
61
+
62
+ $this->assertInstanceOf('CornerDrop_Collect_Model_Api_Response', $request_model->send());
63
+ }
64
+ }
app/code/community/CornerDrop/Collect/Test/Model/Api/Response.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Model_Api_Response extends CornerDrop_Collect_Test_Model_Api_Test_Case
4
+ {
5
+ /**
6
+ * @test
7
+ * @dataProvider dataProvider
8
+ * @dataProviderFile response_testIsSuccessful.yaml
9
+ */
10
+ public function testIsSuccessful($response_code, $response_data_file, $is_successful)
11
+ {
12
+ $response_body = ($response_data_file) ? $this->getDataFileContents($response_data_file) : "";
13
+ $http_response = new Zend_Http_Response($response_code, array(), $response_body);
14
+ $model = Mage::getModel('cornerdrop_collect/api_response');
15
+ $model->setRawResponse($http_response);
16
+
17
+ $this->assertEquals($is_successful, $model->isSuccessful());
18
+ }
19
+ }
app/code/community/CornerDrop/Collect/Test/Model/Api/Response/providers/response_testIsSuccessful.yaml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ success:
2
+ response_code: 200
3
+ response_data_file: "response_valid.json"
4
+ is_successful: true
5
+ nojson:
6
+ response_code: 200
7
+ response_data_file: "response_nojson.json"
8
+ is_successful: false
9
+ httpfailcode:
10
+ response_code: 500
11
+ response_data_file: "response_valid.json"
12
+ is_successful: false
13
+ apifailcode:
14
+ response_code: 200
15
+ response_data_file: "response_failed.json"
16
+ is_successful: false
app/code/community/CornerDrop/Collect/Test/Model/Api/Test/Case.php ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ abstract class CornerDrop_Collect_Test_Model_Api_Test_Case extends EcomDev_PHPUnit_Test_Case
4
+ {
5
+ protected function getDataFileContents($file) {
6
+ $directory_tree = array(
7
+ Mage::getModuleDir('', 'CornerDrop_Collect'),
8
+ 'Test',
9
+ 'Model',
10
+ 'Api',
11
+ 'data',
12
+ $file
13
+ );
14
+
15
+ $file_path = join(DS, $directory_tree);
16
+
17
+ return file_get_contents($file_path);
18
+ }
19
+ }
app/code/community/CornerDrop/Collect/Test/Model/Api/data/data_response_success.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ {
2
+ "result": {
3
+ "creditBalance": 10
4
+ },
5
+ "code": 2000,
6
+ "message": "Success"
7
+ }
app/code/community/CornerDrop/Collect/Test/Model/Api/data/response_failed.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ {
2
+ "result": {},
3
+ "code": 4010,
4
+ "message": "Api key not supplied"
5
+ }
app/code/community/CornerDrop/Collect/Test/Model/Api/data/response_nojson.json ADDED
@@ -0,0 +1 @@
 
1
+ TEST
app/code/community/CornerDrop/Collect/Test/Model/Api/data/response_valid.json ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
1
+ {
2
+ "result": {
3
+ "creditBalance": 10
4
+ },
5
+ "code": 2000,
6
+ "message": "Success"
7
+ }
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/Fee.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Model_Sales_Order_Creditmemo_Total_CornerDrop_Fee extends EcomDev_PHPUnit_Test_Case {
4
+
5
+ /**
6
+ * Test the CornerDrop fee is added with tax.
7
+ *
8
+ * @test
9
+ * @loadFixture
10
+ */
11
+ public function testCornerDropFeeAddedWithTax() {
12
+ $values = $this->_getValues();
13
+ $this->assertEquals(10, $values['total_fee']);
14
+ $this->assertEquals(10, $values['base_total_fee']);
15
+ $this->assertEquals(1, $values['tax']);
16
+ $this->assertEquals(1, $values['base_tax']);
17
+ }
18
+
19
+ /**
20
+ * Test the CornerDrop Fee is added without tax.
21
+ *
22
+ * @test
23
+ * @loadFixture
24
+ */
25
+ public function testCornerDropFeeAddedWithNoTax() {
26
+ $values = $this->_getValues();
27
+ $this->assertEquals(10, $values['total_fee']);
28
+ $this->assertEquals(10, $values['base_total_fee']);
29
+ $this->assertEquals(0, $values['tax']);
30
+ $this->assertEquals(0, $values['base_tax']);
31
+ }
32
+
33
+ /**
34
+ * Check the CornerDrop Fee is not added to the invoice
35
+ * if the order is not a CornerDrop order.
36
+ *
37
+ * @test
38
+ * @loadFixture
39
+ */
40
+ public function testCornerDropFeeNotAdded() {
41
+ $values = $this->_getValues();
42
+ $this->assertEquals(0, $values['total_fee']);
43
+ $this->assertEquals(0, $values['base_total_fee']);
44
+ }
45
+
46
+ /**
47
+ * Get the values which vary based on the loaded fixture.
48
+ *
49
+ * @return array
50
+ */
51
+ private function _getValues() {
52
+ /** @var Mage_Sales_Model_Order_Creditmemo $creditmemo */
53
+ $creditmemo = Mage::getModel('sales/order_creditmemo')->getCollection()->getFirstItem();
54
+ /** @var CornerDrop_Collect_Model_Sales_Order_Creditmemo_Total_CornerDrop_Fee $total */
55
+ $total = Mage::getModel('cornerdrop_collect/sales_order_creditmemo_total_cornerdrop_fee');
56
+
57
+ $total->collect($creditmemo);
58
+
59
+ $total_fee = $creditmemo->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT);
60
+ $base_total_fee = $creditmemo->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT);
61
+ $tax = $creditmemo->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX);
62
+ $base_tax = $creditmemo->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX);
63
+
64
+
65
+ return compact(
66
+ 'total_fee',
67
+ 'base_total_fee',
68
+ 'tax',
69
+ 'base_tax'
70
+ );
71
+ }
72
+
73
+ }
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/fixtures/testCornerDropFeeAddedWithNoTax.yaml ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 1
3
+ default/cornerdrop_collect/fee_settings/include_tax: 1
4
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
5
+ eav:
6
+ catalog_product:
7
+ -
8
+ entity_id: 422
9
+ entity_type_id: 4
10
+ attribute_set_id: 4
11
+ type_id: simple
12
+ sku: CDTP
13
+ has_options: 0
14
+ required_options: 0
15
+ created_at: 2015-04-20 10:12:06
16
+ updated_at: 2015-04-20 10:13:06
17
+ tables:
18
+ sales_flat_order:
19
+ -
20
+ entity_id: 1
21
+ state: processing
22
+ status: processing
23
+ coupon_code: null
24
+ protect_code: 151a17
25
+ shipping_description: Flat Rate - Fixed
26
+ is_virtual: 0
27
+ store_id: 1
28
+ customer_id: null
29
+ base_discount_amount: 0
30
+ base_discount_canceled: null
31
+ base_discount_invoiced: 0
32
+ base_discount_refunded: null
33
+ base_grand_total: 115
34
+ base_shipping_amount: 5
35
+ base_shipping_canceled: null
36
+ base_shipping_invoiced: 5
37
+ base_shipping_refunded: null
38
+ base_shipping_tax_amount: 0
39
+ base_shipping_tax_refunded: null
40
+ base_subtotal: 100
41
+ base_subtotal_canceled: null
42
+ base_subtotal_invoiced: 100
43
+ base_subtotal_refunded: null
44
+ base_tax_amount: 0
45
+ base_tax_canceled: null
46
+ base_tax_invoiced: 0
47
+ base_tax_refunded: null
48
+ base_to_global_rate: 1
49
+ base_to_order_rate: 1
50
+ base_total_canceled: null
51
+ base_total_invoiced: 115
52
+ base_total_invoiced_cost: 0
53
+ base_total_offline_refunded: null
54
+ base_total_online_refunded: null
55
+ base_total_paid: 115
56
+ base_total_qty_ordered: null
57
+ base_total_refunded: null
58
+ discount_amount: 0
59
+ discount_canceled: null
60
+ discount_invoiced: 0
61
+ discount_refunded: null
62
+ grand_total: 115
63
+ shipping_amount: 5
64
+ shipping_canceled: null
65
+ shipping_invoiced: 5
66
+ shipping_refunded: null
67
+ shipping_tax_amount: 0
68
+ shipping_tax_refunded: null
69
+ store_to_base_rate: 1
70
+ store_to_order_rate: 1
71
+ subtotal: 100
72
+ subtotal_canceled: null
73
+ subtotal_invoiced: 100
74
+ subtotal_refunded: null
75
+ tax_amount: 0
76
+ tax_canceled: null
77
+ tax_invoiced: 0
78
+ tax_refunded: null
79
+ total_canceled: null
80
+ total_invoiced: 115
81
+ total_offline_refunded: null
82
+ total_online_refunded: null
83
+ total_paid: 115
84
+ total_qty_ordered: 1
85
+ total_refunded: null
86
+ can_ship_partially: null
87
+ can_ship_partially_item: null
88
+ customer_is_guest: 1
89
+ customer_note_notify: 0
90
+ billing_address_id: 1
91
+ customer_group_id: 0
92
+ edit_increment: null
93
+ email_sent: 1
94
+ forced_shipment_with_invoice: null
95
+ payment_auth_expiration: null
96
+ quote_address_id: null
97
+ quote_id: 19
98
+ shipping_address_id: 2
99
+ adjustment_negative: null
100
+ adjustment_positive: null
101
+ base_adjustment_negative: null
102
+ base_adjustment_positive: null
103
+ base_shipping_discount_amount: 0
104
+ base_subtotal_incl_tax: 100
105
+ base_total_due: 0
106
+ payment_authorization_amount: null
107
+ shipping_discount_amount: 0
108
+ subtotal_incl_tax: 100
109
+ total_due: 0
110
+ weight: 0
111
+ customer_dob: null
112
+ increment_id: 100000001
113
+ applied_rule_ids: null
114
+ base_currency_code: USD
115
+ customer_email: demo@example.com
116
+ customer_firstname: John
117
+ customer_lastname: Doe
118
+ customer_middlename: null
119
+ customer_prefix: null
120
+ customer_suffix: null
121
+ customer_taxvat: null
122
+ discount_description: null
123
+ ext_customer_id: null
124
+ ext_order_id: null
125
+ global_currency_code: USD
126
+ hold_before_state: null
127
+ hold_before_status: null
128
+ order_currency_code: USD
129
+ original_increment_id: null
130
+ relation_child_id: null
131
+ relation_child_real_id: null
132
+ relation_parent_id: null
133
+ relation_parent_real_id: null
134
+ remote_ip: 127.0.0.1
135
+ shipping_method: flatrate_flatrate
136
+ store_currency_code: USD
137
+ store_name: Main Website
138
+ Main Website Store
139
+ Default Store View
140
+ x_forwarded_for: null
141
+ customer_note: null
142
+ created_at: 2015-04-20 10:16:35
143
+ updated_at: 2015-04-20 10:21:15
144
+ total_item_count: 1
145
+ customer_gender: null
146
+ hidden_tax_amount: 0
147
+ base_hidden_tax_amount: 0
148
+ shipping_hidden_tax_amount: 0
149
+ base_shipping_hidden_tax_amnt: 0
150
+ hidden_tax_invoiced: 0
151
+ base_hidden_tax_invoiced: 0
152
+ hidden_tax_refunded: null
153
+ base_hidden_tax_refunded: null
154
+ shipping_incl_tax: 5
155
+ base_shipping_incl_tax: 5
156
+ coupon_rule_name: null
157
+ paypal_ipn_customer_notified: 0
158
+ gift_message_id: null
159
+ cornerdrop_fee_amount: 10
160
+ base_cornerdrop_fee_amount: 10
161
+ cornerdrop_tax_amount: null
162
+ base_cornerdrop_tax_amount: null
163
+ sales_flat_order_address:
164
+ -
165
+ entity_id: 1
166
+ parent_id: 1
167
+ customer_address_id: null
168
+ quote_address_id: null
169
+ region_id: 12
170
+ customer_id: null
171
+ fax: null
172
+ region: California
173
+ postcode: 90210
174
+ lastname: Tester
175
+ street: Test
176
+ city: Test
177
+ email: test@example.com
178
+ telephone: 123456789
179
+ country_id: US
180
+ firstname: Test
181
+ address_type: billing
182
+ prefix: null
183
+ middlename: null
184
+ suffix: null
185
+ company: null
186
+ vat_id: null
187
+ vat_is_valid: null
188
+ vat_request_id: null
189
+ vat_request_date: null
190
+ vat_request_success: null
191
+ giftregistry_item_id: null
192
+ is_cornerdrop_collect: null
193
+ -
194
+ entity_id: 2
195
+ parent_id: 1
196
+ customer_address_id: null
197
+ quote_address_id: null
198
+ region_id: 12
199
+ customer_id: null
200
+ fax: null
201
+ region: California
202
+ postcode: 90210
203
+ lastname: Tester
204
+ street: Test
205
+ city: Test
206
+ email: null
207
+ telephone: 123456789
208
+ country_id: US
209
+ firstname: Test
210
+ address_type: shipping
211
+ prefix: null
212
+ middlename: null
213
+ suffix: null
214
+ company: null
215
+ vat_id: null
216
+ vat_is_valid: null
217
+ vat_request_id: null
218
+ vat_request_date: null
219
+ vat_request_success: null
220
+ giftregistry_item_id: null
221
+ is_cornerdrop_collect: 1
222
+ sales_flat_creditmemo:
223
+ -
224
+ entity_id: 1
225
+ store_id: 1
226
+ adjustment_positive: 0
227
+ base_shipping_tax_amount: 0
228
+ store_to_order_rate: 1
229
+ base_discount_amount: -2.42
230
+ base_to_order_rate: 1
231
+ grand_total: 315.09
232
+ base_adjustment_negative: 0
233
+ base_subtotal_incl_tax: 305.2
234
+ shipping_amount: 12.52
235
+ subtotal_incl_tax: 305.2
236
+ adjustment_negative: 0
237
+ base_shipping_amount: 12.52
238
+ store_to_base_rate: 1
239
+ base_to_global_rate: 1
240
+ base_adjustment: 0
241
+ base_subtotal: 280
242
+ discount_amount: -2.42
243
+ subtotal: 280
244
+ adjustment: 0
245
+ base_grand_total: 315.09
246
+ base_adjustment_positive: 0
247
+ base_tax_amount: 24.99
248
+ shipping_tax_amount: 0
249
+ tax_amount: 24.99
250
+ order_id: 1
251
+ email_sent: null
252
+ creditmemo_status: null
253
+ state: 2
254
+ shipping_address_id: 2
255
+ billing_address_id: 1
256
+ invoice_id: null
257
+ store_currency_code: USD
258
+ order_currency_code: USD
259
+ base_currency_code: USD
260
+ global_currency_code: USD
261
+ transaction_id: null
262
+ increment_id: 100000005
263
+ created_at: 2013-05-29 14:38:28
264
+ updated_at: 2013-05-29 14:38:28
265
+ hidden_tax_amount: 0
266
+ base_hidden_tax_amount: 0
267
+ shipping_hidden_tax_amount: null
268
+ base_shipping_hidden_tax_amnt: null
269
+ shipping_incl_tax: 12.52
270
+ base_shipping_incl_tax: 12.52
271
+ base_customer_balance_amount: null
272
+ customer_balance_amount: null
273
+ bs_customer_bal_total_refunded: 315.09
274
+ customer_bal_total_refunded: 315.09
275
+ base_gift_cards_amount: null
276
+ gift_cards_amount: null
277
+ gw_base_price: null
278
+ gw_price: null
279
+ gw_items_base_price: null
280
+ gw_items_price: null
281
+ gw_card_base_price: null
282
+ gw_card_price: null
283
+ gw_base_tax_amount: null
284
+ gw_tax_amount: null
285
+ gw_items_base_tax_amount: null
286
+ gw_items_tax_amount: null
287
+ gw_card_base_tax_amount: null
288
+ gw_card_tax_amount: null
289
+ base_reward_currency_amount: null
290
+ reward_currency_amount: null
291
+ reward_points_balance: null
292
+ reward_points_balance_refund: null
293
+ discount_description: Register10
294
+ cybersource_token: null
295
+ cornerdrop_fee_amount: null
296
+ base_cornerdrop_fee_amount: null
297
+ cornerdrop_tax_amount: null
298
+ base_cornerdrop_tax_amount: null
299
+ sales_flat_creditmemo_grid:
300
+ -
301
+ entity_id: 1
302
+ store_id: 1
303
+ store_to_order_rate: 1
304
+ base_to_order_rate: 1
305
+ grand_total: 315.09
306
+ store_to_base_rate: 1
307
+ base_to_global_rate: 1
308
+ base_grand_total: 315.09
309
+ order_id: 187
310
+ creditmemo_status: null
311
+ state: 2
312
+ invoice_id: null
313
+ store_currency_code: USD
314
+ order_currency_code: USD
315
+ base_currency_code: USD
316
+ global_currency_code: USD
317
+ increment_id: 100000005
318
+ order_increment_id: 100000206
319
+ created_at: 2013-05-29 14:38:28
320
+ order_created_at: 2013-05-29 02:28:25
321
+ billing_name: John Doe
322
+ sales_flat_creditmemo_item:
323
+ -
324
+ entity_id: 1
325
+ parent_id: 1
326
+ base_price: 280
327
+ tax_amount: 24.99
328
+ base_row_total: 280
329
+ discount_amount: 2.42
330
+ row_total: 280
331
+ base_discount_amount: 2.42
332
+ price_incl_tax: 305.2
333
+ base_tax_amount: 24.99
334
+ base_price_incl_tax: 305.2
335
+ qty: 1
336
+ base_cost: null
337
+ price: 280
338
+ base_row_total_incl_tax: 305.2
339
+ row_total_incl_tax: 305.2
340
+ product_id: 422
341
+ order_item_id: 1
342
+ additional_data: null
343
+ description: null
344
+ sku: acj00124
345
+ name: Pearl Strand Necklace
346
+ hidden_tax_amount: 0
347
+ base_hidden_tax_amount: 0
348
+ weee_tax_disposition: 0
349
+ weee_tax_row_disposition: 0
350
+ base_weee_tax_disposition: 0
351
+ base_weee_tax_row_disposition: 0
352
+ weee_tax_applied: a:0:{}
353
+ base_weee_tax_applied_amount: 0
354
+ base_weee_tax_applied_row_amnt: 0
355
+ weee_tax_applied_amount: 0
356
+ weee_tax_applied_row_amount: 0
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/fixtures/testCornerDropFeeAddedWithTax.yaml ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 1
3
+ default/cornerdrop_collect/fee_settings/include_tax: 0
4
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
5
+ eav:
6
+ catalog_product:
7
+ -
8
+ entity_id: 422
9
+ entity_type_id: 4
10
+ attribute_set_id: 4
11
+ type_id: simple
12
+ sku: CDTP
13
+ has_options: 0
14
+ required_options: 0
15
+ created_at: 2015-04-20 10:12:06
16
+ updated_at: 2015-04-20 10:13:06
17
+ tables:
18
+ sales_flat_order:
19
+ -
20
+ entity_id: 1
21
+ state: processing
22
+ status: processing
23
+ coupon_code: null
24
+ protect_code: 151a17
25
+ shipping_description: Flat Rate - Fixed
26
+ is_virtual: 0
27
+ store_id: 1
28
+ customer_id: null
29
+ base_discount_amount: 0
30
+ base_discount_canceled: null
31
+ base_discount_invoiced: 0
32
+ base_discount_refunded: null
33
+ base_grand_total: 115
34
+ base_shipping_amount: 5
35
+ base_shipping_canceled: null
36
+ base_shipping_invoiced: 5
37
+ base_shipping_refunded: null
38
+ base_shipping_tax_amount: 0
39
+ base_shipping_tax_refunded: null
40
+ base_subtotal: 100
41
+ base_subtotal_canceled: null
42
+ base_subtotal_invoiced: 100
43
+ base_subtotal_refunded: null
44
+ base_tax_amount: 0
45
+ base_tax_canceled: null
46
+ base_tax_invoiced: 0
47
+ base_tax_refunded: null
48
+ base_to_global_rate: 1
49
+ base_to_order_rate: 1
50
+ base_total_canceled: null
51
+ base_total_invoiced: 115
52
+ base_total_invoiced_cost: 0
53
+ base_total_offline_refunded: null
54
+ base_total_online_refunded: null
55
+ base_total_paid: 115
56
+ base_total_qty_ordered: null
57
+ base_total_refunded: null
58
+ discount_amount: 0
59
+ discount_canceled: null
60
+ discount_invoiced: 0
61
+ discount_refunded: null
62
+ grand_total: 115
63
+ shipping_amount: 5
64
+ shipping_canceled: null
65
+ shipping_invoiced: 5
66
+ shipping_refunded: null
67
+ shipping_tax_amount: 0
68
+ shipping_tax_refunded: null
69
+ store_to_base_rate: 1
70
+ store_to_order_rate: 1
71
+ subtotal: 100
72
+ subtotal_canceled: null
73
+ subtotal_invoiced: 100
74
+ subtotal_refunded: null
75
+ tax_amount: 0
76
+ tax_canceled: null
77
+ tax_invoiced: 0
78
+ tax_refunded: null
79
+ total_canceled: null
80
+ total_invoiced: 115
81
+ total_offline_refunded: null
82
+ total_online_refunded: null
83
+ total_paid: 115
84
+ total_qty_ordered: 1
85
+ total_refunded: null
86
+ can_ship_partially: null
87
+ can_ship_partially_item: null
88
+ customer_is_guest: 1
89
+ customer_note_notify: 0
90
+ billing_address_id: 1
91
+ customer_group_id: 0
92
+ edit_increment: null
93
+ email_sent: 1
94
+ forced_shipment_with_invoice: null
95
+ payment_auth_expiration: null
96
+ quote_address_id: null
97
+ quote_id: 19
98
+ shipping_address_id: 2
99
+ adjustment_negative: null
100
+ adjustment_positive: null
101
+ base_adjustment_negative: null
102
+ base_adjustment_positive: null
103
+ base_shipping_discount_amount: 0
104
+ base_subtotal_incl_tax: 100
105
+ base_total_due: 0
106
+ payment_authorization_amount: null
107
+ shipping_discount_amount: 0
108
+ subtotal_incl_tax: 100
109
+ total_due: 0
110
+ weight: 0
111
+ customer_dob: null
112
+ increment_id: 100000001
113
+ applied_rule_ids: null
114
+ base_currency_code: USD
115
+ customer_email: demo@example.com
116
+ customer_firstname: John
117
+ customer_lastname: Doe
118
+ customer_middlename: null
119
+ customer_prefix: null
120
+ customer_suffix: null
121
+ customer_taxvat: null
122
+ discount_description: null
123
+ ext_customer_id: null
124
+ ext_order_id: null
125
+ global_currency_code: USD
126
+ hold_before_state: null
127
+ hold_before_status: null
128
+ order_currency_code: USD
129
+ original_increment_id: null
130
+ relation_child_id: null
131
+ relation_child_real_id: null
132
+ relation_parent_id: null
133
+ relation_parent_real_id: null
134
+ remote_ip: 127.0.0.1
135
+ shipping_method: flatrate_flatrate
136
+ store_currency_code: USD
137
+ store_name: Main Website
138
+ Main Website Store
139
+ Default Store View
140
+ x_forwarded_for: null
141
+ customer_note: null
142
+ created_at: 2015-04-20 10:16:35
143
+ updated_at: 2015-04-20 10:21:15
144
+ total_item_count: 1
145
+ customer_gender: null
146
+ hidden_tax_amount: 0
147
+ base_hidden_tax_amount: 0
148
+ shipping_hidden_tax_amount: 0
149
+ base_shipping_hidden_tax_amnt: 0
150
+ hidden_tax_invoiced: 0
151
+ base_hidden_tax_invoiced: 0
152
+ hidden_tax_refunded: null
153
+ base_hidden_tax_refunded: null
154
+ shipping_incl_tax: 5
155
+ base_shipping_incl_tax: 5
156
+ coupon_rule_name: null
157
+ paypal_ipn_customer_notified: 0
158
+ gift_message_id: null
159
+ cornerdrop_fee_amount: 10
160
+ base_cornerdrop_fee_amount: 10
161
+ cornerdrop_tax_amount: 1
162
+ base_cornerdrop_tax_amount: 1
163
+ sales_flat_order_address:
164
+ -
165
+ entity_id: 1
166
+ parent_id: 1
167
+ customer_address_id: null
168
+ quote_address_id: null
169
+ region_id: 12
170
+ customer_id: null
171
+ fax: null
172
+ region: California
173
+ postcode: 90210
174
+ lastname: Tester
175
+ street: Test
176
+ city: Test
177
+ email: test@example.com
178
+ telephone: 123456789
179
+ country_id: US
180
+ firstname: Test
181
+ address_type: billing
182
+ prefix: null
183
+ middlename: null
184
+ suffix: null
185
+ company: null
186
+ vat_id: null
187
+ vat_is_valid: null
188
+ vat_request_id: null
189
+ vat_request_date: null
190
+ vat_request_success: null
191
+ giftregistry_item_id: null
192
+ is_cornerdrop_collect: null
193
+ -
194
+ entity_id: 2
195
+ parent_id: 1
196
+ customer_address_id: null
197
+ quote_address_id: null
198
+ region_id: 12
199
+ customer_id: null
200
+ fax: null
201
+ region: California
202
+ postcode: 90210
203
+ lastname: Tester
204
+ street: Test
205
+ city: Test
206
+ email: null
207
+ telephone: 123456789
208
+ country_id: US
209
+ firstname: Test
210
+ address_type: shipping
211
+ prefix: null
212
+ middlename: null
213
+ suffix: null
214
+ company: null
215
+ vat_id: null
216
+ vat_is_valid: null
217
+ vat_request_id: null
218
+ vat_request_date: null
219
+ vat_request_success: null
220
+ giftregistry_item_id: null
221
+ is_cornerdrop_collect: 1
222
+ sales_flat_creditmemo:
223
+ -
224
+ entity_id: 1
225
+ store_id: 1
226
+ adjustment_positive: 0
227
+ base_shipping_tax_amount: 0
228
+ store_to_order_rate: 1
229
+ base_discount_amount: -2.42
230
+ base_to_order_rate: 1
231
+ grand_total: 315.09
232
+ base_adjustment_negative: 0
233
+ base_subtotal_incl_tax: 305.2
234
+ shipping_amount: 12.52
235
+ subtotal_incl_tax: 305.2
236
+ adjustment_negative: 0
237
+ base_shipping_amount: 12.52
238
+ store_to_base_rate: 1
239
+ base_to_global_rate: 1
240
+ base_adjustment: 0
241
+ base_subtotal: 280
242
+ discount_amount: -2.42
243
+ subtotal: 280
244
+ adjustment: 0
245
+ base_grand_total: 315.09
246
+ base_adjustment_positive: 0
247
+ base_tax_amount: 24.99
248
+ shipping_tax_amount: 0
249
+ tax_amount: 24.99
250
+ order_id: 1
251
+ email_sent: null
252
+ creditmemo_status: null
253
+ state: 2
254
+ shipping_address_id: 2
255
+ billing_address_id: 1
256
+ invoice_id: null
257
+ store_currency_code: USD
258
+ order_currency_code: USD
259
+ base_currency_code: USD
260
+ global_currency_code: USD
261
+ transaction_id: null
262
+ increment_id: 100000005
263
+ created_at: 2013-05-29 14:38:28
264
+ updated_at: 2013-05-29 14:38:28
265
+ hidden_tax_amount: 0
266
+ base_hidden_tax_amount: 0
267
+ shipping_hidden_tax_amount: null
268
+ base_shipping_hidden_tax_amnt: null
269
+ shipping_incl_tax: 12.52
270
+ base_shipping_incl_tax: 12.52
271
+ base_customer_balance_amount: null
272
+ customer_balance_amount: null
273
+ bs_customer_bal_total_refunded: 315.09
274
+ customer_bal_total_refunded: 315.09
275
+ base_gift_cards_amount: null
276
+ gift_cards_amount: null
277
+ gw_base_price: null
278
+ gw_price: null
279
+ gw_items_base_price: null
280
+ gw_items_price: null
281
+ gw_card_base_price: null
282
+ gw_card_price: null
283
+ gw_base_tax_amount: null
284
+ gw_tax_amount: null
285
+ gw_items_base_tax_amount: null
286
+ gw_items_tax_amount: null
287
+ gw_card_base_tax_amount: null
288
+ gw_card_tax_amount: null
289
+ base_reward_currency_amount: null
290
+ reward_currency_amount: null
291
+ reward_points_balance: null
292
+ reward_points_balance_refund: null
293
+ discount_description: Register10
294
+ cybersource_token: null
295
+ cornerdrop_fee_amount: null
296
+ base_cornerdrop_fee_amount: null
297
+ cornerdrop_tax_amount: null
298
+ base_cornerdrop_tax_amount: null
299
+ sales_flat_creditmemo_grid:
300
+ -
301
+ entity_id: 1
302
+ store_id: 1
303
+ store_to_order_rate: 1
304
+ base_to_order_rate: 1
305
+ grand_total: 315.09
306
+ store_to_base_rate: 1
307
+ base_to_global_rate: 1
308
+ base_grand_total: 315.09
309
+ order_id: 187
310
+ creditmemo_status: null
311
+ state: 2
312
+ invoice_id: null
313
+ store_currency_code: USD
314
+ order_currency_code: USD
315
+ base_currency_code: USD
316
+ global_currency_code: USD
317
+ increment_id: 100000005
318
+ order_increment_id: 100000206
319
+ created_at: 2013-05-29 14:38:28
320
+ order_created_at: 2013-05-29 02:28:25
321
+ billing_name: John Doe
322
+ sales_flat_creditmemo_item:
323
+ -
324
+ entity_id: 1
325
+ parent_id: 1
326
+ base_price: 280
327
+ tax_amount: 24.99
328
+ base_row_total: 280
329
+ discount_amount: 2.42
330
+ row_total: 280
331
+ base_discount_amount: 2.42
332
+ price_incl_tax: 305.2
333
+ base_tax_amount: 24.99
334
+ base_price_incl_tax: 305.2
335
+ qty: 1
336
+ base_cost: null
337
+ price: 280
338
+ base_row_total_incl_tax: 305.2
339
+ row_total_incl_tax: 305.2
340
+ product_id: 422
341
+ order_item_id: 1
342
+ additional_data: null
343
+ description: null
344
+ sku: acj00124
345
+ name: Pearl Strand Necklace
346
+ hidden_tax_amount: 0
347
+ base_hidden_tax_amount: 0
348
+ weee_tax_disposition: 0
349
+ weee_tax_row_disposition: 0
350
+ base_weee_tax_disposition: 0
351
+ base_weee_tax_row_disposition: 0
352
+ weee_tax_applied: a:0:{}
353
+ base_weee_tax_applied_amount: 0
354
+ base_weee_tax_applied_row_amnt: 0
355
+ weee_tax_applied_amount: 0
356
+ weee_tax_applied_row_amount: 0
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Creditmemo/Total/CornerDrop/fixtures/testCornerDropFeeNotAdded.yaml ADDED
@@ -0,0 +1,356 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 0
3
+ default/cornerdrop_collect/fee_settings/include_tax: 0
4
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
5
+ eav:
6
+ catalog_product:
7
+ -
8
+ entity_id: 422
9
+ entity_type_id: 4
10
+ attribute_set_id: 4
11
+ type_id: simple
12
+ sku: CDTP
13
+ has_options: 0
14
+ required_options: 0
15
+ created_at: 2015-04-20 10:12:06
16
+ updated_at: 2015-04-20 10:13:06
17
+ tables:
18
+ sales_flat_order:
19
+ -
20
+ entity_id: 1
21
+ state: processing
22
+ status: processing
23
+ coupon_code: null
24
+ protect_code: 151a17
25
+ shipping_description: Flat Rate - Fixed
26
+ is_virtual: 0
27
+ store_id: 1
28
+ customer_id: null
29
+ base_discount_amount: 0
30
+ base_discount_canceled: null
31
+ base_discount_invoiced: 0
32
+ base_discount_refunded: null
33
+ base_grand_total: 115
34
+ base_shipping_amount: 5
35
+ base_shipping_canceled: null
36
+ base_shipping_invoiced: 5
37
+ base_shipping_refunded: null
38
+ base_shipping_tax_amount: 0
39
+ base_shipping_tax_refunded: null
40
+ base_subtotal: 100
41
+ base_subtotal_canceled: null
42
+ base_subtotal_invoiced: 100
43
+ base_subtotal_refunded: null
44
+ base_tax_amount: 0
45
+ base_tax_canceled: null
46
+ base_tax_invoiced: 0
47
+ base_tax_refunded: null
48
+ base_to_global_rate: 1
49
+ base_to_order_rate: 1
50
+ base_total_canceled: null
51
+ base_total_invoiced: 115
52
+ base_total_invoiced_cost: 0
53
+ base_total_offline_refunded: null
54
+ base_total_online_refunded: null
55
+ base_total_paid: 115
56
+ base_total_qty_ordered: null
57
+ base_total_refunded: null
58
+ discount_amount: 0
59
+ discount_canceled: null
60
+ discount_invoiced: 0
61
+ discount_refunded: null
62
+ grand_total: 115
63
+ shipping_amount: 5
64
+ shipping_canceled: null
65
+ shipping_invoiced: 5
66
+ shipping_refunded: null
67
+ shipping_tax_amount: 0
68
+ shipping_tax_refunded: null
69
+ store_to_base_rate: 1
70
+ store_to_order_rate: 1
71
+ subtotal: 100
72
+ subtotal_canceled: null
73
+ subtotal_invoiced: 100
74
+ subtotal_refunded: null
75
+ tax_amount: 0
76
+ tax_canceled: null
77
+ tax_invoiced: 0
78
+ tax_refunded: null
79
+ total_canceled: null
80
+ total_invoiced: 115
81
+ total_offline_refunded: null
82
+ total_online_refunded: null
83
+ total_paid: 115
84
+ total_qty_ordered: 1
85
+ total_refunded: null
86
+ can_ship_partially: null
87
+ can_ship_partially_item: null
88
+ customer_is_guest: 1
89
+ customer_note_notify: 0
90
+ billing_address_id: 1
91
+ customer_group_id: 0
92
+ edit_increment: null
93
+ email_sent: 1
94
+ forced_shipment_with_invoice: null
95
+ payment_auth_expiration: null
96
+ quote_address_id: null
97
+ quote_id: 19
98
+ shipping_address_id: 2
99
+ adjustment_negative: null
100
+ adjustment_positive: null
101
+ base_adjustment_negative: null
102
+ base_adjustment_positive: null
103
+ base_shipping_discount_amount: 0
104
+ base_subtotal_incl_tax: 100
105
+ base_total_due: 0
106
+ payment_authorization_amount: null
107
+ shipping_discount_amount: 0
108
+ subtotal_incl_tax: 100
109
+ total_due: 0
110
+ weight: 0
111
+ customer_dob: null
112
+ increment_id: 100000001
113
+ applied_rule_ids: null
114
+ base_currency_code: USD
115
+ customer_email: demo@example.com
116
+ customer_firstname: John
117
+ customer_lastname: Doe
118
+ customer_middlename: null
119
+ customer_prefix: null
120
+ customer_suffix: null
121
+ customer_taxvat: null
122
+ discount_description: null
123
+ ext_customer_id: null
124
+ ext_order_id: null
125
+ global_currency_code: USD
126
+ hold_before_state: null
127
+ hold_before_status: null
128
+ order_currency_code: USD
129
+ original_increment_id: null
130
+ relation_child_id: null
131
+ relation_child_real_id: null
132
+ relation_parent_id: null
133
+ relation_parent_real_id: null
134
+ remote_ip: 127.0.0.1
135
+ shipping_method: flatrate_flatrate
136
+ store_currency_code: USD
137
+ store_name: Main Website
138
+ Main Website Store
139
+ Default Store View
140
+ x_forwarded_for: null
141
+ customer_note: null
142
+ created_at: 2015-04-20 10:16:35
143
+ updated_at: 2015-04-20 10:21:15
144
+ total_item_count: 1
145
+ customer_gender: null
146
+ hidden_tax_amount: 0
147
+ base_hidden_tax_amount: 0
148
+ shipping_hidden_tax_amount: 0
149
+ base_shipping_hidden_tax_amnt: 0
150
+ hidden_tax_invoiced: 0
151
+ base_hidden_tax_invoiced: 0
152
+ hidden_tax_refunded: null
153
+ base_hidden_tax_refunded: null
154
+ shipping_incl_tax: 5
155
+ base_shipping_incl_tax: 5
156
+ coupon_rule_name: null
157
+ paypal_ipn_customer_notified: 0
158
+ gift_message_id: null
159
+ cornerdrop_fee_amount: 0
160
+ base_cornerdrop_fee_amount: 0
161
+ cornerdrop_tax_amount: null
162
+ base_cornerdrop_tax_amount: null
163
+ sales_flat_order_address:
164
+ -
165
+ entity_id: 1
166
+ parent_id: 1
167
+ customer_address_id: null
168
+ quote_address_id: null
169
+ region_id: 12
170
+ customer_id: null
171
+ fax: null
172
+ region: California
173
+ postcode: 90210
174
+ lastname: Tester
175
+ street: Test
176
+ city: Test
177
+ email: test@example.com
178
+ telephone: 123456789
179
+ country_id: US
180
+ firstname: Test
181
+ address_type: billing
182
+ prefix: null
183
+ middlename: null
184
+ suffix: null
185
+ company: null
186
+ vat_id: null
187
+ vat_is_valid: null
188
+ vat_request_id: null
189
+ vat_request_date: null
190
+ vat_request_success: null
191
+ giftregistry_item_id: null
192
+ is_cornerdrop_collect: null
193
+ -
194
+ entity_id: 2
195
+ parent_id: 1
196
+ customer_address_id: null
197
+ quote_address_id: null
198
+ region_id: 12
199
+ customer_id: null
200
+ fax: null
201
+ region: California
202
+ postcode: 90210
203
+ lastname: Tester
204
+ street: Test
205
+ city: Test
206
+ email: null
207
+ telephone: 123456789
208
+ country_id: US
209
+ firstname: Test
210
+ address_type: shipping
211
+ prefix: null
212
+ middlename: null
213
+ suffix: null
214
+ company: null
215
+ vat_id: null
216
+ vat_is_valid: null
217
+ vat_request_id: null
218
+ vat_request_date: null
219
+ vat_request_success: null
220
+ giftregistry_item_id: null
221
+ is_cornerdrop_collect: 0
222
+ sales_flat_creditmemo:
223
+ -
224
+ entity_id: 1
225
+ store_id: 1
226
+ adjustment_positive: 0
227
+ base_shipping_tax_amount: 0
228
+ store_to_order_rate: 1
229
+ base_discount_amount: -2.42
230
+ base_to_order_rate: 1
231
+ grand_total: 315.09
232
+ base_adjustment_negative: 0
233
+ base_subtotal_incl_tax: 305.2
234
+ shipping_amount: 12.52
235
+ subtotal_incl_tax: 305.2
236
+ adjustment_negative: 0
237
+ base_shipping_amount: 12.52
238
+ store_to_base_rate: 1
239
+ base_to_global_rate: 1
240
+ base_adjustment: 0
241
+ base_subtotal: 280
242
+ discount_amount: -2.42
243
+ subtotal: 280
244
+ adjustment: 0
245
+ base_grand_total: 315.09
246
+ base_adjustment_positive: 0
247
+ base_tax_amount: 24.99
248
+ shipping_tax_amount: 0
249
+ tax_amount: 24.99
250
+ order_id: 1
251
+ email_sent: null
252
+ creditmemo_status: null
253
+ state: 2
254
+ shipping_address_id: 2
255
+ billing_address_id: 1
256
+ invoice_id: null
257
+ store_currency_code: USD
258
+ order_currency_code: USD
259
+ base_currency_code: USD
260
+ global_currency_code: USD
261
+ transaction_id: null
262
+ increment_id: 100000005
263
+ created_at: 2013-05-29 14:38:28
264
+ updated_at: 2013-05-29 14:38:28
265
+ hidden_tax_amount: 0
266
+ base_hidden_tax_amount: 0
267
+ shipping_hidden_tax_amount: null
268
+ base_shipping_hidden_tax_amnt: null
269
+ shipping_incl_tax: 12.52
270
+ base_shipping_incl_tax: 12.52
271
+ base_customer_balance_amount: null
272
+ customer_balance_amount: null
273
+ bs_customer_bal_total_refunded: 315.09
274
+ customer_bal_total_refunded: 315.09
275
+ base_gift_cards_amount: null
276
+ gift_cards_amount: null
277
+ gw_base_price: null
278
+ gw_price: null
279
+ gw_items_base_price: null
280
+ gw_items_price: null
281
+ gw_card_base_price: null
282
+ gw_card_price: null
283
+ gw_base_tax_amount: null
284
+ gw_tax_amount: null
285
+ gw_items_base_tax_amount: null
286
+ gw_items_tax_amount: null
287
+ gw_card_base_tax_amount: null
288
+ gw_card_tax_amount: null
289
+ base_reward_currency_amount: null
290
+ reward_currency_amount: null
291
+ reward_points_balance: null
292
+ reward_points_balance_refund: null
293
+ discount_description: Register10
294
+ cybersource_token: null
295
+ cornerdrop_fee_amount: null
296
+ base_cornerdrop_fee_amount: null
297
+ cornerdrop_tax_amount: null
298
+ base_cornerdrop_tax_amount: null
299
+ sales_flat_creditmemo_grid:
300
+ -
301
+ entity_id: 1
302
+ store_id: 1
303
+ store_to_order_rate: 1
304
+ base_to_order_rate: 1
305
+ grand_total: 315.09
306
+ store_to_base_rate: 1
307
+ base_to_global_rate: 1
308
+ base_grand_total: 315.09
309
+ order_id: 187
310
+ creditmemo_status: null
311
+ state: 2
312
+ invoice_id: null
313
+ store_currency_code: USD
314
+ order_currency_code: USD
315
+ base_currency_code: USD
316
+ global_currency_code: USD
317
+ increment_id: 100000005
318
+ order_increment_id: 100000206
319
+ created_at: 2013-05-29 14:38:28
320
+ order_created_at: 2013-05-29 02:28:25
321
+ billing_name: John Doe
322
+ sales_flat_creditmemo_item:
323
+ -
324
+ entity_id: 1
325
+ parent_id: 1
326
+ base_price: 280
327
+ tax_amount: 24.99
328
+ base_row_total: 280
329
+ discount_amount: 2.42
330
+ row_total: 280
331
+ base_discount_amount: 2.42
332
+ price_incl_tax: 305.2
333
+ base_tax_amount: 24.99
334
+ base_price_incl_tax: 305.2
335
+ qty: 1
336
+ base_cost: null
337
+ price: 280
338
+ base_row_total_incl_tax: 305.2
339
+ row_total_incl_tax: 305.2
340
+ product_id: 422
341
+ order_item_id: 1
342
+ additional_data: null
343
+ description: null
344
+ sku: acj00124
345
+ name: Pearl Strand Necklace
346
+ hidden_tax_amount: 0
347
+ base_hidden_tax_amount: 0
348
+ weee_tax_disposition: 0
349
+ weee_tax_row_disposition: 0
350
+ base_weee_tax_disposition: 0
351
+ base_weee_tax_row_disposition: 0
352
+ weee_tax_applied: a:0:{}
353
+ base_weee_tax_applied_amount: 0
354
+ base_weee_tax_applied_row_amnt: 0
355
+ weee_tax_applied_amount: 0
356
+ weee_tax_applied_row_amount: 0
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee.php ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Model_Sales_Order_Invoice_Total_CornerDrop_Fee extends EcomDev_PHPUnit_Test_Case {
4
+
5
+ /**
6
+ * Test the CornerDrop fee is added with tax.
7
+ *
8
+ * @test
9
+ * @loadFixture
10
+ */
11
+ public function testCornerDropFeeAddedWithTax() {
12
+ $order = Mage::getModel("sales/order")->load(1);
13
+ $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice(array());
14
+
15
+ $this->assertEquals(10, $invoice->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT));
16
+ $this->assertEquals(10, $invoice->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT));
17
+ $this->assertEquals(1, $invoice->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX));
18
+ $this->assertEquals(1, $invoice->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX));
19
+ }
20
+
21
+ /**
22
+ * Test the CornerDrop fee is added without tax.
23
+ *
24
+ * @test
25
+ * @loadFixture
26
+ */
27
+ public function testCornerDropFeeAddedWithNoTax() {
28
+ $order = Mage::getModel("sales/order")->load(1);
29
+ $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice(array());
30
+
31
+ $this->assertEquals(10, $invoice->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT));
32
+ $this->assertEquals(10, $invoice->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT));
33
+ $this->assertEquals(0, $invoice->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX));
34
+ $this->assertEquals(0, $invoice->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX));
35
+ }
36
+
37
+ /**
38
+ * Check the CornerDrop Fee is not added to the invoice
39
+ * if the order is not a CornerDrop order.
40
+ *
41
+ * @test
42
+ * @loadFixture
43
+ */
44
+ public function testCornerDropFeeNotAdded() {
45
+ $order = Mage::getModel("sales/order")->load(1);
46
+ $invoice = Mage::getModel('sales/service_order', $order)->prepareInvoice(array());
47
+
48
+ $this->assertEquals(0, $invoice->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT));
49
+ $this->assertEquals(0, $invoice->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT));
50
+ $this->assertEquals(0, $invoice->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX));
51
+ $this->assertEquals(0, $invoice->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX));
52
+ }
53
+
54
+ }
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithNoTax.yaml ADDED
@@ -0,0 +1,382 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 1
3
+ default/cornerdrop_collect/fee_settings/include_tax: 1
4
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
5
+ eav:
6
+ catalog_product:
7
+ -
8
+ entity_id: 1
9
+ entity_type_id: 4
10
+ attribute_set_id: 4
11
+ type_id: simple
12
+ sku: CDTP
13
+ has_options: 0
14
+ required_options: 0
15
+ created_at: 2015-04-20 10:12:06
16
+ updated_at: 2015-04-20 10:13:06
17
+ tables:
18
+ sales_flat_order:
19
+ -
20
+ entity_id: 1
21
+ state: new
22
+ status: pending
23
+ coupon_code: null
24
+ protect_code: f0947e
25
+ shipping_description: Free Shipping - Free
26
+ is_virtual: 0
27
+ store_id: 1
28
+ customer_id: null
29
+ base_discount_amount: 0
30
+ base_discount_canceled: null
31
+ base_discount_invoiced: null
32
+ base_discount_refunded: null
33
+ base_grand_total: 415.94
34
+ base_shipping_amount: 0
35
+ base_shipping_canceled: null
36
+ base_shipping_invoiced: null
37
+ base_shipping_refunded: null
38
+ base_shipping_tax_amount: 0
39
+ base_shipping_tax_refunded: null
40
+ base_subtotal: 375
41
+ base_subtotal_canceled: null
42
+ base_subtotal_invoiced: null
43
+ base_subtotal_refunded: null
44
+ base_tax_amount: 30.94
45
+ base_tax_canceled: null
46
+ base_tax_invoiced: null
47
+ base_tax_refunded: null
48
+ base_to_global_rate: 1
49
+ base_to_order_rate: 1
50
+ base_total_canceled: null
51
+ base_total_invoiced: null
52
+ base_total_invoiced_cost: null
53
+ base_total_offline_refunded: null
54
+ base_total_online_refunded: null
55
+ base_total_paid: null
56
+ base_total_qty_ordered: null
57
+ base_total_refunded: null
58
+ discount_amount: 0
59
+ discount_canceled: null
60
+ discount_invoiced: null
61
+ discount_refunded: null
62
+ grand_total: 415.94
63
+ shipping_amount: 0
64
+ shipping_canceled: null
65
+ shipping_invoiced: null
66
+ shipping_refunded: null
67
+ shipping_tax_amount: 0
68
+ shipping_tax_refunded: null
69
+ store_to_base_rate: 1
70
+ store_to_order_rate: 1
71
+ subtotal: 375
72
+ subtotal_canceled: null
73
+ subtotal_invoiced: null
74
+ subtotal_refunded: null
75
+ tax_amount: 30.94
76
+ tax_canceled: null
77
+ tax_invoiced: null
78
+ tax_refunded: null
79
+ total_canceled: null
80
+ total_invoiced: null
81
+ total_offline_refunded: null
82
+ total_online_refunded: null
83
+ total_paid: null
84
+ total_qty_ordered: 1
85
+ total_refunded: null
86
+ can_ship_partially: null
87
+ can_ship_partially_item: null
88
+ customer_is_guest: 1
89
+ customer_note_notify: 1
90
+ billing_address_id: 1
91
+ customer_group_id: 0
92
+ edit_increment: null
93
+ email_sent: 1
94
+ forced_shipment_with_invoice: null
95
+ payment_auth_expiration: null
96
+ quote_address_id: null
97
+ quote_id: 703
98
+ shipping_address_id: 2
99
+ adjustment_negative: null
100
+ adjustment_positive: null
101
+ base_adjustment_negative: null
102
+ base_adjustment_positive: null
103
+ base_shipping_discount_amount: 0
104
+ base_subtotal_incl_tax: 405.94
105
+ base_total_due: null
106
+ payment_authorization_amount: null
107
+ shipping_discount_amount: 0
108
+ subtotal_incl_tax: 405.94
109
+ total_due: null
110
+ weight: 1
111
+ customer_dob: null
112
+ increment_id: 145000019
113
+ applied_rule_ids: null
114
+ base_currency_code: GBP
115
+ customer_email: test@example.com
116
+ customer_firstname: Test
117
+ customer_lastname: Tester
118
+ customer_middlename: null
119
+ customer_prefix: null
120
+ customer_suffix: null
121
+ customer_taxvat: null
122
+ discount_description: null
123
+ ext_customer_id: null
124
+ ext_order_id: null
125
+ global_currency_code: GBP
126
+ hold_before_state: null
127
+ hold_before_status: null
128
+ order_currency_code: GBP
129
+ original_increment_id: null
130
+ relation_child_id: null
131
+ relation_child_real_id: null
132
+ relation_parent_id: null
133
+ relation_parent_real_id: null
134
+ remote_ip: 127.0.0.1
135
+ shipping_method: freeshipping_freeshipping
136
+ store_currency_code: GBP
137
+ store_name: "Main Website\nMadison Island\nEnglish"
138
+ x_forwarded_for: null
139
+ customer_note: null
140
+ created_at: 2015-04-21 15:46:15
141
+ updated_at: 2015-04-21 15:46:15
142
+ total_item_count: 1
143
+ customer_gender: null
144
+ hidden_tax_amount: 0
145
+ base_hidden_tax_amount: 0
146
+ shipping_hidden_tax_amount: 0
147
+ base_shipping_hidden_tax_amnt: 0
148
+ hidden_tax_invoiced: null
149
+ base_hidden_tax_invoiced: null
150
+ hidden_tax_refunded: null
151
+ base_hidden_tax_refunded: null
152
+ shipping_incl_tax: 0
153
+ base_shipping_incl_tax: 0
154
+ coupon_rule_name: null
155
+ paypal_ipn_customer_notified: 0
156
+ gift_message_id: null
157
+ base_customer_balance_amount: null
158
+ customer_balance_amount: null
159
+ base_customer_balance_invoiced: null
160
+ customer_balance_invoiced: null
161
+ base_customer_balance_refunded: null
162
+ customer_balance_refunded: null
163
+ bs_customer_bal_total_refunded: null
164
+ customer_bal_total_refunded: null
165
+ gift_cards: null
166
+ base_gift_cards_amount: null
167
+ gift_cards_amount: null
168
+ base_gift_cards_invoiced: null
169
+ gift_cards_invoiced: null
170
+ base_gift_cards_refunded: null
171
+ gift_cards_refunded: null
172
+ gw_id: null
173
+ gw_allow_gift_receipt: null
174
+ gw_add_card: null
175
+ gw_base_price: null
176
+ gw_price: null
177
+ gw_items_base_price: null
178
+ gw_items_price: null
179
+ gw_card_base_price: null
180
+ gw_card_price: null
181
+ gw_base_tax_amount: null
182
+ gw_tax_amount: null
183
+ gw_items_base_tax_amount: null
184
+ gw_items_tax_amount: null
185
+ gw_card_base_tax_amount: null
186
+ gw_card_tax_amount: null
187
+ gw_base_price_invoiced: null
188
+ gw_price_invoiced: null
189
+ gw_items_base_price_invoiced: null
190
+ gw_items_price_invoiced: null
191
+ gw_card_base_price_invoiced: null
192
+ gw_card_price_invoiced: null
193
+ gw_base_tax_amount_invoiced: null
194
+ gw_tax_amount_invoiced: null
195
+ gw_items_base_tax_invoiced: null
196
+ gw_items_tax_invoiced: null
197
+ gw_card_base_tax_invoiced: null
198
+ gw_card_tax_invoiced: null
199
+ gw_base_price_refunded: null
200
+ gw_price_refunded: null
201
+ gw_items_base_price_refunded: null
202
+ gw_items_price_refunded: null
203
+ gw_card_base_price_refunded: null
204
+ gw_card_price_refunded: null
205
+ gw_base_tax_amount_refunded: null
206
+ gw_tax_amount_refunded: null
207
+ gw_items_base_tax_refunded: null
208
+ gw_items_tax_refunded: null
209
+ gw_card_base_tax_refunded: null
210
+ gw_card_tax_refunded: null
211
+ reward_points_balance: null
212
+ base_reward_currency_amount: null
213
+ reward_currency_amount: null
214
+ base_rwrd_crrncy_amt_invoiced: null
215
+ rwrd_currency_amount_invoiced: null
216
+ base_rwrd_crrncy_amnt_refnded: null
217
+ rwrd_crrncy_amnt_refunded: null
218
+ reward_points_balance_refund: null
219
+ reward_points_balance_refunded: null
220
+ reward_salesrule_points: null
221
+ cornerdrop_fee_amount: 10
222
+ base_cornerdrop_fee_amount: 10
223
+ cornerdrop_tax_amount: null
224
+ base_cornerdrop_tax_amount: null
225
+ sales_flat_order_address:
226
+ -
227
+ entity_id: 1
228
+ parent_id: 1
229
+ customer_address_id: null
230
+ quote_address_id: null
231
+ region_id: 12
232
+ customer_id: null
233
+ fax: null
234
+ region: California
235
+ postcode: 90210
236
+ lastname: Tester
237
+ street: 123 Test St
238
+ city: Test
239
+ email: test@example.com
240
+ telephone: 11231231234
241
+ country_id: US
242
+ firstname: Test
243
+ address_type: billing
244
+ prefix: null
245
+ middlename: null
246
+ suffix: null
247
+ company: null
248
+ vat_id: null
249
+ vat_is_valid: null
250
+ vat_request_id: null
251
+ vat_request_date: null
252
+ vat_request_success: null
253
+ giftregistry_item_id: null
254
+ is_cornerdrop_collect: null
255
+ -
256
+ entity_id: 2
257
+ parent_id: 1
258
+ customer_address_id: null
259
+ quote_address_id: null
260
+ region_id: 12
261
+ customer_id: null
262
+ fax: null
263
+ region: California
264
+ postcode: 90210
265
+ lastname: Tester
266
+ street: 123 Test St
267
+ city: Test
268
+ email: null
269
+ telephone: 11231231234
270
+ country_id: US
271
+ firstname: Test
272
+ address_type: shipping
273
+ prefix: null
274
+ middlename: null
275
+ suffix: null
276
+ company: null
277
+ vat_id: null
278
+ vat_is_valid: null
279
+ vat_request_id: null
280
+ vat_request_date: null
281
+ vat_request_success: null
282
+ giftregistry_item_id: null
283
+ is_cornerdrop_collect: 1
284
+ sales_flat_order_item:
285
+ -
286
+ item_id: 1
287
+ order_id: 1
288
+ parent_item_id: null
289
+ quote_item_id: 1
290
+ store_id: 1
291
+ created_at: 2015-04-21 15:46:15
292
+ updated_at: 2015-04-21 15:46:15
293
+ product_id: 1
294
+ product_type: simple
295
+ product_options: a:6:{s:15:"info_buyRequest";a:7:{s:4:"uenc";s:132:"aHR0cDovL3NreXdhcnAubG9jYWwvbWVhbmJlZS9jb3JuZXJkcm9wL2FjY2Vzc29yaWVzL3Nob2VzL3dpbmd0aXAtY29nbmFjLW94Zm9yZC01NTQuaHRtbD9fX19TSUQ9VQ,,";s:7:"product";s:3:"434";s:8:"form_key";s:16:"XiBqoVMM5jyZzUXw";s:15:"related_product";s:0:"";s:15:"super_attribute";a:2:{i:92;s:2:"19";i:186;s:3:"100";}s:3:"qty";s:1:"1";s:10:"return_url";s:0:"";}s:15:"attributes_info";a:2:{i:0;a:2:{s:5:"label";s:5:"Color";s:5:"value";s:6:"Cognac";}i:1;a:2:{s:5:"label";s:9:"Shoe size";s:5:"value";s:1:"8";}}s:11:"simple_name";s:21:"Wingtip Cognac Oxford";s:10:"simple_sku";s:6:"ams005";s:20:"product_calculations";i:1;s:13:"shipment_type";i:0;}
296
+ weight: 1
297
+ is_virtual: 0
298
+ sku: ams005
299
+ name: Wingtip Cognac Oxford
300
+ description: null
301
+ applied_rule_ids: null
302
+ additional_data: null
303
+ free_shipping: 0
304
+ is_qty_decimal: 0
305
+ no_discount: 0
306
+ qty_backordered: null
307
+ qty_canceled: 0
308
+ qty_invoiced: 0
309
+ qty_ordered: 1
310
+ qty_refunded: 0
311
+ qty_shipped: 0
312
+ base_cost: null
313
+ price: 375
314
+ base_price: 375
315
+ original_price: 375
316
+ base_original_price: 375
317
+ tax_percent: 8.25
318
+ tax_amount: 30.94
319
+ base_tax_amount: 30.94
320
+ tax_invoiced: 0
321
+ base_tax_invoiced: 0
322
+ discount_percent: 0
323
+ discount_amount: 0
324
+ base_discount_amount: 0
325
+ discount_invoiced: 0
326
+ base_discount_invoiced: 0
327
+ amount_refunded: 0
328
+ base_amount_refunded: 0
329
+ row_total: 375
330
+ base_row_total: 375
331
+ row_invoiced: 0
332
+ base_row_invoiced: 0
333
+ row_weight: 1
334
+ base_tax_before_discount: null
335
+ tax_before_discount: null
336
+ ext_order_item_id: null
337
+ locked_do_invoice: null
338
+ locked_do_ship: null
339
+ price_incl_tax: 405.94
340
+ base_price_incl_tax: 405.94
341
+ row_total_incl_tax: 405.94
342
+ base_row_total_incl_tax: 405.94
343
+ hidden_tax_amount: 0
344
+ base_hidden_tax_amount: 0
345
+ hidden_tax_invoiced: null
346
+ base_hidden_tax_invoiced: null
347
+ hidden_tax_refunded: null
348
+ base_hidden_tax_refunded: null
349
+ is_nominal: 0
350
+ tax_canceled: null
351
+ hidden_tax_canceled: null
352
+ tax_refunded: null
353
+ base_tax_refunded: null
354
+ discount_refunded: null
355
+ base_discount_refunded: null
356
+ gift_message_id: null
357
+ gift_message_available: 1
358
+ base_weee_tax_applied_amount: 0
359
+ base_weee_tax_applied_row_amnt: 0
360
+ weee_tax_applied_amount: 0
361
+ weee_tax_applied_row_amount: 0
362
+ weee_tax_applied: a:0:{}
363
+ weee_tax_disposition: 0
364
+ weee_tax_row_disposition: 0
365
+ base_weee_tax_disposition: 0
366
+ base_weee_tax_row_disposition: 0
367
+ event_id: null
368
+ giftregistry_item_id: null
369
+ gw_id: null
370
+ gw_base_price: null
371
+ gw_price: null
372
+ gw_base_tax_amount: null
373
+ gw_tax_amount: null
374
+ gw_base_price_invoiced: null
375
+ gw_price_invoiced: null
376
+ gw_base_tax_amount_invoiced: null
377
+ gw_tax_amount_invoiced: null
378
+ gw_base_price_refunded: null
379
+ gw_price_refunded: null
380
+ gw_base_tax_amount_refunded: null
381
+ gw_tax_amount_refunded: null
382
+ qty_returned: 0
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithTax.yaml ADDED
@@ -0,0 +1,382 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 1
3
+ default/cornerdrop_collect/fee_settings/include_tax: 0
4
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
5
+ eav:
6
+ catalog_product:
7
+ -
8
+ entity_id: 1
9
+ entity_type_id: 4
10
+ attribute_set_id: 4
11
+ type_id: simple
12
+ sku: CDTP
13
+ has_options: 0
14
+ required_options: 0
15
+ created_at: 2015-04-20 10:12:06
16
+ updated_at: 2015-04-20 10:13:06
17
+ tables:
18
+ sales_flat_order:
19
+ -
20
+ entity_id: 1
21
+ state: new
22
+ status: pending
23
+ coupon_code: null
24
+ protect_code: f0947e
25
+ shipping_description: Free Shipping - Free
26
+ is_virtual: 0
27
+ store_id: 1
28
+ customer_id: null
29
+ base_discount_amount: 0
30
+ base_discount_canceled: null
31
+ base_discount_invoiced: null
32
+ base_discount_refunded: null
33
+ base_grand_total: 415.94
34
+ base_shipping_amount: 0
35
+ base_shipping_canceled: null
36
+ base_shipping_invoiced: null
37
+ base_shipping_refunded: null
38
+ base_shipping_tax_amount: 0
39
+ base_shipping_tax_refunded: null
40
+ base_subtotal: 375
41
+ base_subtotal_canceled: null
42
+ base_subtotal_invoiced: null
43
+ base_subtotal_refunded: null
44
+ base_tax_amount: 30.94
45
+ base_tax_canceled: null
46
+ base_tax_invoiced: null
47
+ base_tax_refunded: null
48
+ base_to_global_rate: 1
49
+ base_to_order_rate: 1
50
+ base_total_canceled: null
51
+ base_total_invoiced: null
52
+ base_total_invoiced_cost: null
53
+ base_total_offline_refunded: null
54
+ base_total_online_refunded: null
55
+ base_total_paid: null
56
+ base_total_qty_ordered: null
57
+ base_total_refunded: null
58
+ discount_amount: 0
59
+ discount_canceled: null
60
+ discount_invoiced: null
61
+ discount_refunded: null
62
+ grand_total: 415.94
63
+ shipping_amount: 0
64
+ shipping_canceled: null
65
+ shipping_invoiced: null
66
+ shipping_refunded: null
67
+ shipping_tax_amount: 0
68
+ shipping_tax_refunded: null
69
+ store_to_base_rate: 1
70
+ store_to_order_rate: 1
71
+ subtotal: 375
72
+ subtotal_canceled: null
73
+ subtotal_invoiced: null
74
+ subtotal_refunded: null
75
+ tax_amount: 30.94
76
+ tax_canceled: null
77
+ tax_invoiced: null
78
+ tax_refunded: null
79
+ total_canceled: null
80
+ total_invoiced: null
81
+ total_offline_refunded: null
82
+ total_online_refunded: null
83
+ total_paid: null
84
+ total_qty_ordered: 1
85
+ total_refunded: null
86
+ can_ship_partially: null
87
+ can_ship_partially_item: null
88
+ customer_is_guest: 1
89
+ customer_note_notify: 1
90
+ billing_address_id: 1
91
+ customer_group_id: 0
92
+ edit_increment: null
93
+ email_sent: 1
94
+ forced_shipment_with_invoice: null
95
+ payment_auth_expiration: null
96
+ quote_address_id: null
97
+ quote_id: 703
98
+ shipping_address_id: 2
99
+ adjustment_negative: null
100
+ adjustment_positive: null
101
+ base_adjustment_negative: null
102
+ base_adjustment_positive: null
103
+ base_shipping_discount_amount: 0
104
+ base_subtotal_incl_tax: 405.94
105
+ base_total_due: null
106
+ payment_authorization_amount: null
107
+ shipping_discount_amount: 0
108
+ subtotal_incl_tax: 405.94
109
+ total_due: null
110
+ weight: 1
111
+ customer_dob: null
112
+ increment_id: 145000019
113
+ applied_rule_ids: null
114
+ base_currency_code: GBP
115
+ customer_email: test@example.com
116
+ customer_firstname: Test
117
+ customer_lastname: Tester
118
+ customer_middlename: null
119
+ customer_prefix: null
120
+ customer_suffix: null
121
+ customer_taxvat: null
122
+ discount_description: null
123
+ ext_customer_id: null
124
+ ext_order_id: null
125
+ global_currency_code: GBP
126
+ hold_before_state: null
127
+ hold_before_status: null
128
+ order_currency_code: GBP
129
+ original_increment_id: null
130
+ relation_child_id: null
131
+ relation_child_real_id: null
132
+ relation_parent_id: null
133
+ relation_parent_real_id: null
134
+ remote_ip: 127.0.0.1
135
+ shipping_method: freeshipping_freeshipping
136
+ store_currency_code: GBP
137
+ store_name: "Main Website\nMadison Island\nEnglish"
138
+ x_forwarded_for: null
139
+ customer_note: null
140
+ created_at: 2015-04-21 15:46:15
141
+ updated_at: 2015-04-21 15:46:15
142
+ total_item_count: 1
143
+ customer_gender: null
144
+ hidden_tax_amount: 0
145
+ base_hidden_tax_amount: 0
146
+ shipping_hidden_tax_amount: 0
147
+ base_shipping_hidden_tax_amnt: 0
148
+ hidden_tax_invoiced: null
149
+ base_hidden_tax_invoiced: null
150
+ hidden_tax_refunded: null
151
+ base_hidden_tax_refunded: null
152
+ shipping_incl_tax: 0
153
+ base_shipping_incl_tax: 0
154
+ coupon_rule_name: null
155
+ paypal_ipn_customer_notified: 0
156
+ gift_message_id: null
157
+ base_customer_balance_amount: null
158
+ customer_balance_amount: null
159
+ base_customer_balance_invoiced: null
160
+ customer_balance_invoiced: null
161
+ base_customer_balance_refunded: null
162
+ customer_balance_refunded: null
163
+ bs_customer_bal_total_refunded: null
164
+ customer_bal_total_refunded: null
165
+ gift_cards: null
166
+ base_gift_cards_amount: null
167
+ gift_cards_amount: null
168
+ base_gift_cards_invoiced: null
169
+ gift_cards_invoiced: null
170
+ base_gift_cards_refunded: null
171
+ gift_cards_refunded: null
172
+ gw_id: null
173
+ gw_allow_gift_receipt: null
174
+ gw_add_card: null
175
+ gw_base_price: null
176
+ gw_price: null
177
+ gw_items_base_price: null
178
+ gw_items_price: null
179
+ gw_card_base_price: null
180
+ gw_card_price: null
181
+ gw_base_tax_amount: null
182
+ gw_tax_amount: null
183
+ gw_items_base_tax_amount: null
184
+ gw_items_tax_amount: null
185
+ gw_card_base_tax_amount: null
186
+ gw_card_tax_amount: null
187
+ gw_base_price_invoiced: null
188
+ gw_price_invoiced: null
189
+ gw_items_base_price_invoiced: null
190
+ gw_items_price_invoiced: null
191
+ gw_card_base_price_invoiced: null
192
+ gw_card_price_invoiced: null
193
+ gw_base_tax_amount_invoiced: null
194
+ gw_tax_amount_invoiced: null
195
+ gw_items_base_tax_invoiced: null
196
+ gw_items_tax_invoiced: null
197
+ gw_card_base_tax_invoiced: null
198
+ gw_card_tax_invoiced: null
199
+ gw_base_price_refunded: null
200
+ gw_price_refunded: null
201
+ gw_items_base_price_refunded: null
202
+ gw_items_price_refunded: null
203
+ gw_card_base_price_refunded: null
204
+ gw_card_price_refunded: null
205
+ gw_base_tax_amount_refunded: null
206
+ gw_tax_amount_refunded: null
207
+ gw_items_base_tax_refunded: null
208
+ gw_items_tax_refunded: null
209
+ gw_card_base_tax_refunded: null
210
+ gw_card_tax_refunded: null
211
+ reward_points_balance: null
212
+ base_reward_currency_amount: null
213
+ reward_currency_amount: null
214
+ base_rwrd_crrncy_amt_invoiced: null
215
+ rwrd_currency_amount_invoiced: null
216
+ base_rwrd_crrncy_amnt_refnded: null
217
+ rwrd_crrncy_amnt_refunded: null
218
+ reward_points_balance_refund: null
219
+ reward_points_balance_refunded: null
220
+ reward_salesrule_points: null
221
+ cornerdrop_fee_amount: 10
222
+ base_cornerdrop_fee_amount: 10
223
+ cornerdrop_tax_amount: 1
224
+ base_cornerdrop_tax_amount: 1
225
+ sales_flat_order_address:
226
+ -
227
+ entity_id: 1
228
+ parent_id: 1
229
+ customer_address_id: null
230
+ quote_address_id: null
231
+ region_id: 12
232
+ customer_id: null
233
+ fax: null
234
+ region: California
235
+ postcode: 90210
236
+ lastname: Tester
237
+ street: 123 Test St
238
+ city: Test
239
+ email: test@example.com
240
+ telephone: 11231231234
241
+ country_id: US
242
+ firstname: Test
243
+ address_type: billing
244
+ prefix: null
245
+ middlename: null
246
+ suffix: null
247
+ company: null
248
+ vat_id: null
249
+ vat_is_valid: null
250
+ vat_request_id: null
251
+ vat_request_date: null
252
+ vat_request_success: null
253
+ giftregistry_item_id: null
254
+ is_cornerdrop_collect: null
255
+ -
256
+ entity_id: 2
257
+ parent_id: 1
258
+ customer_address_id: null
259
+ quote_address_id: null
260
+ region_id: 12
261
+ customer_id: null
262
+ fax: null
263
+ region: California
264
+ postcode: 90210
265
+ lastname: Tester
266
+ street: 123 Test St
267
+ city: Test
268
+ email: null
269
+ telephone: 11231231234
270
+ country_id: US
271
+ firstname: Test
272
+ address_type: shipping
273
+ prefix: null
274
+ middlename: null
275
+ suffix: null
276
+ company: null
277
+ vat_id: null
278
+ vat_is_valid: null
279
+ vat_request_id: null
280
+ vat_request_date: null
281
+ vat_request_success: null
282
+ giftregistry_item_id: null
283
+ is_cornerdrop_collect: 1
284
+ sales_flat_order_item:
285
+ -
286
+ item_id: 1
287
+ order_id: 1
288
+ parent_item_id: null
289
+ quote_item_id: 1
290
+ store_id: 1
291
+ created_at: 2015-04-21 15:46:15
292
+ updated_at: 2015-04-21 15:46:15
293
+ product_id: 1
294
+ product_type: simple
295
+ product_options: a:6:{s:15:"info_buyRequest";a:7:{s:4:"uenc";s:132:"aHR0cDovL3NreXdhcnAubG9jYWwvbWVhbmJlZS9jb3JuZXJkcm9wL2FjY2Vzc29yaWVzL3Nob2VzL3dpbmd0aXAtY29nbmFjLW94Zm9yZC01NTQuaHRtbD9fX19TSUQ9VQ,,";s:7:"product";s:3:"434";s:8:"form_key";s:16:"XiBqoVMM5jyZzUXw";s:15:"related_product";s:0:"";s:15:"super_attribute";a:2:{i:92;s:2:"19";i:186;s:3:"100";}s:3:"qty";s:1:"1";s:10:"return_url";s:0:"";}s:15:"attributes_info";a:2:{i:0;a:2:{s:5:"label";s:5:"Color";s:5:"value";s:6:"Cognac";}i:1;a:2:{s:5:"label";s:9:"Shoe size";s:5:"value";s:1:"8";}}s:11:"simple_name";s:21:"Wingtip Cognac Oxford";s:10:"simple_sku";s:6:"ams005";s:20:"product_calculations";i:1;s:13:"shipment_type";i:0;}
296
+ weight: 1
297
+ is_virtual: 0
298
+ sku: ams005
299
+ name: Wingtip Cognac Oxford
300
+ description: null
301
+ applied_rule_ids: null
302
+ additional_data: null
303
+ free_shipping: 0
304
+ is_qty_decimal: 0
305
+ no_discount: 0
306
+ qty_backordered: null
307
+ qty_canceled: 0
308
+ qty_invoiced: 0
309
+ qty_ordered: 1
310
+ qty_refunded: 0
311
+ qty_shipped: 0
312
+ base_cost: null
313
+ price: 375
314
+ base_price: 375
315
+ original_price: 375
316
+ base_original_price: 375
317
+ tax_percent: 8.25
318
+ tax_amount: 30.94
319
+ base_tax_amount: 30.94
320
+ tax_invoiced: 0
321
+ base_tax_invoiced: 0
322
+ discount_percent: 0
323
+ discount_amount: 0
324
+ base_discount_amount: 0
325
+ discount_invoiced: 0
326
+ base_discount_invoiced: 0
327
+ amount_refunded: 0
328
+ base_amount_refunded: 0
329
+ row_total: 375
330
+ base_row_total: 375
331
+ row_invoiced: 0
332
+ base_row_invoiced: 0
333
+ row_weight: 1
334
+ base_tax_before_discount: null
335
+ tax_before_discount: null
336
+ ext_order_item_id: null
337
+ locked_do_invoice: null
338
+ locked_do_ship: null
339
+ price_incl_tax: 405.94
340
+ base_price_incl_tax: 405.94
341
+ row_total_incl_tax: 405.94
342
+ base_row_total_incl_tax: 405.94
343
+ hidden_tax_amount: 0
344
+ base_hidden_tax_amount: 0
345
+ hidden_tax_invoiced: null
346
+ base_hidden_tax_invoiced: null
347
+ hidden_tax_refunded: null
348
+ base_hidden_tax_refunded: null
349
+ is_nominal: 0
350
+ tax_canceled: null
351
+ hidden_tax_canceled: null
352
+ tax_refunded: null
353
+ base_tax_refunded: null
354
+ discount_refunded: null
355
+ base_discount_refunded: null
356
+ gift_message_id: null
357
+ gift_message_available: 1
358
+ base_weee_tax_applied_amount: 0
359
+ base_weee_tax_applied_row_amnt: 0
360
+ weee_tax_applied_amount: 0
361
+ weee_tax_applied_row_amount: 0
362
+ weee_tax_applied: a:0:{}
363
+ weee_tax_disposition: 0
364
+ weee_tax_row_disposition: 0
365
+ base_weee_tax_disposition: 0
366
+ base_weee_tax_row_disposition: 0
367
+ event_id: null
368
+ giftregistry_item_id: null
369
+ gw_id: null
370
+ gw_base_price: null
371
+ gw_price: null
372
+ gw_base_tax_amount: null
373
+ gw_tax_amount: null
374
+ gw_base_price_invoiced: null
375
+ gw_price_invoiced: null
376
+ gw_base_tax_amount_invoiced: null
377
+ gw_tax_amount_invoiced: null
378
+ gw_base_price_refunded: null
379
+ gw_price_refunded: null
380
+ gw_base_tax_amount_refunded: null
381
+ gw_tax_amount_refunded: null
382
+ qty_returned: 0
app/code/community/CornerDrop/Collect/Test/Model/Sales/Order/Invoice/Total/CornerDrop/Fee/fixtures/testCornerDropFeeNotAdded.yaml ADDED
@@ -0,0 +1,382 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 0
3
+ default/cornerdrop_collect/fee_settings/include_tax: 1
4
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
5
+ eav:
6
+ catalog_product:
7
+ -
8
+ entity_id: 1
9
+ entity_type_id: 4
10
+ attribute_set_id: 4
11
+ type_id: simple
12
+ sku: CDTP
13
+ has_options: 0
14
+ required_options: 0
15
+ created_at: 2015-04-20 10:12:06
16
+ updated_at: 2015-04-20 10:13:06
17
+ tables:
18
+ sales_flat_order:
19
+ -
20
+ entity_id: 1
21
+ state: new
22
+ status: pending
23
+ coupon_code: null
24
+ protect_code: f0947e
25
+ shipping_description: Free Shipping - Free
26
+ is_virtual: 0
27
+ store_id: 1
28
+ customer_id: null
29
+ base_discount_amount: 0
30
+ base_discount_canceled: null
31
+ base_discount_invoiced: null
32
+ base_discount_refunded: null
33
+ base_grand_total: 415.94
34
+ base_shipping_amount: 0
35
+ base_shipping_canceled: null
36
+ base_shipping_invoiced: null
37
+ base_shipping_refunded: null
38
+ base_shipping_tax_amount: 0
39
+ base_shipping_tax_refunded: null
40
+ base_subtotal: 375
41
+ base_subtotal_canceled: null
42
+ base_subtotal_invoiced: null
43
+ base_subtotal_refunded: null
44
+ base_tax_amount: 30.94
45
+ base_tax_canceled: null
46
+ base_tax_invoiced: null
47
+ base_tax_refunded: null
48
+ base_to_global_rate: 1
49
+ base_to_order_rate: 1
50
+ base_total_canceled: null
51
+ base_total_invoiced: null
52
+ base_total_invoiced_cost: null
53
+ base_total_offline_refunded: null
54
+ base_total_online_refunded: null
55
+ base_total_paid: null
56
+ base_total_qty_ordered: null
57
+ base_total_refunded: null
58
+ discount_amount: 0
59
+ discount_canceled: null
60
+ discount_invoiced: null
61
+ discount_refunded: null
62
+ grand_total: 415.94
63
+ shipping_amount: 0
64
+ shipping_canceled: null
65
+ shipping_invoiced: null
66
+ shipping_refunded: null
67
+ shipping_tax_amount: 0
68
+ shipping_tax_refunded: null
69
+ store_to_base_rate: 1
70
+ store_to_order_rate: 1
71
+ subtotal: 375
72
+ subtotal_canceled: null
73
+ subtotal_invoiced: null
74
+ subtotal_refunded: null
75
+ tax_amount: 30.94
76
+ tax_canceled: null
77
+ tax_invoiced: null
78
+ tax_refunded: null
79
+ total_canceled: null
80
+ total_invoiced: null
81
+ total_offline_refunded: null
82
+ total_online_refunded: null
83
+ total_paid: null
84
+ total_qty_ordered: 1
85
+ total_refunded: null
86
+ can_ship_partially: null
87
+ can_ship_partially_item: null
88
+ customer_is_guest: 1
89
+ customer_note_notify: 1
90
+ billing_address_id: 1
91
+ customer_group_id: 0
92
+ edit_increment: null
93
+ email_sent: 1
94
+ forced_shipment_with_invoice: null
95
+ payment_auth_expiration: null
96
+ quote_address_id: null
97
+ quote_id: 703
98
+ shipping_address_id: 2
99
+ adjustment_negative: null
100
+ adjustment_positive: null
101
+ base_adjustment_negative: null
102
+ base_adjustment_positive: null
103
+ base_shipping_discount_amount: 0
104
+ base_subtotal_incl_tax: 405.94
105
+ base_total_due: null
106
+ payment_authorization_amount: null
107
+ shipping_discount_amount: 0
108
+ subtotal_incl_tax: 405.94
109
+ total_due: null
110
+ weight: 1
111
+ customer_dob: null
112
+ increment_id: 145000019
113
+ applied_rule_ids: null
114
+ base_currency_code: GBP
115
+ customer_email: test@example.com
116
+ customer_firstname: Test
117
+ customer_lastname: Tester
118
+ customer_middlename: null
119
+ customer_prefix: null
120
+ customer_suffix: null
121
+ customer_taxvat: null
122
+ discount_description: null
123
+ ext_customer_id: null
124
+ ext_order_id: null
125
+ global_currency_code: GBP
126
+ hold_before_state: null
127
+ hold_before_status: null
128
+ order_currency_code: GBP
129
+ original_increment_id: null
130
+ relation_child_id: null
131
+ relation_child_real_id: null
132
+ relation_parent_id: null
133
+ relation_parent_real_id: null
134
+ remote_ip: 127.0.0.1
135
+ shipping_method: freeshipping_freeshipping
136
+ store_currency_code: GBP
137
+ store_name: "Main Website\nMadison Island\nEnglish"
138
+ x_forwarded_for: null
139
+ customer_note: null
140
+ created_at: 2015-04-21 15:46:15
141
+ updated_at: 2015-04-21 15:46:15
142
+ total_item_count: 1
143
+ customer_gender: null
144
+ hidden_tax_amount: 0
145
+ base_hidden_tax_amount: 0
146
+ shipping_hidden_tax_amount: 0
147
+ base_shipping_hidden_tax_amnt: 0
148
+ hidden_tax_invoiced: null
149
+ base_hidden_tax_invoiced: null
150
+ hidden_tax_refunded: null
151
+ base_hidden_tax_refunded: null
152
+ shipping_incl_tax: 0
153
+ base_shipping_incl_tax: 0
154
+ coupon_rule_name: null
155
+ paypal_ipn_customer_notified: 0
156
+ gift_message_id: null
157
+ base_customer_balance_amount: null
158
+ customer_balance_amount: null
159
+ base_customer_balance_invoiced: null
160
+ customer_balance_invoiced: null
161
+ base_customer_balance_refunded: null
162
+ customer_balance_refunded: null
163
+ bs_customer_bal_total_refunded: null
164
+ customer_bal_total_refunded: null
165
+ gift_cards: null
166
+ base_gift_cards_amount: null
167
+ gift_cards_amount: null
168
+ base_gift_cards_invoiced: null
169
+ gift_cards_invoiced: null
170
+ base_gift_cards_refunded: null
171
+ gift_cards_refunded: null
172
+ gw_id: null
173
+ gw_allow_gift_receipt: null
174
+ gw_add_card: null
175
+ gw_base_price: null
176
+ gw_price: null
177
+ gw_items_base_price: null
178
+ gw_items_price: null
179
+ gw_card_base_price: null
180
+ gw_card_price: null
181
+ gw_base_tax_amount: null
182
+ gw_tax_amount: null
183
+ gw_items_base_tax_amount: null
184
+ gw_items_tax_amount: null
185
+ gw_card_base_tax_amount: null
186
+ gw_card_tax_amount: null
187
+ gw_base_price_invoiced: null
188
+ gw_price_invoiced: null
189
+ gw_items_base_price_invoiced: null
190
+ gw_items_price_invoiced: null
191
+ gw_card_base_price_invoiced: null
192
+ gw_card_price_invoiced: null
193
+ gw_base_tax_amount_invoiced: null
194
+ gw_tax_amount_invoiced: null
195
+ gw_items_base_tax_invoiced: null
196
+ gw_items_tax_invoiced: null
197
+ gw_card_base_tax_invoiced: null
198
+ gw_card_tax_invoiced: null
199
+ gw_base_price_refunded: null
200
+ gw_price_refunded: null
201
+ gw_items_base_price_refunded: null
202
+ gw_items_price_refunded: null
203
+ gw_card_base_price_refunded: null
204
+ gw_card_price_refunded: null
205
+ gw_base_tax_amount_refunded: null
206
+ gw_tax_amount_refunded: null
207
+ gw_items_base_tax_refunded: null
208
+ gw_items_tax_refunded: null
209
+ gw_card_base_tax_refunded: null
210
+ gw_card_tax_refunded: null
211
+ reward_points_balance: null
212
+ base_reward_currency_amount: null
213
+ reward_currency_amount: null
214
+ base_rwrd_crrncy_amt_invoiced: null
215
+ rwrd_currency_amount_invoiced: null
216
+ base_rwrd_crrncy_amnt_refnded: null
217
+ rwrd_crrncy_amnt_refunded: null
218
+ reward_points_balance_refund: null
219
+ reward_points_balance_refunded: null
220
+ reward_salesrule_points: null
221
+ cornerdrop_fee_amount: 0
222
+ base_cornerdrop_fee_amount: 0
223
+ cornerdrop_tax_amount: null
224
+ base_cornerdrop_tax_amount: null
225
+ sales_flat_order_address:
226
+ -
227
+ entity_id: 1
228
+ parent_id: 1
229
+ customer_address_id: null
230
+ quote_address_id: null
231
+ region_id: 12
232
+ customer_id: null
233
+ fax: null
234
+ region: California
235
+ postcode: 90210
236
+ lastname: Tester
237
+ street: 123 Test St
238
+ city: Test
239
+ email: test@example.com
240
+ telephone: 11231231234
241
+ country_id: US
242
+ firstname: Test
243
+ address_type: billing
244
+ prefix: null
245
+ middlename: null
246
+ suffix: null
247
+ company: null
248
+ vat_id: null
249
+ vat_is_valid: null
250
+ vat_request_id: null
251
+ vat_request_date: null
252
+ vat_request_success: null
253
+ giftregistry_item_id: null
254
+ is_cornerdrop_collect: null
255
+ -
256
+ entity_id: 2
257
+ parent_id: 1
258
+ customer_address_id: null
259
+ quote_address_id: null
260
+ region_id: 12
261
+ customer_id: null
262
+ fax: null
263
+ region: California
264
+ postcode: 90210
265
+ lastname: Tester
266
+ street: 123 Test St
267
+ city: Test
268
+ email: null
269
+ telephone: 11231231234
270
+ country_id: US
271
+ firstname: Test
272
+ address_type: shipping
273
+ prefix: null
274
+ middlename: null
275
+ suffix: null
276
+ company: null
277
+ vat_id: null
278
+ vat_is_valid: null
279
+ vat_request_id: null
280
+ vat_request_date: null
281
+ vat_request_success: null
282
+ giftregistry_item_id: null
283
+ is_cornerdrop_collect: 0
284
+ sales_flat_order_item:
285
+ -
286
+ item_id: 1
287
+ order_id: 1
288
+ parent_item_id: null
289
+ quote_item_id: 1
290
+ store_id: 1
291
+ created_at: 2015-04-21 15:46:15
292
+ updated_at: 2015-04-21 15:46:15
293
+ product_id: 1
294
+ product_type: simple
295
+ product_options: a:6:{s:15:"info_buyRequest";a:7:{s:4:"uenc";s:132:"aHR0cDovL3NreXdhcnAubG9jYWwvbWVhbmJlZS9jb3JuZXJkcm9wL2FjY2Vzc29yaWVzL3Nob2VzL3dpbmd0aXAtY29nbmFjLW94Zm9yZC01NTQuaHRtbD9fX19TSUQ9VQ,,";s:7:"product";s:3:"434";s:8:"form_key";s:16:"XiBqoVMM5jyZzUXw";s:15:"related_product";s:0:"";s:15:"super_attribute";a:2:{i:92;s:2:"19";i:186;s:3:"100";}s:3:"qty";s:1:"1";s:10:"return_url";s:0:"";}s:15:"attributes_info";a:2:{i:0;a:2:{s:5:"label";s:5:"Color";s:5:"value";s:6:"Cognac";}i:1;a:2:{s:5:"label";s:9:"Shoe size";s:5:"value";s:1:"8";}}s:11:"simple_name";s:21:"Wingtip Cognac Oxford";s:10:"simple_sku";s:6:"ams005";s:20:"product_calculations";i:1;s:13:"shipment_type";i:0;}
296
+ weight: 1
297
+ is_virtual: 0
298
+ sku: ams005
299
+ name: Wingtip Cognac Oxford
300
+ description: null
301
+ applied_rule_ids: null
302
+ additional_data: null
303
+ free_shipping: 0
304
+ is_qty_decimal: 0
305
+ no_discount: 0
306
+ qty_backordered: null
307
+ qty_canceled: 0
308
+ qty_invoiced: 0
309
+ qty_ordered: 1
310
+ qty_refunded: 0
311
+ qty_shipped: 0
312
+ base_cost: null
313
+ price: 375
314
+ base_price: 375
315
+ original_price: 375
316
+ base_original_price: 375
317
+ tax_percent: 8.25
318
+ tax_amount: 30.94
319
+ base_tax_amount: 30.94
320
+ tax_invoiced: 0
321
+ base_tax_invoiced: 0
322
+ discount_percent: 0
323
+ discount_amount: 0
324
+ base_discount_amount: 0
325
+ discount_invoiced: 0
326
+ base_discount_invoiced: 0
327
+ amount_refunded: 0
328
+ base_amount_refunded: 0
329
+ row_total: 375
330
+ base_row_total: 375
331
+ row_invoiced: 0
332
+ base_row_invoiced: 0
333
+ row_weight: 1
334
+ base_tax_before_discount: null
335
+ tax_before_discount: null
336
+ ext_order_item_id: null
337
+ locked_do_invoice: null
338
+ locked_do_ship: null
339
+ price_incl_tax: 405.94
340
+ base_price_incl_tax: 405.94
341
+ row_total_incl_tax: 405.94
342
+ base_row_total_incl_tax: 405.94
343
+ hidden_tax_amount: 0
344
+ base_hidden_tax_amount: 0
345
+ hidden_tax_invoiced: null
346
+ base_hidden_tax_invoiced: null
347
+ hidden_tax_refunded: null
348
+ base_hidden_tax_refunded: null
349
+ is_nominal: 0
350
+ tax_canceled: null
351
+ hidden_tax_canceled: null
352
+ tax_refunded: null
353
+ base_tax_refunded: null
354
+ discount_refunded: null
355
+ base_discount_refunded: null
356
+ gift_message_id: null
357
+ gift_message_available: 1
358
+ base_weee_tax_applied_amount: 0
359
+ base_weee_tax_applied_row_amnt: 0
360
+ weee_tax_applied_amount: 0
361
+ weee_tax_applied_row_amount: 0
362
+ weee_tax_applied: a:0:{}
363
+ weee_tax_disposition: 0
364
+ weee_tax_row_disposition: 0
365
+ base_weee_tax_disposition: 0
366
+ base_weee_tax_row_disposition: 0
367
+ event_id: null
368
+ giftregistry_item_id: null
369
+ gw_id: null
370
+ gw_base_price: null
371
+ gw_price: null
372
+ gw_base_tax_amount: null
373
+ gw_tax_amount: null
374
+ gw_base_price_invoiced: null
375
+ gw_price_invoiced: null
376
+ gw_base_tax_amount_invoiced: null
377
+ gw_tax_amount_invoiced: null
378
+ gw_base_price_refunded: null
379
+ gw_price_refunded: null
380
+ gw_base_tax_amount_refunded: null
381
+ gw_tax_amount_refunded: null
382
+ qty_returned: 0
app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee.php ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Test_Model_Sales_Quote_Address_Total_CornerDrop_Fee extends EcomDev_PHPUnit_Test_Case {
4
+
5
+ /**
6
+ * Magento uses cookies to handle the addresses, PHPUnit
7
+ * never starts a session so the cookie could not be set.
8
+ *
9
+ * @link http://stackoverflow.com/a/23400885/2003205
10
+ */
11
+ public function setUp(){
12
+ parent::setUp();
13
+ if(session_id() !== '') {
14
+ session_destroy();
15
+ }
16
+ @session_start();
17
+ }
18
+
19
+ /**
20
+ * Test the CornerDrop fee is added with tax.
21
+ *
22
+ * @test
23
+ * @loadFixture
24
+ */
25
+ public function testCornerDropFeeAddedWithTax() {
26
+ $values = $this->_getValues();
27
+ $this->assertEquals(10, $values['total_fee']);
28
+ $this->assertEquals(10, $values['base_total_fee']);
29
+ $this->assertEquals(0.83, $values['tax']);
30
+ $this->assertEquals(0.83, $values['base_tax']);
31
+ }
32
+
33
+ /**
34
+ * Test the CornerDrop fee is added without tax.
35
+ *
36
+ * @test
37
+ * @loadFixture
38
+ */
39
+ public function testCornerDropFeeAddedWithNoTax() {
40
+ $values = $this->_getValues();
41
+ $this->assertEquals(10, $values['total_fee']);
42
+ $this->assertEquals(10, $values['base_total_fee']);
43
+ $this->assertEquals(0, $values['tax']);
44
+ $this->assertEquals(0, $values['base_tax']);
45
+ }
46
+
47
+ /**
48
+ * Check the CornerDrop fee is not added to a Quote if it's not
49
+ * selected on checkout.
50
+ *
51
+ * @test
52
+ * @loadFixture
53
+ */
54
+ public function testCornerDropFeeNotAdded() {
55
+ $values = $this->_getValues();
56
+ $this->assertEquals(0, $values['total_fee']);
57
+ $this->assertEquals(0, $values['base_total_fee']);
58
+ }
59
+
60
+ /**
61
+ * Get the values which vary based on the loaded fixture.
62
+ *
63
+ * @return array
64
+ */
65
+ private function _getValues() {
66
+ /** @var CornerDrop_Collect_Model_Sales_Quote_Address_Total_CornerDrop_Fee $total */
67
+ $total = Mage::getModel('cornerdrop_collect/sales_quote_address_total_cornerdrop_fee');
68
+ $addresses = Mage::getModel('sales/quote_address')->getCollection()->addFieldToFilter('quote_id', array('eq' => 18))->addFieldToSelect('*');
69
+ $quote = Mage::getModel('sales/quote')->getCollection()->getFirstItem();
70
+ $total_fee = 0;
71
+ $base_total_fee = 0;
72
+ $tax = 0;
73
+ $base_tax = 0;
74
+
75
+ foreach($addresses as $address) {
76
+ /** @ var Mage_Sales_Model_Quote_Address $address */
77
+ $address->setQuote($quote);
78
+ $total->collect($address);
79
+ $total->fetch($address);
80
+ $total_fee += (float) $address->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT);
81
+ $base_total_fee += (float) $address->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT);
82
+ $tax += (float) $address->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_TAX);
83
+ $base_tax += (float) $address->getData(CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX);
84
+ }
85
+
86
+ return compact(
87
+ 'total_fee',
88
+ 'base_total_fee',
89
+ 'tax',
90
+ 'base_tax'
91
+ );
92
+ }
93
+
94
+ }
app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithNoTax.yaml ADDED
@@ -0,0 +1,438 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 1
3
+ default/cornerdrop_collect/status/balance: 10
4
+ default/cornerdrop_collect/fee_settings/include_tax: 1
5
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
6
+ eav:
7
+ catalog_product:
8
+ -
9
+ entity_id: 421
10
+ entity_type_id: 4
11
+ attribute_set_id: 1
12
+ type_id: configurable
13
+ sku: wbk012c
14
+ has_options: 1
15
+ required_options: 1
16
+ created_at: 2013-04-04 06:25:11
17
+ updated_at: 2015-04-06 12:32:19
18
+ -
19
+ entity_id: 295
20
+ entity_type_id: 4
21
+ attribute_set_id: 1
22
+ type_id: simple
23
+ sku: wbk013
24
+ has_options: 0
25
+ required_options: 0
26
+ created_at: 2013-03-05 05:48:14
27
+ updated_at: 2014-03-08 08:17:50
28
+ tables:
29
+ tax_calculation_rule:
30
+ -
31
+ tax_calculation_rule_id: 2
32
+ code: CornerDrop Tax Rule
33
+ priority: 0
34
+ position: 0
35
+ calculate_subtotal: 0
36
+ tax_calculation:
37
+ -
38
+ tax_calculation_id: 3
39
+ tax_calculation_rate_id: 1
40
+ tax_calculation_rule_id: 2
41
+ customer_tax_class_id: 3
42
+ product_tax_class_id: 5
43
+ -
44
+ tax_calculation_id: 4
45
+ tax_calculation_rate_id: 2
46
+ tax_calculation_rule_id: 2
47
+ customer_tax_class_id: 3
48
+ product_tax_class_id: 5
49
+ sales_flat_quote:
50
+ -
51
+ entity_id: 18
52
+ store_id: 1
53
+ created_at: 2015-04-16 13:20:17
54
+ updated_at: 2015-04-16 12:20:18
55
+ converted_at: null
56
+ is_active: 1
57
+ is_virtual: 0
58
+ is_multi_shipping: 0
59
+ items_count: 1
60
+ items_qty: 1
61
+ orig_order_id: 0
62
+ store_to_base_rate: 1
63
+ store_to_quote_rate: 1
64
+ base_currency_code: USD
65
+ store_currency_code: USD
66
+ quote_currency_code: USD
67
+ grand_total: 161.55
68
+ base_grand_total: 161.55
69
+ checkout_method: null
70
+ customer_id: null
71
+ customer_tax_class_id: 10
72
+ customer_group_id: 0
73
+ customer_email: null
74
+ customer_prefix: null
75
+ customer_firstname: null
76
+ customer_middlename: null
77
+ customer_lastname: null
78
+ customer_suffix: null
79
+ customer_dob: null
80
+ customer_note: null
81
+ customer_note_notify: 1
82
+ customer_is_guest: 0
83
+ remote_ip: 127.0.0.1
84
+ applied_rule_ids: null
85
+ reserved_order_id: null
86
+ password_hash: null
87
+ coupon_code: null
88
+ global_currency_code: USD
89
+ base_to_global_rate: 1
90
+ base_to_quote_rate: 1
91
+ customer_taxvat: null
92
+ customer_gender: null
93
+ subtotal: 140
94
+ base_subtotal: 140
95
+ subtotal_with_discount: 140
96
+ base_subtotal_with_discount: 140
97
+ is_changed: 1
98
+ trigger_recollect: 0
99
+ ext_shipping_info: null
100
+ gift_message_id: null
101
+ is_persistent: 0
102
+ customer_balance_amount_used: null
103
+ base_customer_bal_amount_used: null
104
+ use_customer_balance: null
105
+ gift_cards: null
106
+ gift_cards_amount: null
107
+ base_gift_cards_amount: null
108
+ gift_cards_amount_used: null
109
+ base_gift_cards_amount_used: null
110
+ gw_id: null
111
+ gw_allow_gift_receipt: null
112
+ gw_add_card: null
113
+ gw_base_price: null
114
+ gw_price: null
115
+ gw_items_base_price: null
116
+ gw_items_price: null
117
+ gw_card_base_price: null
118
+ gw_card_price: null
119
+ gw_base_tax_amount: null
120
+ gw_tax_amount: null
121
+ gw_items_base_tax_amount: null
122
+ gw_items_tax_amount: null
123
+ gw_card_base_tax_amount: null
124
+ gw_card_tax_amount: null
125
+ use_reward_points: null
126
+ reward_points_balance: null
127
+ base_reward_currency_amount: null
128
+ reward_currency_amount: null
129
+ sales_flat_quote_address:
130
+ -
131
+ address_id: 2620
132
+ quote_id: 18
133
+ created_at: 2015-04-16 12:20:06
134
+ updated_at: 2015-04-16 12:20:18
135
+ customer_id: null
136
+ save_in_address_book: 0
137
+ customer_address_id: null
138
+ address_type: billing
139
+ email: null
140
+ prefix: null
141
+ firstname: null
142
+ middlename: null
143
+ lastname: null
144
+ suffix: null
145
+ company: null
146
+ street: null
147
+ city: null
148
+ region: CA
149
+ region_id: 12
150
+ postcode: null
151
+ country_id: US
152
+ telephone: null
153
+ fax: null
154
+ same_as_billing: 0
155
+ free_shipping: 0
156
+ collect_shipping_rates: 0
157
+ shipping_method: null
158
+ shipping_description: null
159
+ weight: 0
160
+ subtotal: 0
161
+ base_subtotal: 0
162
+ subtotal_with_discount: 0
163
+ base_subtotal_with_discount: 0
164
+ tax_amount: 0
165
+ base_tax_amount: 0
166
+ shipping_amount: 0
167
+ base_shipping_amount: 0
168
+ shipping_tax_amount: 0
169
+ base_shipping_tax_amount: 0
170
+ discount_amount: 0
171
+ base_discount_amount: 0
172
+ grand_total: 0
173
+ base_grand_total: 0
174
+ customer_notes: null
175
+ applied_taxes: a:0:{}
176
+ discount_description: null
177
+ shipping_discount_amount: null
178
+ base_shipping_discount_amount: null
179
+ subtotal_incl_tax: 0
180
+ base_subtotal_total_incl_tax: null
181
+ hidden_tax_amount: null
182
+ base_hidden_tax_amount: null
183
+ shipping_hidden_tax_amount: null
184
+ base_shipping_hidden_tax_amnt: null
185
+ shipping_incl_tax: 0
186
+ base_shipping_incl_tax: 0
187
+ vat_id: null
188
+ vat_is_valid: null
189
+ vat_request_id: null
190
+ vat_request_date: null
191
+ vat_request_success: null
192
+ gift_message_id: null
193
+ base_customer_balance_amount: null
194
+ customer_balance_amount: null
195
+ gift_cards_amount: null
196
+ base_gift_cards_amount: null
197
+ gift_cards: null
198
+ used_gift_cards: null
199
+ giftregistry_item_id: null
200
+ gw_id: null
201
+ gw_allow_gift_receipt: null
202
+ gw_add_card: null
203
+ gw_base_price: null
204
+ gw_price: null
205
+ gw_items_base_price: null
206
+ gw_items_price: null
207
+ gw_card_base_price: null
208
+ gw_card_price: null
209
+ gw_base_tax_amount: null
210
+ gw_tax_amount: null
211
+ gw_items_base_tax_amount: null
212
+ gw_items_tax_amount: null
213
+ gw_card_base_tax_amount: null
214
+ gw_card_tax_amount: null
215
+ reward_points_balance: null
216
+ base_reward_currency_amount: null
217
+ reward_currency_amount: null
218
+ is_cornerdrop_collect: null
219
+ cornerdrop_fee_amount: 0
220
+ base_cornerdrop_fee_amount: 0
221
+ cornerdrop_tax_amount: null
222
+ base_cornerdrop_tax_amount: null
223
+ -
224
+ address_id: 2621
225
+ quote_id: 18
226
+ created_at: 2015-04-16 12:20:06
227
+ updated_at: 2015-04-16 12:20:18
228
+ customer_id: null
229
+ save_in_address_book: 0
230
+ customer_address_id: null
231
+ address_type: shipping
232
+ email: null
233
+ prefix: null
234
+ firstname: null
235
+ middlename: null
236
+ lastname: null
237
+ suffix: null
238
+ company: null
239
+ street: null
240
+ city: null
241
+ region: CA
242
+ region_id: 12
243
+ postcode: null
244
+ country_id: US
245
+ telephone: null
246
+ fax: null
247
+ same_as_billing: 1
248
+ free_shipping: 0
249
+ collect_shipping_rates: 0
250
+ shipping_method: null
251
+ shipping_description: null
252
+ weight: 1
253
+ subtotal: 140
254
+ base_subtotal: 140
255
+ subtotal_with_discount: 0
256
+ base_subtotal_with_discount: 0
257
+ tax_amount: 12.38
258
+ base_tax_amount: 12.38
259
+ shipping_amount: 0
260
+ base_shipping_amount: 0
261
+ shipping_tax_amount: 0
262
+ base_shipping_tax_amount: 0
263
+ discount_amount: 0
264
+ base_discount_amount: 0
265
+ grand_total: 161.55
266
+ base_grand_total: 161.55
267
+ customer_notes: null
268
+ applied_taxes: a:1:{s:30:"US-All States-TaxableGoodsRate";a:6:{s:5:"rates";a:1:{i:0;a:6:{s:4:"code";s:30:"US-All States-TaxableGoodsRate";s:5:"title";s:30:"US-All States-TaxableGoodsRate";s:7:"percent";d:8.25;s:8:"position";s:1:"0";s:8:"priority";s:1:"0";s:7:"rule_id";s:2:"13";}}s:7:"percent";d:8.25;s:2:"id";s:30:"US-All States-TaxableGoodsRate";s:7:"process";i:0;s:6:"amount";d:11.550000000000001;s:11:"base_amount";d:11.550000000000001;}}
269
+ discount_description: null
270
+ shipping_discount_amount: 0
271
+ base_shipping_discount_amount: 0
272
+ subtotal_incl_tax: 151.55
273
+ base_subtotal_total_incl_tax: null
274
+ hidden_tax_amount: 0
275
+ base_hidden_tax_amount: 0
276
+ shipping_hidden_tax_amount: 0
277
+ base_shipping_hidden_tax_amnt: null
278
+ shipping_incl_tax: 0
279
+ base_shipping_incl_tax: 0
280
+ vat_id: null
281
+ vat_is_valid: null
282
+ vat_request_id: null
283
+ vat_request_date: null
284
+ vat_request_success: null
285
+ gift_message_id: null
286
+ base_customer_balance_amount: null
287
+ customer_balance_amount: null
288
+ gift_cards_amount: null
289
+ base_gift_cards_amount: null
290
+ gift_cards: null
291
+ used_gift_cards: null
292
+ giftregistry_item_id: null
293
+ gw_id: null
294
+ gw_allow_gift_receipt: null
295
+ gw_add_card: null
296
+ gw_base_price: null
297
+ gw_price: null
298
+ gw_items_base_price: null
299
+ gw_items_price: null
300
+ gw_card_base_price: null
301
+ gw_card_price: null
302
+ gw_base_tax_amount: null
303
+ gw_tax_amount: null
304
+ gw_items_base_tax_amount: null
305
+ gw_items_tax_amount: null
306
+ gw_card_base_tax_amount: null
307
+ gw_card_tax_amount: null
308
+ reward_points_balance: null
309
+ base_reward_currency_amount: null
310
+ reward_currency_amount: null
311
+ is_cornerdrop_collect: 1
312
+ cornerdrop_fee_amount: 10
313
+ base_cornerdrop_fee_amount: 10
314
+ cornerdrop_tax_amount: null
315
+ base_cornerdrop_tax_amount: null
316
+ sales_flat_quote_item:
317
+ -
318
+ item_id: 2517
319
+ quote_id: 18
320
+ created_at: 2015-04-16 12:20:06
321
+ updated_at: 2015-04-16 12:20:18
322
+ product_id: 421
323
+ store_id: 1
324
+ parent_item_id: null
325
+ is_virtual: 0
326
+ sku: wbk013
327
+ name: Elizabeth Knit Top
328
+ description: null
329
+ applied_rule_ids: null
330
+ additional_data: null
331
+ free_shipping: 0
332
+ is_qty_decimal: 0
333
+ no_discount: 0
334
+ weight: 1
335
+ qty: 1
336
+ price: 210
337
+ base_price: 210
338
+ custom_price: null
339
+ discount_percent: 0
340
+ discount_amount: 0
341
+ base_discount_amount: 0
342
+ tax_percent: 8.25
343
+ tax_amount: 17.33
344
+ base_tax_amount: 17.33
345
+ row_total: 210
346
+ base_row_total: 210
347
+ row_total_with_discount: 0
348
+ row_weight: 1
349
+ product_type: configurable
350
+ base_tax_before_discount: null
351
+ tax_before_discount: null
352
+ original_custom_price: null
353
+ redirect_url: null
354
+ base_cost: null
355
+ price_incl_tax: 227.33
356
+ base_price_incl_tax: 227.33
357
+ row_total_incl_tax: 227.33
358
+ base_row_total_incl_tax: 227.33
359
+ hidden_tax_amount: 0
360
+ base_hidden_tax_amount: 0
361
+ gift_message_id: null
362
+ weee_tax_disposition: 0
363
+ weee_tax_row_disposition: 0
364
+ base_weee_tax_disposition: 0
365
+ base_weee_tax_row_disposition: 0
366
+ weee_tax_applied: a:0:{}
367
+ weee_tax_applied_amount: 0
368
+ weee_tax_applied_row_amount: 0
369
+ base_weee_tax_applied_amount: 0
370
+ base_weee_tax_applied_row_amnt: null
371
+ event_id: null
372
+ giftregistry_item_id: null
373
+ gw_id: null
374
+ gw_base_price: null
375
+ gw_price: null
376
+ gw_base_tax_amount: null
377
+ gw_tax_amount: null
378
+ -
379
+ item_id: 2518
380
+ quote_id: 18
381
+ created_at: 2015-04-16 12:20:06
382
+ updated_at: 2015-04-16 12:20:18
383
+ product_id: 295
384
+ store_id: 1
385
+ parent_item_id: 2517
386
+ is_virtual: 0
387
+ sku: wbk013
388
+ name: Elizabeth Knit Top
389
+ description: null
390
+ applied_rule_ids: null
391
+ additional_data: null
392
+ free_shipping: 0
393
+ is_qty_decimal: 0
394
+ no_discount: 0
395
+ weight: 1
396
+ qty: 1
397
+ price: 0
398
+ base_price: 0
399
+ custom_price: null
400
+ discount_percent: 0
401
+ discount_amount: 0
402
+ base_discount_amount: 0
403
+ tax_percent: 0
404
+ tax_amount: 0
405
+ base_tax_amount: 0
406
+ row_total: 0
407
+ base_row_total: 0
408
+ row_total_with_discount: 0
409
+ row_weight: 0
410
+ product_type: simple
411
+ base_tax_before_discount: null
412
+ tax_before_discount: null
413
+ original_custom_price: null
414
+ redirect_url: null
415
+ base_cost: null
416
+ price_incl_tax: null
417
+ base_price_incl_tax: null
418
+ row_total_incl_tax: null
419
+ base_row_total_incl_tax: null
420
+ hidden_tax_amount: null
421
+ base_hidden_tax_amount: null
422
+ gift_message_id: null
423
+ weee_tax_disposition: 0
424
+ weee_tax_row_disposition: 0
425
+ base_weee_tax_disposition: 0
426
+ base_weee_tax_row_disposition: 0
427
+ weee_tax_applied: a:0:{}
428
+ weee_tax_applied_amount: 0
429
+ weee_tax_applied_row_amount: 0
430
+ base_weee_tax_applied_amount: 0
431
+ base_weee_tax_applied_row_amnt: null
432
+ event_id: null
433
+ giftregistry_item_id: null
434
+ gw_id: null
435
+ gw_base_price: null
436
+ gw_price: null
437
+ gw_base_tax_amount: null
438
+ gw_tax_amount: null
app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee/fixtures/testCornerDropFeeAddedWithTax.yaml ADDED
@@ -0,0 +1,438 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enable: 1
3
+ default/cornerdrop_collect/status/balance: 10
4
+ default/cornerdrop_collect/fee_settings/include_tax: 0
5
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
6
+ eav:
7
+ catalog_product:
8
+ -
9
+ entity_id: 421
10
+ entity_type_id: 4
11
+ attribute_set_id: 1
12
+ type_id: configurable
13
+ sku: wbk012c
14
+ has_options: 1
15
+ required_options: 1
16
+ created_at: 2013-04-04 06:25:11
17
+ updated_at: 2015-04-06 12:32:19
18
+ -
19
+ entity_id: 295
20
+ entity_type_id: 4
21
+ attribute_set_id: 1
22
+ type_id: simple
23
+ sku: wbk013
24
+ has_options: 0
25
+ required_options: 0
26
+ created_at: 2013-03-05 05:48:14
27
+ updated_at: 2014-03-08 08:17:50
28
+ tables:
29
+ tax_calculation_rule:
30
+ -
31
+ tax_calculation_rule_id: 2
32
+ code: CornerDrop Tax Rule
33
+ priority: 0
34
+ position: 0
35
+ calculate_subtotal: 0
36
+ tax_calculation:
37
+ -
38
+ tax_calculation_id: 3
39
+ tax_calculation_rate_id: 1
40
+ tax_calculation_rule_id: 2
41
+ customer_tax_class_id: 3
42
+ product_tax_class_id: 5
43
+ -
44
+ tax_calculation_id: 4
45
+ tax_calculation_rate_id: 2
46
+ tax_calculation_rule_id: 2
47
+ customer_tax_class_id: 3
48
+ product_tax_class_id: 5
49
+ sales_flat_quote:
50
+ -
51
+ entity_id: 18
52
+ store_id: 1
53
+ created_at: 2015-04-16 13:20:17
54
+ updated_at: 2015-04-16 12:20:18
55
+ converted_at: null
56
+ is_active: 1
57
+ is_virtual: 0
58
+ is_multi_shipping: 0
59
+ items_count: 1
60
+ items_qty: 1
61
+ orig_order_id: 0
62
+ store_to_base_rate: 1
63
+ store_to_quote_rate: 1
64
+ base_currency_code: USD
65
+ store_currency_code: USD
66
+ quote_currency_code: USD
67
+ grand_total: 161.55
68
+ base_grand_total: 161.55
69
+ checkout_method: null
70
+ customer_id: null
71
+ customer_tax_class_id: 10
72
+ customer_group_id: 0
73
+ customer_email: null
74
+ customer_prefix: null
75
+ customer_firstname: null
76
+ customer_middlename: null
77
+ customer_lastname: null
78
+ customer_suffix: null
79
+ customer_dob: null
80
+ customer_note: null
81
+ customer_note_notify: 1
82
+ customer_is_guest: 0
83
+ remote_ip: 127.0.0.1
84
+ applied_rule_ids: null
85
+ reserved_order_id: null
86
+ password_hash: null
87
+ coupon_code: null
88
+ global_currency_code: USD
89
+ base_to_global_rate: 1
90
+ base_to_quote_rate: 1
91
+ customer_taxvat: null
92
+ customer_gender: null
93
+ subtotal: 140
94
+ base_subtotal: 140
95
+ subtotal_with_discount: 140
96
+ base_subtotal_with_discount: 140
97
+ is_changed: 1
98
+ trigger_recollect: 0
99
+ ext_shipping_info: null
100
+ gift_message_id: null
101
+ is_persistent: 0
102
+ customer_balance_amount_used: null
103
+ base_customer_bal_amount_used: null
104
+ use_customer_balance: null
105
+ gift_cards: null
106
+ gift_cards_amount: null
107
+ base_gift_cards_amount: null
108
+ gift_cards_amount_used: null
109
+ base_gift_cards_amount_used: null
110
+ gw_id: null
111
+ gw_allow_gift_receipt: null
112
+ gw_add_card: null
113
+ gw_base_price: null
114
+ gw_price: null
115
+ gw_items_base_price: null
116
+ gw_items_price: null
117
+ gw_card_base_price: null
118
+ gw_card_price: null
119
+ gw_base_tax_amount: null
120
+ gw_tax_amount: null
121
+ gw_items_base_tax_amount: null
122
+ gw_items_tax_amount: null
123
+ gw_card_base_tax_amount: null
124
+ gw_card_tax_amount: null
125
+ use_reward_points: null
126
+ reward_points_balance: null
127
+ base_reward_currency_amount: null
128
+ reward_currency_amount: null
129
+ sales_flat_quote_address:
130
+ -
131
+ address_id: 2620
132
+ quote_id: 18
133
+ created_at: 2015-04-16 12:20:06
134
+ updated_at: 2015-04-16 12:20:18
135
+ customer_id: null
136
+ save_in_address_book: 0
137
+ customer_address_id: null
138
+ address_type: billing
139
+ email: null
140
+ prefix: null
141
+ firstname: null
142
+ middlename: null
143
+ lastname: null
144
+ suffix: null
145
+ company: null
146
+ street: null
147
+ city: null
148
+ region: CA
149
+ region_id: 12
150
+ postcode: null
151
+ country_id: US
152
+ telephone: null
153
+ fax: null
154
+ same_as_billing: 0
155
+ free_shipping: 0
156
+ collect_shipping_rates: 0
157
+ shipping_method: null
158
+ shipping_description: null
159
+ weight: 0
160
+ subtotal: 0
161
+ base_subtotal: 0
162
+ subtotal_with_discount: 0
163
+ base_subtotal_with_discount: 0
164
+ tax_amount: 0
165
+ base_tax_amount: 0
166
+ shipping_amount: 0
167
+ base_shipping_amount: 0
168
+ shipping_tax_amount: 0
169
+ base_shipping_tax_amount: 0
170
+ discount_amount: 0
171
+ base_discount_amount: 0
172
+ grand_total: 0
173
+ base_grand_total: 0
174
+ customer_notes: null
175
+ applied_taxes: a:0:{}
176
+ discount_description: null
177
+ shipping_discount_amount: null
178
+ base_shipping_discount_amount: null
179
+ subtotal_incl_tax: 0
180
+ base_subtotal_total_incl_tax: null
181
+ hidden_tax_amount: null
182
+ base_hidden_tax_amount: null
183
+ shipping_hidden_tax_amount: null
184
+ base_shipping_hidden_tax_amnt: null
185
+ shipping_incl_tax: 0
186
+ base_shipping_incl_tax: 0
187
+ vat_id: null
188
+ vat_is_valid: null
189
+ vat_request_id: null
190
+ vat_request_date: null
191
+ vat_request_success: null
192
+ gift_message_id: null
193
+ base_customer_balance_amount: null
194
+ customer_balance_amount: null
195
+ gift_cards_amount: null
196
+ base_gift_cards_amount: null
197
+ gift_cards: null
198
+ used_gift_cards: null
199
+ giftregistry_item_id: null
200
+ gw_id: null
201
+ gw_allow_gift_receipt: null
202
+ gw_add_card: null
203
+ gw_base_price: null
204
+ gw_price: null
205
+ gw_items_base_price: null
206
+ gw_items_price: null
207
+ gw_card_base_price: null
208
+ gw_card_price: null
209
+ gw_base_tax_amount: null
210
+ gw_tax_amount: null
211
+ gw_items_base_tax_amount: null
212
+ gw_items_tax_amount: null
213
+ gw_card_base_tax_amount: null
214
+ gw_card_tax_amount: null
215
+ reward_points_balance: null
216
+ base_reward_currency_amount: null
217
+ reward_currency_amount: null
218
+ is_cornerdrop_collect: null
219
+ cornerdrop_fee_amount: 0
220
+ base_cornerdrop_fee_amount: 0
221
+ cornerdrop_tax_amount: null
222
+ base_cornerdrop_tax_amount: null
223
+ -
224
+ address_id: 2621
225
+ quote_id: 18
226
+ created_at: 2015-04-16 12:20:06
227
+ updated_at: 2015-04-16 12:20:18
228
+ customer_id: null
229
+ save_in_address_book: 0
230
+ customer_address_id: null
231
+ address_type: shipping
232
+ email: null
233
+ prefix: null
234
+ firstname: null
235
+ middlename: null
236
+ lastname: null
237
+ suffix: null
238
+ company: null
239
+ street: null
240
+ city: null
241
+ region: CA
242
+ region_id: 12
243
+ postcode: null
244
+ country_id: US
245
+ telephone: null
246
+ fax: null
247
+ same_as_billing: 1
248
+ free_shipping: 0
249
+ collect_shipping_rates: 0
250
+ shipping_method: null
251
+ shipping_description: null
252
+ weight: 1
253
+ subtotal: 140
254
+ base_subtotal: 140
255
+ subtotal_with_discount: 0
256
+ base_subtotal_with_discount: 0
257
+ tax_amount: 12.38
258
+ base_tax_amount: 12.38
259
+ shipping_amount: 0
260
+ base_shipping_amount: 0
261
+ shipping_tax_amount: 0
262
+ base_shipping_tax_amount: 0
263
+ discount_amount: 0
264
+ base_discount_amount: 0
265
+ grand_total: 161.55
266
+ base_grand_total: 161.55
267
+ customer_notes: null
268
+ applied_taxes: a:1:{s:30:"US-All States-TaxableGoodsRate";a:6:{s:5:"rates";a:1:{i:0;a:6:{s:4:"code";s:30:"US-All States-TaxableGoodsRate";s:5:"title";s:30:"US-All States-TaxableGoodsRate";s:7:"percent";d:8.25;s:8:"position";s:1:"0";s:8:"priority";s:1:"0";s:7:"rule_id";s:2:"13";}}s:7:"percent";d:8.25;s:2:"id";s:30:"US-All States-TaxableGoodsRate";s:7:"process";i:0;s:6:"amount";d:11.550000000000001;s:11:"base_amount";d:11.550000000000001;}}
269
+ discount_description: null
270
+ shipping_discount_amount: 0
271
+ base_shipping_discount_amount: 0
272
+ subtotal_incl_tax: 151.55
273
+ base_subtotal_total_incl_tax: null
274
+ hidden_tax_amount: 0
275
+ base_hidden_tax_amount: 0
276
+ shipping_hidden_tax_amount: 0
277
+ base_shipping_hidden_tax_amnt: null
278
+ shipping_incl_tax: 0
279
+ base_shipping_incl_tax: 0
280
+ vat_id: null
281
+ vat_is_valid: null
282
+ vat_request_id: null
283
+ vat_request_date: null
284
+ vat_request_success: null
285
+ gift_message_id: null
286
+ base_customer_balance_amount: null
287
+ customer_balance_amount: null
288
+ gift_cards_amount: null
289
+ base_gift_cards_amount: null
290
+ gift_cards: null
291
+ used_gift_cards: null
292
+ giftregistry_item_id: null
293
+ gw_id: null
294
+ gw_allow_gift_receipt: null
295
+ gw_add_card: null
296
+ gw_base_price: null
297
+ gw_price: null
298
+ gw_items_base_price: null
299
+ gw_items_price: null
300
+ gw_card_base_price: null
301
+ gw_card_price: null
302
+ gw_base_tax_amount: null
303
+ gw_tax_amount: null
304
+ gw_items_base_tax_amount: null
305
+ gw_items_tax_amount: null
306
+ gw_card_base_tax_amount: null
307
+ gw_card_tax_amount: null
308
+ reward_points_balance: null
309
+ base_reward_currency_amount: null
310
+ reward_currency_amount: null
311
+ is_cornerdrop_collect: 1
312
+ cornerdrop_fee_amount: 10
313
+ base_cornerdrop_fee_amount: 10
314
+ cornerdrop_tax_amount: 1
315
+ base_cornerdrop_tax_amount: 1
316
+ sales_flat_quote_item:
317
+ -
318
+ item_id: 2517
319
+ quote_id: 18
320
+ created_at: 2015-04-16 12:20:06
321
+ updated_at: 2015-04-16 12:20:18
322
+ product_id: 421
323
+ store_id: 1
324
+ parent_item_id: null
325
+ is_virtual: 0
326
+ sku: wbk013
327
+ name: Elizabeth Knit Top
328
+ description: null
329
+ applied_rule_ids: null
330
+ additional_data: null
331
+ free_shipping: 0
332
+ is_qty_decimal: 0
333
+ no_discount: 0
334
+ weight: 1
335
+ qty: 1
336
+ price: 210
337
+ base_price: 210
338
+ custom_price: null
339
+ discount_percent: 0
340
+ discount_amount: 0
341
+ base_discount_amount: 0
342
+ tax_percent: 8.25
343
+ tax_amount: 17.33
344
+ base_tax_amount: 17.33
345
+ row_total: 210
346
+ base_row_total: 210
347
+ row_total_with_discount: 0
348
+ row_weight: 1
349
+ product_type: configurable
350
+ base_tax_before_discount: null
351
+ tax_before_discount: null
352
+ original_custom_price: null
353
+ redirect_url: null
354
+ base_cost: null
355
+ price_incl_tax: 227.33
356
+ base_price_incl_tax: 227.33
357
+ row_total_incl_tax: 227.33
358
+ base_row_total_incl_tax: 227.33
359
+ hidden_tax_amount: 0
360
+ base_hidden_tax_amount: 0
361
+ gift_message_id: null
362
+ weee_tax_disposition: 0
363
+ weee_tax_row_disposition: 0
364
+ base_weee_tax_disposition: 0
365
+ base_weee_tax_row_disposition: 0
366
+ weee_tax_applied: a:0:{}
367
+ weee_tax_applied_amount: 0
368
+ weee_tax_applied_row_amount: 0
369
+ base_weee_tax_applied_amount: 0
370
+ base_weee_tax_applied_row_amnt: null
371
+ event_id: null
372
+ giftregistry_item_id: null
373
+ gw_id: null
374
+ gw_base_price: null
375
+ gw_price: null
376
+ gw_base_tax_amount: null
377
+ gw_tax_amount: null
378
+ -
379
+ item_id: 2518
380
+ quote_id: 18
381
+ created_at: 2015-04-16 12:20:06
382
+ updated_at: 2015-04-16 12:20:18
383
+ product_id: 295
384
+ store_id: 1
385
+ parent_item_id: 2517
386
+ is_virtual: 0
387
+ sku: wbk013
388
+ name: Elizabeth Knit Top
389
+ description: null
390
+ applied_rule_ids: null
391
+ additional_data: null
392
+ free_shipping: 0
393
+ is_qty_decimal: 0
394
+ no_discount: 0
395
+ weight: 1
396
+ qty: 1
397
+ price: 0
398
+ base_price: 0
399
+ custom_price: null
400
+ discount_percent: 0
401
+ discount_amount: 0
402
+ base_discount_amount: 0
403
+ tax_percent: 0
404
+ tax_amount: 0
405
+ base_tax_amount: 0
406
+ row_total: 0
407
+ base_row_total: 0
408
+ row_total_with_discount: 0
409
+ row_weight: 0
410
+ product_type: simple
411
+ base_tax_before_discount: null
412
+ tax_before_discount: null
413
+ original_custom_price: null
414
+ redirect_url: null
415
+ base_cost: null
416
+ price_incl_tax: null
417
+ base_price_incl_tax: null
418
+ row_total_incl_tax: null
419
+ base_row_total_incl_tax: null
420
+ hidden_tax_amount: null
421
+ base_hidden_tax_amount: null
422
+ gift_message_id: null
423
+ weee_tax_disposition: 0
424
+ weee_tax_row_disposition: 0
425
+ base_weee_tax_disposition: 0
426
+ base_weee_tax_row_disposition: 0
427
+ weee_tax_applied: a:0:{}
428
+ weee_tax_applied_amount: 0
429
+ weee_tax_applied_row_amount: 0
430
+ base_weee_tax_applied_amount: 0
431
+ base_weee_tax_applied_row_amnt: null
432
+ event_id: null
433
+ giftregistry_item_id: null
434
+ gw_id: null
435
+ gw_base_price: null
436
+ gw_price: null
437
+ gw_base_tax_amount: null
438
+ gw_tax_amount: null
app/code/community/CornerDrop/Collect/Test/Model/Sales/Quote/Address/Total/CornerDrop/Fee/fixtures/testCornerDropFeeNotAdded.yaml ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ config:
2
+ default/cornerdrop_collect/settings/enabled: 0
3
+ default/cornerdrop_collect/status/balance: 10
4
+ default/cornerdrop_collect/fee_settings/additional_fee: 10
5
+ default/cornerdrop_collect/fee_settings/include_tax: 1
6
+ tables:
7
+ sales_flat_quote:
8
+ -
9
+ entity_id: 18
10
+ store_id: 1
11
+ created_at: 2015-04-16 13:20:17
12
+ updated_at: 2015-04-16 12:20:18
13
+ converted_at: null
14
+ is_active: 1
15
+ is_virtual: 0
16
+ is_multi_shipping: 0
17
+ items_count: 1
18
+ items_qty: 1
19
+ orig_order_id: 0
20
+ store_to_base_rate: 1
21
+ store_to_quote_rate: 1
22
+ base_currency_code: USD
23
+ store_currency_code: USD
24
+ quote_currency_code: USD
25
+ grand_total: 161.55
26
+ base_grand_total: 161.55
27
+ checkout_method: null
28
+ customer_id: null
29
+ customer_tax_class_id: 10
30
+ customer_group_id: 0
31
+ customer_email: null
32
+ customer_prefix: null
33
+ customer_firstname: null
34
+ customer_middlename: null
35
+ customer_lastname: null
36
+ customer_suffix: null
37
+ customer_dob: null
38
+ customer_note: null
39
+ customer_note_notify: 1
40
+ customer_is_guest: 0
41
+ remote_ip: 127.0.0.1
42
+ applied_rule_ids: null
43
+ reserved_order_id: null
44
+ password_hash: null
45
+ coupon_code: null
46
+ global_currency_code: USD
47
+ base_to_global_rate: 1
48
+ base_to_quote_rate: 1
49
+ customer_taxvat: null
50
+ customer_gender: null
51
+ subtotal: 140
52
+ base_subtotal: 140
53
+ subtotal_with_discount: 140
54
+ base_subtotal_with_discount: 140
55
+ is_changed: 1
56
+ trigger_recollect: 0
57
+ ext_shipping_info: null
58
+ gift_message_id: null
59
+ is_persistent: 0
60
+ customer_balance_amount_used: null
61
+ base_customer_bal_amount_used: null
62
+ use_customer_balance: null
63
+ gift_cards: null
64
+ gift_cards_amount: null
65
+ base_gift_cards_amount: null
66
+ gift_cards_amount_used: null
67
+ base_gift_cards_amount_used: null
68
+ gw_id: null
69
+ gw_allow_gift_receipt: null
70
+ gw_add_card: null
71
+ gw_base_price: null
72
+ gw_price: null
73
+ gw_items_base_price: null
74
+ gw_items_price: null
75
+ gw_card_base_price: null
76
+ gw_card_price: null
77
+ gw_base_tax_amount: null
78
+ gw_tax_amount: null
79
+ gw_items_base_tax_amount: null
80
+ gw_items_tax_amount: null
81
+ gw_card_base_tax_amount: null
82
+ gw_card_tax_amount: null
83
+ use_reward_points: null
84
+ reward_points_balance: null
85
+ base_reward_currency_amount: null
86
+ reward_currency_amount: null
87
+ sales_flat_quote_address:
88
+ -
89
+ address_id: 2620
90
+ quote_id: 18
91
+ created_at: 2015-04-16 12:20:06
92
+ updated_at: 2015-04-16 12:20:18
93
+ customer_id: null
94
+ save_in_address_book: 0
95
+ customer_address_id: null
96
+ address_type: billing
97
+ email: null
98
+ prefix: null
99
+ firstname: null
100
+ middlename: null
101
+ lastname: null
102
+ suffix: null
103
+ company: null
104
+ street: null
105
+ city: null
106
+ region: CA
107
+ region_id: 12
108
+ postcode: null
109
+ country_id: US
110
+ telephone: null
111
+ fax: null
112
+ same_as_billing: 0
113
+ free_shipping: 0
114
+ collect_shipping_rates: 0
115
+ shipping_method: null
116
+ shipping_description: null
117
+ weight: 0
118
+ subtotal: 0
119
+ base_subtotal: 0
120
+ subtotal_with_discount: 0
121
+ base_subtotal_with_discount: 0
122
+ tax_amount: 0
123
+ base_tax_amount: 0
124
+ shipping_amount: 0
125
+ base_shipping_amount: 0
126
+ shipping_tax_amount: 0
127
+ base_shipping_tax_amount: 0
128
+ discount_amount: 0
129
+ base_discount_amount: 0
130
+ grand_total: 0
131
+ base_grand_total: 0
132
+ customer_notes: null
133
+ applied_taxes: a:0:{}
134
+ discount_description: null
135
+ shipping_discount_amount: null
136
+ base_shipping_discount_amount: null
137
+ subtotal_incl_tax: 0
138
+ base_subtotal_total_incl_tax: null
139
+ hidden_tax_amount: null
140
+ base_hidden_tax_amount: null
141
+ shipping_hidden_tax_amount: null
142
+ base_shipping_hidden_tax_amnt: null
143
+ shipping_incl_tax: 0
144
+ base_shipping_incl_tax: 0
145
+ vat_id: null
146
+ vat_is_valid: null
147
+ vat_request_id: null
148
+ vat_request_date: null
149
+ vat_request_success: null
150
+ gift_message_id: null
151
+ base_customer_balance_amount: null
152
+ customer_balance_amount: null
153
+ gift_cards_amount: null
154
+ base_gift_cards_amount: null
155
+ gift_cards: null
156
+ used_gift_cards: null
157
+ giftregistry_item_id: null
158
+ gw_id: null
159
+ gw_allow_gift_receipt: null
160
+ gw_add_card: null
161
+ gw_base_price: null
162
+ gw_price: null
163
+ gw_items_base_price: null
164
+ gw_items_price: null
165
+ gw_card_base_price: null
166
+ gw_card_price: null
167
+ gw_base_tax_amount: null
168
+ gw_tax_amount: null
169
+ gw_items_base_tax_amount: null
170
+ gw_items_tax_amount: null
171
+ gw_card_base_tax_amount: null
172
+ gw_card_tax_amount: null
173
+ reward_points_balance: null
174
+ base_reward_currency_amount: null
175
+ reward_currency_amount: null
176
+ is_cornerdrop_collect: null
177
+ cornerdrop_fee_amount: 0
178
+ base_cornerdrop_fee_amount: 0
179
+ cornerdrop_tax_amount: null
180
+ base_cornerdrop_tax_amount: null
181
+ -
182
+ address_id: 2621
183
+ quote_id: 18
184
+ created_at: 2015-04-16 12:20:06
185
+ updated_at: 2015-04-16 12:20:18
186
+ customer_id: null
187
+ save_in_address_book: 0
188
+ customer_address_id: null
189
+ address_type: shipping
190
+ email: null
191
+ prefix: null
192
+ firstname: null
193
+ middlename: null
194
+ lastname: null
195
+ suffix: null
196
+ company: null
197
+ street: null
198
+ city: null
199
+ region: CA
200
+ region_id: 12
201
+ postcode: null
202
+ country_id: US
203
+ telephone: null
204
+ fax: null
205
+ same_as_billing: 1
206
+ free_shipping: 0
207
+ collect_shipping_rates: 0
208
+ shipping_method: null
209
+ shipping_description: null
210
+ weight: 1
211
+ subtotal: 140
212
+ base_subtotal: 140
213
+ subtotal_with_discount: 0
214
+ base_subtotal_with_discount: 0
215
+ tax_amount: 12.38
216
+ base_tax_amount: 12.38
217
+ shipping_amount: 0
218
+ base_shipping_amount: 0
219
+ shipping_tax_amount: 0
220
+ base_shipping_tax_amount: 0
221
+ discount_amount: 0
222
+ base_discount_amount: 0
223
+ grand_total: 161.55
224
+ base_grand_total: 161.55
225
+ customer_notes: null
226
+ applied_taxes: a:1:{s:30:"US-All States-TaxableGoodsRate";a:6:{s:5:"rates";a:1:{i:0;a:6:{s:4:"code";s:30:"US-All States-TaxableGoodsRate";s:5:"title";s:30:"US-All States-TaxableGoodsRate";s:7:"percent";d:8.25;s:8:"position";s:1:"0";s:8:"priority";s:1:"0";s:7:"rule_id";s:2:"13";}}s:7:"percent";d:8.25;s:2:"id";s:30:"US-All States-TaxableGoodsRate";s:7:"process";i:0;s:6:"amount";d:11.550000000000001;s:11:"base_amount";d:11.550000000000001;}}
227
+ discount_description: null
228
+ shipping_discount_amount: 0
229
+ base_shipping_discount_amount: 0
230
+ subtotal_incl_tax: 151.55
231
+ base_subtotal_total_incl_tax: null
232
+ hidden_tax_amount: 0
233
+ base_hidden_tax_amount: 0
234
+ shipping_hidden_tax_amount: 0
235
+ base_shipping_hidden_tax_amnt: null
236
+ shipping_incl_tax: 0
237
+ base_shipping_incl_tax: 0
238
+ vat_id: null
239
+ vat_is_valid: null
240
+ vat_request_id: null
241
+ vat_request_date: null
242
+ vat_request_success: null
243
+ gift_message_id: null
244
+ base_customer_balance_amount: null
245
+ customer_balance_amount: null
246
+ gift_cards_amount: null
247
+ base_gift_cards_amount: null
248
+ gift_cards: null
249
+ used_gift_cards: null
250
+ giftregistry_item_id: null
251
+ gw_id: null
252
+ gw_allow_gift_receipt: null
253
+ gw_add_card: null
254
+ gw_base_price: null
255
+ gw_price: null
256
+ gw_items_base_price: null
257
+ gw_items_price: null
258
+ gw_card_base_price: null
259
+ gw_card_price: null
260
+ gw_base_tax_amount: null
261
+ gw_tax_amount: null
262
+ gw_items_base_tax_amount: null
263
+ gw_items_tax_amount: null
264
+ gw_card_base_tax_amount: null
265
+ gw_card_tax_amount: null
266
+ reward_points_balance: null
267
+ base_reward_currency_amount: null
268
+ reward_currency_amount: null
269
+ is_cornerdrop_collect: 0
270
+ cornerdrop_fee_amount: 0
271
+ base_cornerdrop_fee_amount: 0
272
+ cornerdrop_tax_amount: null
273
+ base_cornerdrop_tax_amount: null
app/code/community/CornerDrop/Collect/controllers/Adminhtml/Cornerdrop/Collect/SearchController.php ADDED
@@ -0,0 +1,68 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_Adminhtml_Cornerdrop_Collect_SearchController extends Mage_Adminhtml_Controller_Action
4
+ {
5
+ public function indexAction()
6
+ {
7
+ $query = $this->getRequest()->getParam("q");
8
+ $lat = $this->getRequest()->getParam("lat");
9
+ $long = $this->getRequest()->getParam("long");
10
+
11
+ if (is_null($lat) || is_null($long)) {
12
+ return $this->setErrorResponse(400, $this->getHelper()->__("Missing parameters."));
13
+ }
14
+
15
+ /** @var Mage_Sales_Model_Quote $quote */
16
+ $quote = Mage::getSingleton('adminhtml/session_quote')->getQuote();
17
+
18
+ $quote->setRemoteIp(Mage::helper('core/http')->getRemoteAddr());
19
+
20
+ $results = $this->getHelper()->search(
21
+ $quote,
22
+ $query,
23
+ $lat,
24
+ $long
25
+ );
26
+
27
+ if (is_null($results)) {
28
+ return $this->setErrorResponse(500, $this->getHelper()->__("Failed to fetch the search results, please try again."));
29
+ }
30
+
31
+ $this->getResponse()
32
+ ->setHeader("Content-type", "application/json")
33
+ ->appendBody(Mage::helper("core")->jsonEncode($results));
34
+
35
+ return $this;
36
+ }
37
+
38
+ /**
39
+ * Get the module helper.
40
+ *
41
+ * @return CornerDrop_Collect_Helper_Data
42
+ */
43
+ protected function getHelper()
44
+ {
45
+ return Mage::helper("cornerdrop_collect");
46
+ }
47
+
48
+ /**
49
+ * Set an error code and message on the response.
50
+ *
51
+ * @param int $code
52
+ * @param string $message
53
+ *
54
+ * @return $this
55
+ * @throws Zend_Controller_Response_Exception
56
+ */
57
+ protected function setErrorResponse($code, $message)
58
+ {
59
+ $this->getResponse()
60
+ ->setHttpResponseCode($code)
61
+ ->setHeader("Content-type", "application/json")
62
+ ->appendBody(Mage::helper("core")->jsonEncode(array(
63
+ "message" => $message
64
+ )));
65
+
66
+ return $this;
67
+ }
68
+ }
app/code/community/CornerDrop/Collect/controllers/SearchController.php ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ class CornerDrop_Collect_SearchController extends Mage_Core_Controller_Front_Action
4
+ {
5
+
6
+ public function indexAction()
7
+ {
8
+ $query = $this->getRequest()->getParam("q");
9
+ $lat = $this->getRequest()->getParam("lat");
10
+ $long = $this->getRequest()->getParam("long");
11
+
12
+ if (is_null($lat) || is_null($long)) {
13
+ return $this->setErrorResponse(400, $this->getHelper()->__("Missing parameters."));
14
+ }
15
+
16
+ $quote = Mage::getSingleton("checkout/session")->getQuote();
17
+
18
+ if (!$quote->getId()) {
19
+ return $this->setErrorResponse(400, $this->getHelper()->__("Invalid session."));
20
+ }
21
+
22
+ $results = $this->getHelper()->search(
23
+ $quote,
24
+ $query,
25
+ $lat,
26
+ $long
27
+ );
28
+
29
+ if (is_null($results)) {
30
+ return $this->setErrorResponse(500, $this->getHelper()->__("Failed to fetch the search results, please try again."));
31
+ }
32
+
33
+ $this->getResponse()
34
+ ->setHeader("Content-type", "application/json")
35
+ ->appendBody(Mage::helper("core")->jsonEncode($results));
36
+
37
+ return $this;
38
+ }
39
+
40
+ /**
41
+ * Set an error code and message on the response.
42
+ *
43
+ * @param int $code
44
+ * @param string $message
45
+ *
46
+ * @return $this
47
+ * @throws Zend_Controller_Response_Exception
48
+ */
49
+ protected function setErrorResponse($code, $message)
50
+ {
51
+ $this->getResponse()
52
+ ->setHttpResponseCode($code)
53
+ ->setHeader("Content-type", "application/json")
54
+ ->appendBody(Mage::helper("core")->jsonEncode(array(
55
+ "message" => $message
56
+ )));
57
+
58
+ return $this;
59
+ }
60
+
61
+ /**
62
+ * Get the module helper.
63
+ *
64
+ * @return CornerDrop_Collect_Helper_Data
65
+ */
66
+ protected function getHelper()
67
+ {
68
+ return Mage::helper("cornerdrop_collect");
69
+ }
70
+ }
app/code/community/CornerDrop/Collect/data/cornerdrop_collect_setup/data-install-1.0.0.php ADDED
@@ -0,0 +1,74 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /** @var Mage_Core_Model_Resource_Setup $installer */
4
+ $installer = $this;
5
+ $installer->startSetup();
6
+
7
+ // Add is_cornerdrop_collect attribute to customer address
8
+
9
+ $admin_store = Mage::app()->getStore(Mage_Core_Model_App::ADMIN_STORE_ID);
10
+
11
+ $attribute = Mage::getSingleton('eav/config')
12
+ ->getAttribute('customer_address', CornerDrop_Collect_Helper_Data::IS_CORNERDROP_COLLECT);
13
+ $attribute->setWebsite($admin_store->getWebsite());
14
+ if (!$attribute->getId()) {
15
+ $attribute->addData(array(
16
+ 'label' => 'Is CornerDrop Collect',
17
+ 'backend_type' => 'int',
18
+ 'frontend_input' => 'hidden',
19
+ 'is_user_defined' => 0,
20
+ 'is_system' => 1,
21
+ 'is_visible' => 1,
22
+ 'is_required' => 0,
23
+ 'used_in_forms' => array(
24
+ 'customer_address_edit'
25
+ )
26
+ ));
27
+ $attribute->save();
28
+ }
29
+
30
+ // Add cornerdrop_store_id attribute to customer address
31
+
32
+ $attribute = Mage::getSingleton('eav/config')
33
+ ->getAttribute('customer_address', CornerDrop_Collect_Helper_Data::CORNERDROP_STORE_ID_COLUMN);
34
+ $attribute->setWebsite($admin_store->getWebsite());
35
+ if (!$attribute->getId()) {
36
+ $attribute->addData(array(
37
+ 'label' => 'CornerDrop Store ID',
38
+ 'backend_type' => 'int',
39
+ 'frontend_input' => 'hidden',
40
+ 'is_user_defined' => 0,
41
+ 'is_system' => 1,
42
+ 'is_visible' => 1,
43
+ 'is_required' => 0,
44
+ 'used_in_forms' => array(
45
+ 'customer_address_edit'
46
+ )
47
+ ));
48
+ $attribute->save();
49
+ }
50
+
51
+ // Add CornerDrop Collect tax class
52
+
53
+ /** @var Mage_Tax_Model_Class $model */
54
+ $model = Mage::getModel('tax/class');
55
+ /** @var CornerDrop_Collect_Helper_Data $helper */
56
+ $helper = Mage::helper('cornerdrop_collect');
57
+
58
+ try {
59
+ $model->setData(array(
60
+ 'class_name' => $helper->getCornerDropFeeLabel(),
61
+ 'class_type' => Mage_Tax_Model_Class::TAX_CLASS_TYPE_PRODUCT
62
+ ));
63
+ $model->save();
64
+
65
+ /**
66
+ * Set CornerDrop Tax Class to default value.
67
+ */
68
+ Mage::getModel('core/config')->saveConfig(CornerDrop_Collect_Helper_Config::XML_PATH_FEE_SETTINGS_TAX_CLASS, $model->getId());
69
+
70
+ } catch (Exception $e) {
71
+ $helper->log($e->getMessage());
72
+ }
73
+
74
+ $installer->endSetup();
app/code/community/CornerDrop/Collect/etc/adminhtml.xml ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <acl>
4
+ <resources>
5
+ <admin>
6
+ <children>
7
+ <system>
8
+ <children>
9
+ <config>
10
+ <children>
11
+ <cornerdrop_collect translate="title" module="cornerdrop_collect">
12
+ <title>CornerDrop Configuration</title>
13
+ </cornerdrop_collect>
14
+ </children>
15
+ </config>
16
+ </children>
17
+ </system>
18
+ </children>
19
+ </admin>
20
+ </resources>
21
+ </acl>
22
+ </config>
app/code/community/CornerDrop/Collect/etc/config.xml ADDED
@@ -0,0 +1,232 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <CornerDrop_Collect>
5
+ <version>1.2.0</version>
6
+ </CornerDrop_Collect>
7
+ </modules>
8
+ <global>
9
+ <blocks>
10
+ <cornerdrop_collect>
11
+ <class>CornerDrop_Collect_Block</class>
12
+ </cornerdrop_collect>
13
+ </blocks>
14
+ <helpers>
15
+ <cornerdrop_collect>
16
+ <class>CornerDrop_Collect_Helper</class>
17
+ </cornerdrop_collect>
18
+ </helpers>
19
+ <models>
20
+ <cornerdrop_collect>
21
+ <class>CornerDrop_Collect_Model</class>
22
+ </cornerdrop_collect>
23
+ </models>
24
+ <events>
25
+ <admin_system_config_changed_section_cornerdrop_collect>
26
+ <observers>
27
+ <cornerdrop_collect>
28
+ <type>singleton</type>
29
+ <class>cornerdrop_collect/observer</class>
30
+ <method>checkAccountStatus</method>
31
+ </cornerdrop_collect>
32
+ </observers>
33
+ </admin_system_config_changed_section_cornerdrop_collect>
34
+ <controller_action_predispatch_checkout_onepage_saveBilling>
35
+ <observers>
36
+ <cornerdrop_collect>
37
+ <type>singleton</type>
38
+ <class>cornerdrop_collect/observer</class>
39
+ <method>setCornerDropCollectFlag</method>
40
+ </cornerdrop_collect>
41
+ </observers>
42
+ </controller_action_predispatch_checkout_onepage_saveBilling>
43
+ <controller_action_predispatch_checkout_onepage_saveShipping>
44
+ <observers>
45
+ <cornerdrop_collect>
46
+ <type>singleton</type>
47
+ <class>cornerdrop_collect/observer</class>
48
+ <method>makeCornerDropCollectReservation</method>
49
+ </cornerdrop_collect>
50
+ </observers>
51
+ </controller_action_predispatch_checkout_onepage_saveShipping>
52
+ <customer_address_format>
53
+ <observers>
54
+ <cornerdrop_collect>
55
+ <type>singleton</type>
56
+ <class>cornerdrop_collect/observer</class>
57
+ <method>addCustomerAddressTemplate</method>
58
+ </cornerdrop_collect>
59
+ </observers>
60
+ </customer_address_format>
61
+ <paypal_prepare_line_items>
62
+ <observers>
63
+ <cornerdrop_collect>
64
+ <type>singleton</type>
65
+ <class>cornerdrop_collect/observer</class>
66
+ <method>addTotalToPaypal</method>
67
+ </cornerdrop_collect>
68
+ </observers>
69
+ </paypal_prepare_line_items>
70
+ </events>
71
+ <sales>
72
+ <quote>
73
+ <totals>
74
+ <cornerdrop_fee>
75
+ <class>cornerdrop_collect/sales_quote_address_total_cornerDrop_fee</class>
76
+ <after>tax</after>
77
+ </cornerdrop_fee>
78
+ </totals>
79
+ </quote>
80
+ <order_invoice>
81
+ <totals>
82
+ <cornerdrop_fee>
83
+ <class>cornerdrop_collect/sales_order_invoice_total_cornerDrop_fee</class>
84
+ <after>tax</after>
85
+ </cornerdrop_fee>
86
+ </totals>
87
+ </order_invoice>
88
+ <order_creditmemo>
89
+ <totals>
90
+ <cornerdrop_fee>
91
+ <class>cornerdrop_collect/sales_order_creditmemo_total_cornerDrop_fee</class>
92
+ <after>tax</after>
93
+ </cornerdrop_fee>
94
+ </totals>
95
+ </order_creditmemo>
96
+ </sales>
97
+ <fieldsets>
98
+ <sales_convert_quote_address>
99
+ <is_cornerdrop_collect>
100
+ <to_order_address>*</to_order_address>
101
+ </is_cornerdrop_collect>
102
+ <cornerdrop_store_id>
103
+ <to_order_address>*</to_order_address>
104
+ </cornerdrop_store_id>
105
+ <cornerdrop_reservation_code>
106
+ <to_order_address>*</to_order_address>
107
+ </cornerdrop_reservation_code>
108
+ <cornerdrop_fee_amount>
109
+ <to_order>*</to_order>
110
+ </cornerdrop_fee_amount>
111
+ <base_cornerdrop_fee_amount>
112
+ <to_order>*</to_order>
113
+ </base_cornerdrop_fee_amount>
114
+ <cornerdrop_tax_amount>
115
+ <to_order>*</to_order>
116
+ </cornerdrop_tax_amount>
117
+ <base_cornerdrop_tax_amount>
118
+ <to_order>*</to_order>
119
+ </base_cornerdrop_tax_amount>
120
+ </sales_convert_quote_address>
121
+ </fieldsets>
122
+ <resources>
123
+ <cornerdrop_collect_setup>
124
+ <setup>
125
+ <module>CornerDrop_Collect</module>
126
+ <class>CornerDrop_Collect_Model_Resource_Setup</class>
127
+ </setup>
128
+ </cornerdrop_collect_setup>
129
+ </resources>
130
+ <template>
131
+ <email>
132
+ <cornerdrop_collect_settings_code_email_template>
133
+ <label>CornerDrop Collect Code</label>
134
+ <file>cornerdrop/collect/code.html</file>
135
+ <type>html</type>
136
+ </cornerdrop_collect_settings_code_email_template>
137
+ </email>
138
+ </template>
139
+ </global>
140
+ <admin>
141
+ <routers>
142
+ <adminhtml>
143
+ <args>
144
+ <modules>
145
+ <cornerdrop_collect before="Mage_Adminhtml">CornerDrop_Collect_Adminhtml</cornerdrop_collect>
146
+ </modules>
147
+ </args>
148
+ </adminhtml>
149
+ </routers>
150
+ </admin>
151
+ <adminhtml>
152
+ <layout>
153
+ <updates>
154
+ <cornerdrop_collect>
155
+ <file>cornerdrop/collect.xml</file>
156
+ </cornerdrop_collect>
157
+ </updates>
158
+ </layout>
159
+ <events>
160
+ <adminhtml_sales_order_create_process_data>
161
+ <observers>
162
+ <cornerdrop_collect>
163
+ <type>singleton</type>
164
+ <class>cornerdrop_collect/observer</class>
165
+ <method>setAdminCornerDropCollectFlagAndReserve</method>
166
+ </cornerdrop_collect>
167
+ </observers>
168
+ </adminhtml_sales_order_create_process_data>
169
+ </events>
170
+ </adminhtml>
171
+ <frontend>
172
+ <routers>
173
+ <cornerdrop_collect>
174
+ <use>standard</use>
175
+ <args>
176
+ <module>CornerDrop_Collect</module>
177
+ <frontName>cornerdrop_collect</frontName>
178
+ </args>
179
+ </cornerdrop_collect>
180
+ </routers>
181
+ <layout>
182
+ <updates>
183
+ <cornerdrop_collect>
184
+ <file>cornerdrop/collect.xml</file>
185
+ </cornerdrop_collect>
186
+ </updates>
187
+ </layout>
188
+ </frontend>
189
+ <crontab>
190
+ <jobs>
191
+ <cornerdrop_collect_account_status_check>
192
+ <schedule>
193
+ <cron_expr>*/5 * * * *</cron_expr>
194
+ </schedule>
195
+ <run>
196
+ <model>cornerdrop_collect/observer::checkAccountStatus</model>
197
+ </run>
198
+ </cornerdrop_collect_account_status_check>
199
+ <cornerdrop_collect_send_notifications>
200
+ <schedule>
201
+ <cron_expr>*/15 * * * *</cron_expr>
202
+ </schedule>
203
+ <run>
204
+ <model>cornerdrop_collect/cron::sendNotifications</model>
205
+ </run>
206
+ </cornerdrop_collect_send_notifications>
207
+ </jobs>
208
+ </crontab>
209
+ <default>
210
+ <cornerdrop_collect>
211
+ <settings>
212
+ <active>0</active>
213
+ <code_email_template>cornerdrop_collect_code_email_template</code_email_template>
214
+ <api_uri>https://api.cornerdrop.com/papi/</api_uri>
215
+ </settings>
216
+ <address_templates>
217
+ <text><![CDATA[
218
+ {{depend is_cornerdrop_collect}}(CornerDrop address){{/depend}}]]></text>
219
+ <oneline><![CDATA[{{depend is_cornerdrop_collect}} (CornerDrop address){{/depend}}]]></oneline>
220
+ <html><![CDATA[{{depend is_cornerdrop_collect}}<br/>(CornerDrop address){{/depend}}]]></html>
221
+ <pdf><![CDATA[{{depend is_cornerdrop_collect}}<br/>(CornerDrop address){{/depend}}]]></pdf>
222
+ </address_templates>
223
+ </cornerdrop_collect>
224
+ </default>
225
+ <phpunit>
226
+ <suite>
227
+ <modules>
228
+ <CornerDrop_Collect/>
229
+ </modules>
230
+ </suite>
231
+ </phpunit>
232
+ </config>
app/code/community/CornerDrop/Collect/etc/system.xml ADDED
@@ -0,0 +1,172 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <config>
2
+ <sections>
3
+ <cornerdrop_collect translate="label" module="cornerdrop_collect">
4
+ <label>CornerDrop</label>
5
+ <tab>sales</tab>
6
+ <frontend_type>text</frontend_type>
7
+ <sort_order>990</sort_order>
8
+ <show_in_default>1</show_in_default>
9
+ <show_in_website>1</show_in_website>
10
+ <show_in_store>1</show_in_store>
11
+ <groups>
12
+ <status translate="label">
13
+ <label>Account Status</label>
14
+ <sort_order>10</sort_order>
15
+ <show_in_default>1</show_in_default>
16
+ <show_in_website>1</show_in_website>
17
+ <show_in_store>1</show_in_store>
18
+ <expanded>1</expanded>
19
+ <fields>
20
+ <balance translate="label">
21
+ <label>Credit Balance</label>
22
+ <frontend_model>cornerdrop_collect/adminhtml_form_field_account_balance</frontend_model>
23
+ <sort_order>10</sort_order>
24
+ <show_in_default>1</show_in_default>
25
+ <show_in_website>1</show_in_website>
26
+ <show_in_store>1</show_in_store>
27
+ </balance>
28
+ <last_checked translate="label">
29
+ <label>Last Checked</label>
30
+ <frontend_type>label</frontend_type>
31
+ <sort_order>100</sort_order>
32
+ <show_in_default>1</show_in_default>
33
+ <show_in_website>1</show_in_website>
34
+ <show_in_store>1</show_in_store>
35
+ </last_checked>
36
+ </fields>
37
+ </status>
38
+ <settings translate="label">
39
+ <label>General Settings</label>
40
+ <frontend_type>text</frontend_type>
41
+ <sort_order>20</sort_order>
42
+ <show_in_default>1</show_in_default>
43
+ <show_in_website>1</show_in_website>
44
+ <show_in_store>1</show_in_store>
45
+ <expanded>1</expanded>
46
+ <fields>
47
+ <enable translate="label">
48
+ <label>Enabled</label>
49
+ <frontend_type>select</frontend_type>
50
+ <source_model>adminhtml/system_config_source_yesno</source_model>
51
+ <sort_order>1</sort_order>
52
+ <show_in_default>1</show_in_default>
53
+ <show_in_website>1</show_in_website>
54
+ <show_in_store>1</show_in_store>
55
+ </enable>
56
+ <api_key translate="label">
57
+ <label>API Key</label>
58
+ <frontend_type>text</frontend_type>
59
+ <validate>required-entry</validate>
60
+ <comment><![CDATA[Login to your CornerDrop account at <a href="https://cornerdrop.com/" target="_blank">www.cornerdrop.com</a> to obtain your API key.]]></comment>
61
+ <sort_order>2</sort_order>
62
+ <show_in_default>1</show_in_default>
63
+ <show_in_website>1</show_in_website>
64
+ <show_in_store>1</show_in_store>
65
+ </api_key>
66
+ <api_uri>
67
+ <label>API URL</label>
68
+ <frontend_type>text</frontend_type>
69
+ <validate>required-entry</validate>
70
+ <comment><![CDATA[Default value.]]></comment>
71
+ <sort_order>3</sort_order>
72
+ <show_in_default>1</show_in_default>
73
+ <show_in_website>1</show_in_website>
74
+ <show_in_store>1</show_in_store>
75
+ </api_uri>
76
+ <code_email_template translate="label">
77
+ <label>CornerDrop Customer Collection Email Template</label>
78
+ <frontend_type>select</frontend_type>
79
+ <source_model>adminhtml/system_config_source_email_template</source_model>
80
+ <sort_order>10</sort_order>
81
+ <show_in_default>1</show_in_default>
82
+ <show_in_website>1</show_in_website>
83
+ <show_in_store>1</show_in_store>
84
+ </code_email_template>
85
+ </fields>
86
+ </settings>
87
+ <address_templates translate="label comment">
88
+ <label>Address Templates</label>
89
+ <comment><![CDATA[These address templates are appended to the Customer Address templates for any CornerDrop location addresses.]]></comment>
90
+ <sort_order>30</sort_order>
91
+ <show_in_default>1</show_in_default>
92
+ <show_in_website>1</show_in_website>
93
+ <show_in_store>1</show_in_store>
94
+ <fields>
95
+ <text translate="label">
96
+ <label>Text</label>
97
+ <frontend_type>textarea</frontend_type>
98
+ <sort_order>1</sort_order>
99
+ <show_in_default>1</show_in_default>
100
+ <show_in_website>1</show_in_website>
101
+ <show_in_store>1</show_in_store>
102
+ </text>
103
+ <oneline translate="label">
104
+ <label>Text One Line</label>
105
+ <frontend_type>textarea</frontend_type>
106
+ <sort_order>2</sort_order>
107
+ <show_in_default>1</show_in_default>
108
+ <show_in_website>1</show_in_website>
109
+ <show_in_store>1</show_in_store>
110
+ </oneline>
111
+ <html translate="label">
112
+ <label>HTML</label>
113
+ <frontend_type>textarea</frontend_type>
114
+ <sort_order>3</sort_order>
115
+ <show_in_default>1</show_in_default>
116
+ <show_in_website>1</show_in_website>
117
+ <show_in_store>1</show_in_store>
118
+ </html>
119
+ <pdf translate="label">
120
+ <label>PDF</label>
121
+ <frontend_type>textarea</frontend_type>
122
+ <sort_order>4</sort_order>
123
+ <show_in_default>1</show_in_default>
124
+ <show_in_website>1</show_in_website>
125
+ <show_in_store>1</show_in_store>
126
+ </pdf>
127
+ </fields>
128
+ </address_templates>
129
+ <fee_settings translate="label">
130
+ <label>CornerDrop Fee Settings</label>
131
+ <frontend_type>text</frontend_type>
132
+ <sort_order>40</sort_order>
133
+ <show_in_default>1</show_in_default>
134
+ <show_in_website>1</show_in_website>
135
+ <show_in_store>1</show_in_store>
136
+ <fields>
137
+ <additional_fee translate="label">
138
+ <label>Additional Fee</label>
139
+ <frontend_type>text</frontend_type>
140
+ <validate>validate-number</validate>
141
+ <validate>validate-not-negative-number</validate>
142
+ <comment><![CDATA[Additional fee (excluding tax) which is charged to the customer. Uses the default store currency.]]></comment>
143
+ <sort_order>1</sort_order>
144
+ <show_in_default>1</show_in_default>
145
+ <show_in_website>1</show_in_website>
146
+ <show_in_store>1</show_in_store>
147
+ </additional_fee>
148
+ <include_tax translate="label">
149
+ <label>CornerDrop Fee Include Tax?</label>
150
+ <frontend_type>select</frontend_type>
151
+ <source_model>adminhtml/system_config_source_yesno</source_model>
152
+ <comment><![CDATA[Is the 'Additional Fee' inclusive of tax?]]></comment>
153
+ <sort_order>2</sort_order>
154
+ <show_in_default>1</show_in_default>
155
+ <show_in_website>1</show_in_website>
156
+ <show_in_store>1</show_in_store>
157
+ </include_tax>
158
+ <tax_class translate="label">
159
+ <label>Tax Class</label>
160
+ <frontend_type>select</frontend_type>
161
+ <source_model>tax/resource_class_collection</source_model>
162
+ <sort_order>3</sort_order>
163
+ <show_in_default>1</show_in_default>
164
+ <show_in_website>1</show_in_website>
165
+ <show_in_store>1</show_in_store>
166
+ </tax_class>
167
+ </fields>
168
+ </fee_settings>
169
+ </groups>
170
+ </cornerdrop_collect>
171
+ </sections>
172
+ </config>
app/code/community/CornerDrop/Collect/sql/cornerdrop_collect_setup/install-1.0.0.php ADDED
@@ -0,0 +1,75 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /** @var Mage_Core_Model_Resource_Setup $installer */
4
+ $installer = $this;
5
+
6
+ $installer->startSetup();
7
+
8
+ $connection = $installer->getConnection();
9
+
10
+ $type_decimal_column = array(
11
+ 'type' => Varien_Db_Ddl_Table::TYPE_DECIMAL,
12
+ 'scale' => '4',
13
+ 'precision' => '12',
14
+ 'comment' => 'CornerDrop Collect Column'
15
+ );
16
+
17
+ $type_int_column = array(
18
+ 'type' => Varien_Db_Ddl_Table::TYPE_INTEGER,
19
+ 'unsigned' => true,
20
+ 'comment' => "CornerDrop Collect Column"
21
+ );
22
+
23
+ $type_boolean_column = array(
24
+ 'type' => Varien_Db_Ddl_Table::TYPE_BOOLEAN,
25
+ 'nullable' => false,
26
+ 'default' => 0,
27
+ 'comment' => "CornerDrop Collect Column"
28
+ );
29
+
30
+
31
+ $tables = array(
32
+ $installer->getTable('sales/quote_address') => array(
33
+ CornerDrop_Collect_Helper_Data::IS_CORNERDROP_COLLECT => Varien_Db_Ddl_Table::TYPE_BOOLEAN,
34
+ CornerDrop_Collect_Helper_Data::CORNERDROP_STORE_ID_COLUMN => $type_int_column,
35
+ CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT => $type_decimal_column,
36
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT => $type_decimal_column,
37
+ CornerDrop_Collect_Helper_Data::CORNERDROP_TAX => $type_decimal_column,
38
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX => $type_decimal_column
39
+ ),
40
+ $installer->getTable('sales/order') => array(
41
+ CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT => $type_decimal_column,
42
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT => $type_decimal_column,
43
+ CornerDrop_Collect_Helper_Data::CORNERDROP_TAX => $type_decimal_column,
44
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX => $type_decimal_column,
45
+ CornerDrop_Collect_Helper_Data::ORDERED_NOTIFICATION_COLUMN => $type_boolean_column,
46
+ CornerDrop_Collect_Helper_Data::SHIPPED_NOTIFICATION_COLUMN => $type_boolean_column,
47
+ CornerDrop_Collect_Helper_Data::CANCELLED_NOTIFICATION_COLUMN => $type_boolean_column
48
+ ),
49
+ $installer->getTable('sales/order_address') => array(
50
+ CornerDrop_Collect_Helper_Data::IS_CORNERDROP_COLLECT => Varien_Db_Ddl_Table::TYPE_BOOLEAN,
51
+ CornerDrop_Collect_Helper_Data::CORNERDROP_STORE_ID_COLUMN => $type_int_column
52
+ ),
53
+ $installer->getTable('sales/invoice') => array(
54
+ CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT => $type_decimal_column,
55
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT => $type_decimal_column,
56
+ CornerDrop_Collect_Helper_Data::CORNERDROP_TAX => $type_decimal_column,
57
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX => $type_decimal_column
58
+ ),
59
+ $installer->getTable('sales/creditmemo') => array(
60
+ CornerDrop_Collect_Helper_Data::CORNERDROP_FEE_AMOUNT => $type_decimal_column,
61
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_FEE_AMOUNT => $type_decimal_column,
62
+ CornerDrop_Collect_Helper_Data::CORNERDROP_TAX => $type_decimal_column,
63
+ CornerDrop_Collect_Helper_Data::BASE_CORNERDROP_TAX => $type_decimal_column
64
+ )
65
+ );
66
+
67
+ foreach($tables as $table => $columns) {
68
+ foreach ($columns as $column => $type) {
69
+ if (!$connection->tableColumnExists($table, $column)) {
70
+ $connection->addColumn($table, $column, $type);
71
+ }
72
+ }
73
+ }
74
+
75
+ $installer->endSetup();
app/code/community/CornerDrop/Collect/sql/cornerdrop_collect_setup/upgrade-1.0.0-1.1.0.php ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /** @var Mage_Core_Model_Resource_Setup $installer */
4
+ $installer = $this;
5
+
6
+ $installer->startSetup();
7
+
8
+ $connection = $installer->getConnection();
9
+
10
+ $type_int_column = array(
11
+ 'type' => Varien_Db_Ddl_Table::TYPE_INTEGER,
12
+ 'unsigned' => true,
13
+ 'comment' => "CornerDrop Collect Column"
14
+ );
15
+
16
+ $tables = array(
17
+ $installer->getTable('sales/quote_address') => array(
18
+ CornerDrop_Collect_Helper_Data::CORNERDROP_RESERVATION_CODE => $type_int_column,
19
+ ),
20
+ $installer->getTable('sales/order_address') => array(
21
+ CornerDrop_Collect_Helper_Data::CORNERDROP_RESERVATION_CODE => $type_int_column
22
+ )
23
+ );
24
+
25
+ foreach($tables as $table => $columns) {
26
+ foreach ($columns as $column => $type) {
27
+ if (!$connection->tableColumnExists($table, $column)) {
28
+ $connection->addColumn($table, $column, $type);
29
+ }
30
+ }
31
+ }
32
+
33
+ $installer->endSetup();
app/code/community/CornerDrop/Collect/sql/cornerdrop_collect_setup/upgrade-1.1.0-1.2.0.php ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /** @var Mage_Core_Model_Resource_Setup $installer */
4
+ $installer = $this;
5
+
6
+ $installer->startSetup();
7
+
8
+ $connection = $installer->getConnection();
9
+
10
+ // Convert all order notification columns to int
11
+
12
+ $table = $installer->getTable("sales/order");
13
+
14
+ $notification_columns = array(
15
+ CornerDrop_Collect_Helper_Data::ORDERED_NOTIFICATION_COLUMN,
16
+ CornerDrop_Collect_Helper_Data::SHIPPED_NOTIFICATION_COLUMN,
17
+ CornerDrop_Collect_Helper_Data::CANCELLED_NOTIFICATION_COLUMN
18
+ );
19
+
20
+ $type = array(
21
+ "type" => Varien_Db_Ddl_Table::TYPE_INTEGER,
22
+ "unsigned" => true,
23
+ "nullable" => false,
24
+ "default" => 0,
25
+ "comment" => "CornerDrop Collect Column"
26
+ );
27
+
28
+ foreach ($notification_columns as $column) {
29
+ $connection->modifyColumn(
30
+ $table,
31
+ $column,
32
+ $type
33
+ );
34
+ }
35
+
36
+ $installer->endSetup();
app/design/adminhtml/default/default/layout/cornerdrop/collect.xml ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout version="0.1.0">
3
+
4
+ <adminhtml_sales_order_create_index>
5
+ <update handle="editor" />
6
+
7
+ <reference name="head">
8
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
9
+ <file>cornerdrop/collect/switch.js</file>
10
+ </action>
11
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
12
+ <file>cornerdrop/collect/search.js</file>
13
+ </action>
14
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
15
+ <file>cornerdrop/collect/geolocationAPI.js</file>
16
+ </action>
17
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
18
+ <file>cornerdrop/collect/gmaps.js</file>
19
+ </action>
20
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
21
+ <file>cornerdrop/collect/adminhtml_search.js</file>
22
+ </action>
23
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
24
+ <file>cornerdrop/collect/ui.js</file>
25
+ </action>
26
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
27
+ <file>cornerdrop/collect/adminhtml_ui.js</file>
28
+ </action>
29
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
30
+ <file>cornerdrop/collect/adminhtml.js</file>
31
+ </action>
32
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
33
+ <file>cornerdrop/collect/event.simulate.js</file>
34
+ </action>
35
+ <action method="addCss"><name>cornerdrop/collect/css/collect.css</name></action>
36
+ </reference>
37
+
38
+ <reference name="shipping_address">
39
+ <action method="setTemplate" ifconfig="cornerdrop_collect/settings/enable"><template>cornerdrop/collect/order/create/form/address/shipping.phtml</template></action>
40
+ </reference>
41
+
42
+ <reference name="before_body_end">
43
+ <block type="core/text" name="google.api">
44
+ <action method="setText" ifconfig="cornerdrop_collect/settings/enable"><text><![CDATA[<script src='http://maps.google.com/maps/api/js?sensor=false'></script>]]></text></action>
45
+ </block>
46
+ </reference>
47
+ </adminhtml_sales_order_create_index>
48
+
49
+ <adminhtml_sales_order_create_load_block_shipping_address>
50
+ <reference name="shipping_address">
51
+ <action method="setTemplate" ifconfig="cornerdrop_collect/settings/enable"><template>cornerdrop/collect/order/create/form/address/shipping.phtml</template></action>
52
+ </reference>
53
+ </adminhtml_sales_order_create_load_block_shipping_address>
54
+
55
+ <adminhtml_sales_order_create_load_block_data>
56
+ <reference name="shipping_address">
57
+ <action method="setTemplate" ifconfig="cornerdrop_collect/settings/enable"><template>cornerdrop/collect/order/create/form/address/shipping.phtml</template></action>
58
+ </reference>
59
+ </adminhtml_sales_order_create_load_block_data>
60
+
61
+ <adminhtml_sales_order_view>
62
+ <reference name="order_totals">
63
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
64
+ </reference>
65
+ </adminhtml_sales_order_view>
66
+ <adminhtml_sales_order_invoice_view>
67
+ <reference name="invoice_totals">
68
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
69
+ </reference>
70
+ </adminhtml_sales_order_invoice_view>
71
+ <adminhtml_sales_order_creditmemo_view>
72
+ <reference name="creditmemo_totals">
73
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
74
+ </reference>
75
+ </adminhtml_sales_order_creditmemo_view>
76
+
77
+ <adminhtml_sales_order_invoice_new>
78
+ <reference name="invoice_totals">
79
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
80
+ </reference>
81
+ </adminhtml_sales_order_invoice_new>
82
+ <adminhtml_sales_order_creditmemo_new>
83
+ <reference name="creditmemo_totals">
84
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
85
+ </reference>
86
+ </adminhtml_sales_order_creditmemo_new>
87
+
88
+ <adminhtml_sales_order_invoice_updateqty>
89
+ <reference name="invoice_totals">
90
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
91
+ </reference>
92
+ </adminhtml_sales_order_invoice_updateqty>
93
+ <adminhtml_sales_order_creditmemo_updateqty>
94
+ <reference name="creditmemo_totals">
95
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
96
+ </reference>
97
+ </adminhtml_sales_order_creditmemo_updateqty>
98
+
99
+ </layout>
app/design/adminhtml/default/default/template/cornerdrop/collect/order/create/form/address/shipping.phtml ADDED
@@ -0,0 +1,175 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Magento
4
+ *
5
+ * NOTICE OF LICENSE
6
+ *
7
+ * This source file is subject to the Academic Free License (AFL 3.0)
8
+ * that is bundled with this package in the file LICENSE_AFL.txt.
9
+ * It is also available through the world-wide-web at this URL:
10
+ * http://opensource.org/licenses/afl-3.0.php
11
+ * If you did not receive a copy of the license and are unable to
12
+ * obtain it through the world-wide-web, please send an email
13
+ * to license@magento.com so we can send you a copy immediately.
14
+ *
15
+ * DISCLAIMER
16
+ *
17
+ * Do not edit or add to this file if you wish to upgrade Magento to newer
18
+ * versions in the future. If you wish to customize Magento for your
19
+ * needs please refer to http://www.magento.com for more information.
20
+ *
21
+ * @category design
22
+ * @package default_default
23
+ * @copyright Copyright (c) 2006-2014 X.commerce, Inc. (http://www.magento.com)
24
+ * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
25
+ */
26
+ if($this->getIsShipping()):
27
+ $_fieldsContainerId = 'order-shipping_address_fields';
28
+ $_addressChoiceContainerId = 'order-shipping_address_choice';
29
+ ?>
30
+ <script type="text/javascript">
31
+ order.shippingAddressContainer = '<?php echo $_fieldsContainerId ?>';
32
+ order.setAddresses(<?php echo $this->getAddressCollectionJson() ?>);
33
+ </script>
34
+ <?php
35
+ else:
36
+ $_fieldsContainerId = 'order-billing_address_fields';
37
+ $_addressChoiceContainerId = 'order-billing_address_choice';
38
+ ?>
39
+ <script type="text/javascript">
40
+ order.billingAddressContainer = '<?php echo $_fieldsContainerId ?>';
41
+ </script>
42
+ <?php
43
+ endif; ?>
44
+ <div class="entry-edit">
45
+
46
+ <div class="entry-edit-head">
47
+ <h4 class="icon-head fieldset-legend <?php echo $this->getHeaderCssClass() ?>"><?php echo $this->getHeaderText() ?></h4>
48
+ </div>
49
+
50
+ <fieldset class="np">
51
+ <div id = "<?php echo $_addressChoiceContainerId ?>" class="order-choose-address">
52
+ <?php echo Mage::helper('sales')->__('Select from existing customer addresses:') ?><br/>
53
+ <?php $_id = $this->getForm()->getHtmlIdPrefix() . 'customer_address_id' ?>
54
+ <select id="<?php echo $_id ?>" name="<?php echo $this->getForm()->getHtmlNamePrefix()?>[customer_address_id]" style="width:97.5%;" onchange="order.selectAddress(this, '<?php echo $_fieldsContainerId ?>')">
55
+ <option value=""><?php echo Mage::helper('sales')->__('Add New Address') ?></option>
56
+ <?php foreach ($this->getAddressCollection() as $_address): ?>
57
+ <?php //if($this->getAddressAsString($_address)!=$this->getAddressAsString($this->getAddress())): ?>
58
+ <option value="<?php echo $_address->getId() ?>"<?php if ($_address->getId()==$this->getAddressId()): ?> selected="selected"<?php endif; ?>>
59
+ <?php echo $this->getAddressAsString($_address) ?>
60
+ </option>
61
+ <?php //endif; ?>
62
+ <?php endforeach; ?>
63
+
64
+ </select>
65
+ <br/>
66
+ <?php if($this->getIsShipping()): ?>
67
+ <input type="checkbox" id="order-shipping_same_as_billing" name="shipping_same_as_billing" onclick="order.setShippingAsBilling(this.checked)" <?php if($this->getIsAsBilling()): ?>checked<?php endif; ?>/>
68
+ <label for="order-shipping_same_as_billing" class="no-float"><?php echo Mage::helper('sales')->__('Same As Billing Address') ?></label>
69
+ <?php else: ?>
70
+ &nbsp;
71
+ <?php endif; ?>
72
+ </div>
73
+
74
+ <div class="cdc-control content">
75
+ <span class="cdc-control-info"></span>
76
+ <button class="cdc-control-button <?php if($this->getIsAsBilling()): ?>disabled<?php endif; ?>"><?php echo Mage::helper("cornerdrop_collect")->__("Click & Collect from a CornerDrop location") ?></button>
77
+ </div>
78
+
79
+ <div class="order-address" id="<?php echo $_fieldsContainerId ?>">
80
+ <div class="content">
81
+ <?php echo $this->getForm()->toHtml() ?>
82
+ <table cellspacing="0" class="form-list">
83
+ <tr>
84
+ <td class="label">
85
+ <label for="order-shipping_address-cornerdrop_store_id">CornerDrop Store</label>
86
+ </td>
87
+ <td class="value">
88
+ <input id="order-shipping_address-cornerdrop_store_id" name="order[shipping_address][cornerdrop_store_id]" value="<?php echo $this->escapeHtml($this->getAddress()->getData(CornerDrop_Collect_Helper_Data::CORNERDROP_STORE_ID_COLUMN)) ?>" readonly="readonly" class=" input-text" type="text" />
89
+ </td>
90
+ </tr>
91
+ <tr>
92
+ <td></td>
93
+ <td>
94
+ <p class="note">
95
+ This is the CornerDrop store identifier associated with this order. If this is left blank
96
+ then the order will not be submitted to CornerDrop. To populate this field, use the store
97
+ locator Click &amp; Collect wizard above. If you no longer wish to fulfil this order via
98
+ CornerDrop <a href="#" class="js-cdc-clear-cornerdrop">click here</a>
99
+ to clear the store and shipping address.
100
+ </p>
101
+ </td>
102
+ </tr>
103
+ </table>
104
+ </div>
105
+ <div class="order-save-in-address-book">
106
+ <input name="<?php echo $this->getForm()->getHtmlNamePrefix()?>[save_in_address_book]" type="checkbox" id="<?php echo $this->getForm()->getHtmlIdPrefix()?>save_in_address_book" value="1" <?php if (!$this->getDontSaveInAddressBook() && $this->getAddress()->getSaveInAddressBook()):?> checked="checked"<?php endif;?>/>
107
+ <label for="<?php echo $this->getForm()->getHtmlIdPrefix()?>save_in_address_book"><?php echo Mage::helper('sales')->__('Save in address book') ?></label>
108
+ </div>
109
+ </div>
110
+ <?php $hideElement = 'address-' . ($this->getIsShipping() ? 'shipping' : 'billing') . '-overlay'; ?>
111
+ <div style="display:none;" id="<?php echo $hideElement ?>" class="overlay"><span><?php echo $this->__('Shipping address selection is not applicable') ?></span></div>
112
+ <script type="text/javascript">
113
+ order.bindAddressFields('<?php echo $_fieldsContainerId ?>');
114
+ order.bindAddressFields('<?php echo $_addressChoiceContainerId ?>');
115
+ <?php if($this->getIsShipping() && $this->getIsAsBilling()): ?>
116
+ order.disableShippingAddress(true);
117
+ <?php endif; ?>
118
+ </script>
119
+ </fieldset>
120
+ </div>
121
+
122
+ <?php $cdc_search_template = <<<HTML
123
+ <div class="cdc-panel">
124
+ <div class="cdc-info">
125
+ </div>
126
+ <div class="cdc-search-container">
127
+ <form action="" id="cdc-search-form" class="cdc-search-form">
128
+ <ul>
129
+ <li class="wide">
130
+ <label for="cornerdrop-collect-search" class="cdc-search-label">Search city, town or
131
+ postcode</label>
132
+ <input type="text" placeholder="Search city, town or postcode"
133
+ name="cornerdrop-collect[search]" class="cdc-searchbox input-text"
134
+ id="cornerdrop-collect-search"/>
135
+ <button class="js-cdc-reset-button cdc-reset-button cdc-hidden" type="reset">Reset
136
+ </button>
137
+ <button class="js-cdc-search-button cdc-search-button">Search</button>
138
+
139
+ <i class="js-cdc-geolocation cdc-geolocation"><!-- noop --></i>
140
+ <i class="js-cdc-undo cdc-undo"><!-- noop --></i>
141
+ </li>
142
+ </ul>
143
+ </form>
144
+ </div>
145
+
146
+ <div class="js-cdc-search-results cdc-search-results cdc-hidden">
147
+ </div>
148
+
149
+ <a class="js-cdc-results-pager cdc-results-pager cdc-hidden" href="#">View more results</a>
150
+
151
+ <div class="cdc-map-container">
152
+ <div id="cdc-map-canvas" class="cdc-map"></div>
153
+ </div>
154
+
155
+ <div class="js-cdc-store cdc-hidden cdc-store">
156
+ <span class="cdc-store-title">Selected Store:</span>
157
+
158
+ <div class="js-cdc-store-details cdc-store-details">
159
+
160
+ </div>
161
+ </div>
162
+ </div>
163
+ HTML;
164
+ ?>
165
+
166
+ <script type="text/javascript">
167
+ CornerDrop_Collect_Adminhtml = new window.CornerDrop.Collect.Adminhtml({
168
+ activateLabel: "<?php echo Mage::helper("cornerdrop_collect")->__("Click & Collect from a CornerDrop location") ?>",
169
+ editLabel: "<?php echo Mage::helper("cornerdrop_collect")->__("Edit") ?>",
170
+ dialogTitle: "<?php echo Mage::helper("cornerdrop_collect")->__("Select CornerDrop location") ?>",
171
+ uiSearchEndpoint: "<?php echo $this->getUrl('adminhtml/cornerdrop_collect_search/index') ?>",
172
+ searchWindowTemplate: <?php echo Mage::helper('core')->jsonEncode($cdc_search_template) ?>
173
+ });
174
+ </script>
175
+
app/design/frontend/base/default/layout/cornerdrop/collect.xml ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <layout version="0.1.0">
3
+
4
+ <checkout_onepage_index>
5
+ <reference name="head">
6
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
7
+ <file>cornerdrop/collect/switch.js</file>
8
+ </action>
9
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
10
+ <file>cornerdrop/collect/search.js</file>
11
+ </action>
12
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
13
+ <file>cornerdrop/collect/geolocationAPI.js</file>
14
+ </action>
15
+ <block type="core/text" name="google.api">
16
+ <action method="setText" ifconfig="cornerdrop_collect/settings/enable"><text><![CDATA[<script src='http://maps.google.com/maps/api/js?sensor=false'></script>]]></text></action>
17
+ </block>
18
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
19
+ <file>cornerdrop/collect/gmaps.js</file>
20
+ </action>
21
+ <action method="addJs" ifconfig="cornerdrop_collect/settings/enable">
22
+ <file>cornerdrop/collect/ui.js</file>
23
+ </action>
24
+ <action method="addCss"><name>cornerdrop/collect/css/collect.css</name></action>
25
+ </reference>
26
+ <reference name="content">
27
+ <block type="cornerdrop_collect/checkout_switch" name="cornerdrop.collect.switch" before="-" template="cornerdrop/collect/checkout/switch.phtml">
28
+ <block type="core/template" name="cornerdrop.collect.switch.search" as="search_template" template="cornerdrop/collect/search.phtml" />
29
+ </block>
30
+ </reference>
31
+ </checkout_onepage_index>
32
+
33
+ <checkout_onepage_success>
34
+ <reference name="head">
35
+ <action method="addCss"><name>cornerdrop/collect/css/collect.css</name></action>
36
+ </reference>
37
+ <reference name="content">
38
+ <block type="cornerdrop_collect/checkout_success" name="cornerdrop.collect.success" template="cornerdrop/collect/checkout/success.phtml" />
39
+ </reference>
40
+ </checkout_onepage_success>
41
+
42
+ <sales_order_view>
43
+ <reference name="order_totals">
44
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
45
+ </reference>
46
+ </sales_order_view>
47
+ <sales_guest_view>
48
+ <reference name="order_totals">
49
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
50
+ </reference>
51
+ </sales_guest_view>
52
+ <sales_order_invoice>
53
+ <reference name="invoice_totals">
54
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
55
+ </reference>
56
+ </sales_order_invoice>
57
+ <sales_guest_invoice>
58
+ <reference name="invoice_totals">
59
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
60
+ </reference>
61
+ </sales_guest_invoice>
62
+ <sales_order_creditmemo>
63
+ <reference name="creditmemo_totals">
64
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
65
+ </reference>
66
+ </sales_order_creditmemo>
67
+ <sales_guest_creditmemo>
68
+ <reference name="creditmemo_totals">
69
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
70
+ </reference>
71
+ </sales_guest_creditmemo>
72
+
73
+ <sales_order_print>
74
+ <reference name="order_totals">
75
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
76
+ </reference>
77
+ </sales_order_print>
78
+ <sales_guest_print>
79
+ <reference name="order_totals">
80
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
81
+ </reference>
82
+ </sales_guest_print>
83
+ <sales_order_printinvoice>
84
+ <reference name="invoice_totals">
85
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
86
+ </reference>
87
+ </sales_order_printinvoice>
88
+ <sales_guest_printinvoice>
89
+ <reference name="invoice_totals">
90
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
91
+ </reference>
92
+ </sales_guest_printinvoice>
93
+ <sales_order_printcreditmemo>
94
+ <reference name="creditmemo_totals">
95
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
96
+ </reference>
97
+ </sales_order_printcreditmemo>
98
+ <sales_guest_printcreditmemo>
99
+ <reference name="creditmemo_totals">
100
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
101
+ </reference>
102
+ </sales_guest_printcreditmemo>
103
+
104
+ <sales_email_order_items>
105
+ <reference name="order_totals">
106
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
107
+ </reference>
108
+ </sales_email_order_items>
109
+ <sales_email_order_invoice_items>
110
+ <reference name="invoice_totals">
111
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
112
+ </reference>
113
+ </sales_email_order_invoice_items>
114
+ <sales_email_order_creditmemo_items>
115
+ <reference name="creditmemo_totals">
116
+ <block type="cornerdrop_collect/sales_order_totals" name="cornerdrop_fee_total" />
117
+ </reference>
118
+ </sales_email_order_creditmemo_items>
119
+
120
+ <sales_email_order_shipment_items>
121
+ <reference name="additional.product.info">
122
+ <block type="core/template" name="additional.product.info.cornerdrop" template="cornerdrop/collect/email/shipment.phtml" />
123
+ </reference>
124
+ </sales_email_order_shipment_items>
125
+
126
+ </layout>
app/design/frontend/base/default/template/cornerdrop/collect/checkout/success.phtml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
1
+ <?php /** @var CornerDrop_Collect_Block_Checkout_Success $this */ ?>
2
+ <?php if ($this->isCornerDropOrder()): ?>
3
+ <p><?php echo $this->__("Thank you for choosing Click &amp; Collect with %s. You will receive an email with your parcel code to collect your order from your CornerDrop location. Simply present this and your PIN to pick up your parcel.", $this->getLogoHtml()) ?></p>
4
+ <?php endif; ?>
app/design/frontend/base/default/template/cornerdrop/collect/checkout/switch.phtml ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php /** @var CornerDrop_Collect_Block_Checkout_Switch $this */ ?>
2
+ <?php $_helper = Mage::helper("cornerdrop_collect"); ?>
3
+ <?php if ($this->isEnabled()): ?>
4
+ <script type="text/javascript">
5
+ document.observe("dom:loaded", function () {
6
+ CornerDrop_Collect_Switch = new window.CornerDrop.Collect.Switch({
7
+ labels: {
8
+ checkbox: <?php echo json_encode($this->getCheckboxLabel()) ?>,
9
+ deactivateButton: "<?php echo $this->getModuleHelper()->__("Switch to home delivery") ?>",
10
+ activateButton: "<?php echo $this->getModuleHelper()->__("Use CornerDrop") ?>"
11
+ },
12
+ value: <?php echo $this->getValue() ? "true" : "false" ?>
13
+ });
14
+
15
+ CornerDrop_Collect_UI = new window.CornerDrop.Collect.UI({
16
+ searchClass: new window.CornerDrop.Collect.Search({
17
+ endpoint: '<?php echo $this->getUrl('cornerdrop_collect/search/') ?>',
18
+ prepareFormCallback: shipping.newAddress.bind(shipping),
19
+ regionUpdateCallback: shippingRegionUpdater.update.bind(shippingRegionUpdater)
20
+ }),
21
+ geolocationAPIClass: new window.CornerDrop.Collect.GeolocationAPI(),
22
+ gmapsClass: new window.CornerDrop.Collect.Gmaps({
23
+ markerImage: '<?php echo $this->getImageUrl('droppoint_active.png') ?>'
24
+ }),
25
+ searchTemplate: <?php echo json_encode($this->getSearchTemplateHtml()) ?>,
26
+ initialState: <?php echo $this->getValue() ? "true" : "false" ?>,
27
+ termsAndConditionsLabel: "<?php echo $this->getModuleHelper()->__("By using this service you agree to the <a href='%s' target='_blank'>Terms &amp; Conditions</a>.", "https://cornerdrop.com/legal/consumer-terms-retailer") ?>"
28
+ });
29
+ });
30
+ </script>
31
+ <?php endif; ?>
app/design/frontend/base/default/template/cornerdrop/collect/email/shipment.phtml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
1
+ <?php /** @var Mage_Core_Block_Template $this */ ?>
2
+ <?php /** @var Mage_Sales_Model_Order_Shipment $shipment */ ?>
3
+ <?php $shipment = $this->getShipment() ?>
4
+ <?php if (count($shipment->getAllTracks()) > 0): ?>
5
+ <p><?php echo Mage::helper("cornerdrop_collect")->__("Track your parcel and collect it from your chosen CornerDrop within 10 days of delivery") ?></p>
6
+ <?php endif; ?>
app/design/frontend/base/default/template/cornerdrop/collect/search.phtml ADDED
@@ -0,0 +1,38 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php /** @var Mage_Core_Block_Template $this **/ ?>
2
+ <?php $config = Mage::helper("cornerdrop_collect/config") ?>
3
+ <div class="cdc-panel">
4
+ <div class="cdc-info">
5
+ <p><?php echo $this->__("Click & Collect from a CornerDrop location at a time that suits you.") ?></p>
6
+ <?php if ($config->getAdditionalFee()): ?>
7
+ <p><?php echo $this->__("This will add an additional %s fee to your order.", $config->getFormattedFee()) ?></p>
8
+ <?php endif; ?>
9
+ </div>
10
+ <div class="cdc-search-container">
11
+ <form action="" id="cdc-search-form" class="cdc-search-form">
12
+ <ul>
13
+ <li class="wide">
14
+ <label for="cornerdrop-collect-search" class="cdc-search-label"><?php echo $this->__('Search city, town or postcode') ?></label>
15
+ <input type="text" placeholder="Search city, town or postcode" name="cornerdrop-collect[search]" class="cdc-searchbox input-text" id="cornerdrop-collect-search"/>
16
+ <button class="js-cdc-reset-button cdc-reset-button cdc-hidden" type="reset"><?php echo $this->__('Reset') ?></button>
17
+ <button class="js-cdc-search-button cdc-search-button"><?php echo $this->__('Search'); ?></button>
18
+ </li>
19
+ </ul>
20
+ </form>
21
+ <i class="js-cdc-geolocation cdc-geolocation"><?php echo $this->__('Geolocation') ?></i>
22
+ </div>
23
+
24
+ <div class="js-cdc-search-results cdc-search-results cdc-hidden">
25
+ </div>
26
+
27
+ <a class="js-cdc-results-pager cdc-results-pager cdc-hidden" href="#"><?php echo $this->__('View more results') ?></a>
28
+
29
+ <div class="cdc-map-container">
30
+ <div id="cdc-map-canvas" class="cdc-map"></div>
31
+ </div>
32
+
33
+ <div class="js-cdc-store cdc-hidden cdc-store">
34
+ <span class="cdc-store-title"><?php echo $this->__('Selected Store:') ?></span>
35
+ <div class="js-cdc-store-details cdc-store-details"></div>
36
+ <a href="#" class="js-cdc-undo"><?php echo $this->__('Undo') ?></a>
37
+ </div>
38
+ </div>
app/etc/modules/CornerDrop_Collect.xml ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <config>
3
+ <modules>
4
+ <CornerDrop_Collect>
5
+ <active>true</active>
6
+ <codePool>community</codePool>
7
+ <depends>
8
+ <Mage_Sales />
9
+ </depends>
10
+ </CornerDrop_Collect>
11
+ </modules>
12
+ </config>
app/locale/en_US/template/email/cornerdrop/collect/code.html ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!--@subject {{var store.getFrontendName()}}: CornerDrop Package Code (Order # {{var order.increment_id}}) @-->
2
+ <!--@vars
3
+ {"var store.getFrontendName()":"Store Name",
4
+ "var order.increment_id":"Order Id",
5
+ "var cornerdrop_ref":"CornerDrop Package Reference",
6
+ "var cornerdrop_pin":"CornerDrop Secret PIN",
7
+ "var order.getShippingAddress().format('html')":"CornerDrop Location Address"}
8
+ @-->
9
+ <!--@styles
10
+ @-->
11
+
12
+ {{template config_path="design/email/header"}}
13
+ {{inlinecss file="email-inline.css"}}
14
+
15
+ <table cellpadding="0" cellspacing="0" border="0">
16
+ <tr>
17
+ <td>
18
+ <table cellpadding="0" cellspacing="0" border="0">
19
+ <tr>
20
+ <td class="email-heading">
21
+ <h1>Thank you for using CornerDrop for your order.</h1>
22
+ <p>Here are some instructions on how to collect your package once it has been delivered.</p>
23
+ </td>
24
+ <td class="store-info">
25
+ <h4>Order Questions?</h4>
26
+ <p>
27
+ {{depend store_phone}}
28
+ <b>Call Us:</b>
29
+ <a href="tel:{{var phone}}">{{var store_phone}}</a><br>
30
+ {{/depend}}
31
+ {{depend store_hours}}
32
+ <span class="no-link">{{var store_hours}}</span><br>
33
+ {{/depend}}
34
+ {{depend store_email}}
35
+ <b>Email:</b> <a href="mailto:{{var store_email}}">{{var store_email}}</a>
36
+ {{/depend}}
37
+ </p>
38
+ </td>
39
+ </tr>
40
+ </table>
41
+ </td>
42
+ </tr>
43
+ <tr>
44
+ <td class="order-details">
45
+ <h3>Your order #{{var order.increment_id}}</h3>
46
+ <p>To collect your package just show the package reference number and secret pin at the location indicated below. You can collect your package up to 10 days after it has been delivered.</p>
47
+ </td>
48
+ </tr>
49
+ <tr class="order-information">
50
+ <td>
51
+ <table cellspacing="0" cellpadding="0" border="0">
52
+ <tr>
53
+ <td class="method-info">
54
+ <h6>CornerDrop Package Reference:</h6>
55
+ <p>{{var cornerdrop_ref}}</p>
56
+ </td>
57
+ <td class="method-info">
58
+ <h6>Secret PIN:</h6>
59
+ <p>{{var cornerdrop_pin}}</p>
60
+ </td>
61
+ </tr>
62
+ <tr>
63
+ <td class="address-details">
64
+ <h6>CornerDrop Location address:</h6>
65
+ <p>{{var order.getShippingAddress().format('html')}}</p>
66
+ </td>
67
+ </tr>
68
+ </table>
69
+ </td>
70
+ </tr>
71
+ </table>
72
+
73
+ {{template config_path="design/email/footer"}}
js/cornerdrop/collect/adminhtml.js ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function () {
5
+ 'use strict';
6
+
7
+ window.CornerDrop.Collect.Adminhtml = Class.create({
8
+
9
+ initialize: function ( options ) {
10
+ var self = this;
11
+
12
+ self.options = Object.extend({
13
+ activateLabel: "Click & Collect from a CornerDrop location",
14
+ editLabel: "Edit",
15
+ dialogTitle: "Select CornerDrop location",
16
+ controlButtonSelector: ".cdc-control-button",
17
+ shippingAddressSelector: "#order-shipping_address_choice",
18
+ sameAsBillingCheckboxSelector: '#order-shipping_same_as_billing',
19
+ uiSearchEndpoint: '',
20
+ clearCornerDropSelectionSelector: ".js-cdc-clear-cornerdrop",
21
+ clearCornerDropShippingAddressFields: 'input[type=text][name^="order[shipping_address]"',
22
+ searchWindowTemplate: 'No template defined'
23
+ }, options || {});
24
+
25
+ self.elements = {};
26
+ self.observers = [];
27
+
28
+ self.attachObservers();
29
+ },
30
+
31
+ attachObservers: function () {
32
+ var self = this;
33
+
34
+ var control = self._get(self.options.controlButtonSelector);
35
+ if (control) {
36
+ self._attachObserver(control, "click", self.open.bind(self));
37
+ }
38
+
39
+ var sameAsBillingCheckbox = self._get(self.options.sameAsBillingCheckboxSelector);
40
+ if (sameAsBillingCheckbox) {
41
+ self._attachObserver(sameAsBillingCheckbox, "click", self.toggleDisabledState.bind(self));
42
+ }
43
+
44
+ var clearCornerDrop = self._get(self.options.clearCornerDropSelectionSelector);
45
+ if (clearCornerDrop) {
46
+ self._attachObserver(clearCornerDrop, "click", self.clearCornerDropSelection.bind(self));
47
+ }
48
+ },
49
+
50
+ open: function (event) {
51
+ var self = this;
52
+
53
+ if (typeof event !== "undefined" && event.preventDefault) {
54
+ event.preventDefault();
55
+ }
56
+
57
+ var control = self._get(self.options.controlButtonSelector);
58
+
59
+ // Don't open the window if the button is disabled in some way.
60
+ if (control.hasClassName('disabled') || control.disabled) {
61
+ return;
62
+ }
63
+
64
+ self._displayDialog();
65
+ },
66
+
67
+ close: function (event) {
68
+ var self = this;
69
+
70
+ if (typeof event !== "undefined" && event.preventDefault) {
71
+ event.preventDefault();
72
+ }
73
+
74
+ if (self.dialog) {
75
+ self.dialog.close();
76
+ }
77
+
78
+ // Trigger the region updater to refresh
79
+ $('order-shipping_address_country_id').simulate('change');
80
+
81
+ self.reloadShippingAddress();
82
+ },
83
+
84
+ /**
85
+ * Submit the shipping address, and reload the areas of the page that we need to.
86
+ */
87
+ reloadShippingAddress: function () {
88
+ // Reload shipping address
89
+ var data = window.order.serializeData(window.order.shippingAddressContainer).toObject();
90
+
91
+ window.order.loadArea(['shipping_method', 'totals', 'billing_method'], true, data);
92
+ },
93
+
94
+ _displayDialog: function () {
95
+ var self = this;
96
+
97
+ self.dialog = Dialog.info('', {
98
+ id: "cdc-dialog",
99
+ className: "magento",
100
+ windowClassName: "popup-window",
101
+ title: self.options.dialogTitle,
102
+ width: 950,
103
+ height: 450,
104
+ top: 50,
105
+ zIndex: 300,
106
+ recenterAuto: true,
107
+ draggable: true,
108
+ resizable: false,
109
+ closable: true,
110
+ showEffect: Element.show,
111
+ hideEffect: Element.hide,
112
+ onClose: self.close.bind(self),
113
+ onShow: function () {
114
+ new window.CornerDrop.Collect.Adminhtml_UI({
115
+ searchClass: new window.CornerDrop.Collect.Adminhtml_Search({
116
+ form: '#order-shipping_address',
117
+ endpoint: self.options.uiSearchEndpoint,
118
+ storeIdField: "order[shipping_address][cornerdrop_store_id]"
119
+ }),
120
+ geolocationAPIClass: new window.CornerDrop.Collect.GeolocationAPI(),
121
+ gmapsClass: new window.CornerDrop.Collect.Gmaps(),
122
+ searchTemplate: self.options.searchWindowTemplate,
123
+ initialState: true,
124
+ shouldCheckTermsAndConditions: false,
125
+ elements: {
126
+ injectLocation: '#cdc-dialog_content .magento_message',
127
+ cornerdropContainer: '.cdc-panel',
128
+ searchForm: '#cdc-search-form',
129
+ searchField: '#cdc-search-form input',
130
+ geolocationIcon: '.js-cdc-geolocation',
131
+ searchList: '.js-cdc-search-results',
132
+ storeContainer: '.js-cdc-store',
133
+ selectedStore: '.js-cdc-store-details',
134
+ error: '.js-cdc-error',
135
+ shippingForm: '#co-shipping-form .form-list',
136
+ searchButton: '.js-cdc-search-button',
137
+ resetButton: '.js-cdc-reset-button',
138
+ resultsPager: '.js-cdc-results-pager',
139
+ undoElement: '.js-cdc-undo',
140
+ shippingFormSubmit: '#shipping-buttons-container button'
141
+ }
142
+ });
143
+ }
144
+ });
145
+ },
146
+
147
+ /**
148
+ * Observer: Called when the "Same as billing address" checkbox is changed.
149
+ */
150
+ toggleDisabledState: function () {
151
+ var self = this;
152
+
153
+ var sameAsBillingCheckbox = self._get(self.options.sameAsBillingCheckboxSelector);
154
+ var control = self._get(self.options.controlButtonSelector);
155
+
156
+ var disabledClassName = 'disabled';
157
+
158
+ if (sameAsBillingCheckbox && control) {
159
+ var sameAsBilling = sameAsBillingCheckbox.checked;
160
+
161
+ if (sameAsBilling) {
162
+ control.addClassName(disabledClassName);
163
+ } else {
164
+ control.removeClassName(disabledClassName);
165
+ }
166
+ }
167
+ },
168
+
169
+ /**
170
+ * Observer: Called when the "reset form" link is clicked. This resets the shipping form, ensuring that we don't
171
+ * communicate this order as a cornerdrop order to the backend processes.
172
+ */
173
+ clearCornerDropSelection: function (event) {
174
+ if (typeof event !== "undefined" && event.preventDefault) {
175
+ event.preventDefault();
176
+ }
177
+
178
+ var confirmation = confirm("Are you sure you want to reset the shipping address?");
179
+
180
+ if (confirmation) {
181
+ $$(this.options.clearCornerDropShippingAddressFields).each(function (el) {
182
+ el.value = '';
183
+ });
184
+
185
+ this.reloadShippingAddress();
186
+ }
187
+ },
188
+
189
+ _get: function(selector) {
190
+ var self = this;
191
+
192
+ if (typeof self.elements[selector] == 'undefined') {
193
+ self.elements[selector] = $$(selector).first();
194
+ }
195
+
196
+ return self.elements[selector];
197
+ },
198
+
199
+ _attachObserver: function (element, event, handler) {
200
+ var self = this;
201
+
202
+ self.observers.push({
203
+ element: element,
204
+ event: event,
205
+ handler: handler
206
+ });
207
+
208
+ element.observe(event, handler);
209
+ },
210
+
211
+ _destroyObservers: function () {
212
+ var self = this;
213
+
214
+ self.observers.each(function (observer) {
215
+ observer.element.stopObserving(observer.event, observer.handler);
216
+ });
217
+
218
+ self.observers = [];
219
+ }
220
+
221
+ });
222
+ })();
js/cornerdrop/collect/adminhtml_search.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function() {
5
+ 'use strict';
6
+
7
+ /* global Class, $$, $H, google */
8
+
9
+ window.CornerDrop.Collect.Adminhtml_Search = Class.create(window.CornerDrop.Collect.Search, {
10
+ _injectMarkup: function ($super) {
11
+ /* noop, markup is already on the page for admin */
12
+ },
13
+ });
14
+
15
+ })();
js/cornerdrop/collect/adminhtml_ui.js ADDED
@@ -0,0 +1,15 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function() {
5
+ 'use strict';
6
+
7
+ /* global Class, $$, $H, google */
8
+
9
+ window.CornerDrop.Collect.Adminhtml_UI = Class.create(window.CornerDrop.Collect.UI, {
10
+ disableContinueButton: function($super, state) {
11
+ /* noop */
12
+ }
13
+ });
14
+
15
+ })();
js/cornerdrop/collect/event.simulate.js ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Event.simulate(@element, eventName[, options]) -> Element
3
+ *
4
+ * - @element: element to fire event on
5
+ * - eventName: name of event to fire (only MouseEvents and HTMLEvents interfaces are supported)
6
+ * - options: optional object to fine-tune event properties - pointerX, pointerY, ctrlKey, etc.
7
+ *
8
+ * $('foo').simulate('click'); // => fires "click" event on an element with id=foo
9
+ *
10
+ **/
11
+ (function(){
12
+
13
+ var eventMatchers = {
14
+ 'HTMLEvents': /^(?:load|unload|abort|error|select|change|submit|reset|focus|blur|resize|scroll)$/,
15
+ 'MouseEvents': /^(?:click|dblclick|mouse(?:down|up|over|move|out))$/
16
+ }
17
+ var defaultOptions = {
18
+ pointerX: 0,
19
+ pointerY: 0,
20
+ button: 0,
21
+ ctrlKey: false,
22
+ altKey: false,
23
+ shiftKey: false,
24
+ metaKey: false,
25
+ bubbles: true,
26
+ cancelable: true
27
+ }
28
+
29
+ Event.simulate = function(element, eventName) {
30
+ var options = Object.extend(Object.clone(defaultOptions), arguments[2] || { });
31
+ var oEvent, eventType = null;
32
+
33
+ element = $(element);
34
+
35
+ for (var name in eventMatchers) {
36
+ if (eventMatchers[name].test(eventName)) { eventType = name; break; }
37
+ }
38
+
39
+ if (!eventType)
40
+ throw new SyntaxError('Only HTMLEvents and MouseEvents interfaces are supported');
41
+
42
+ if (document.createEvent) {
43
+ oEvent = document.createEvent(eventType);
44
+ if (eventType == 'HTMLEvents') {
45
+ oEvent.initEvent(eventName, options.bubbles, options.cancelable);
46
+ }
47
+ else {
48
+ oEvent.initMouseEvent(eventName, options.bubbles, options.cancelable, document.defaultView,
49
+ options.button, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
50
+ options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, options.button, element);
51
+ }
52
+ element.dispatchEvent(oEvent);
53
+ }
54
+ else {
55
+ options.clientX = options.pointerX;
56
+ options.clientY = options.pointerY;
57
+ oEvent = Object.extend(document.createEventObject(), options);
58
+ element.fireEvent('on' + eventName, oEvent);
59
+ }
60
+ return element;
61
+ }
62
+
63
+ Element.addMethods({ simulate: Event.simulate });
64
+ })();
js/cornerdrop/collect/geolocationAPI.js ADDED
@@ -0,0 +1,89 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function() {
5
+ 'use strict';
6
+
7
+ /* global Class */
8
+
9
+ window.CornerDrop.Collect.GeolocationAPI = Class.create({
10
+ initialize: function( options ) {
11
+ var self = this;
12
+
13
+ self.options = Object.extend({
14
+ enableHighAccuracy: false,
15
+ timeout: 5000,
16
+ maximumAge: 0,
17
+ watcher: false,
18
+ afterRequestCallback: function() {
19
+
20
+ }
21
+ }, options || {});
22
+
23
+ self.geoOptions = {
24
+ enableHighAccuracy: self.options.enableHighAccuracy,
25
+ timeout: self.options.timeout,
26
+ maximumAge: self.options.maximumAge
27
+ }
28
+
29
+ self.position = {
30
+ latitude: null,
31
+ longitude: null,
32
+ error: ''
33
+ };
34
+
35
+ if (self.options.watcher) {
36
+ this.watcherID = navigator.geolocation.watchPosition(self.onSuccess.bind(this), self.onError.bind(this), self.geoOptions);
37
+ }
38
+ },
39
+
40
+ getLocation: function(callback, errorCallback) {
41
+ var self = this;
42
+
43
+ if (navigator.geolocation) {
44
+ navigator.geolocation.getCurrentPosition(self.onSuccess.bind(this, callback), self.onError.bind(this, errorCallback), self.geoOptions);
45
+ self.options.afterRequestCallback();
46
+ } else {
47
+ self.options.afterRequestCallback();
48
+ return false;
49
+ }
50
+ },
51
+
52
+ onSuccess: function(callback, location) {
53
+ var self = this;
54
+
55
+ self.position.latitude = location.coords.latitude;
56
+ self.position.longitude = location.coords.longitude;
57
+
58
+ if (callback) {
59
+ callback(location);
60
+ }
61
+
62
+ return;
63
+ },
64
+
65
+ onError: function(callback, error) {
66
+ var self = this;
67
+
68
+ switch(error.code) {
69
+ case error.PERMISSION_DENIED:
70
+ self.position.error = "User denied the request for Geolocation.";
71
+ break;
72
+ case error.POSITION_UNAVAILABLE:
73
+ self.position.error = "Location information is unavailable.";
74
+ break;
75
+ case error.TIMEOUT:
76
+ self.position.error = "The request to get user location timed out.";
77
+ break;
78
+ case error.UNKNOWN_ERROR:
79
+ self.position.error = "An unknown error occurred.";
80
+ break;
81
+ }
82
+
83
+ if (callback) {
84
+ callback(self.position.error);
85
+ }
86
+ }
87
+
88
+ });
89
+ })();
js/cornerdrop/collect/gmaps.js ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function() {
5
+ 'use strict';
6
+
7
+ /* global Class */
8
+
9
+ window.CornerDrop.Collect.Gmaps = Class.create({
10
+ initialize: function( options ) {
11
+ var self = this;
12
+
13
+ self.options = Object.extend({
14
+ mapOptions: {
15
+ center: {
16
+ lat: -34.397,
17
+ lng: 150.644
18
+ },
19
+ zoom: 8
20
+ },
21
+ mapSelector: '#cdc-map-canvas',
22
+ mapClass: typeof google !== "undefined" && typeof google.maps !== "undefined" ? google.maps : null,
23
+ baseUrl: null,
24
+ markerImage: null
25
+ }, options || {});
26
+
27
+ self.markers = [];
28
+ self.bounds = [];
29
+
30
+ self._createLocationObject();
31
+ },
32
+
33
+ createMap: function() {
34
+ var self = this;
35
+
36
+ if (self.options.mapClass) {
37
+ self.mapElement = $$(self.options.mapSelector).first();
38
+ self.mapObject = new self.options.mapClass.Map(self.mapElement, self.locationObject);
39
+ self.infoWindow = new self.options.mapClass.InfoWindow();
40
+ } else {
41
+ throw '[CornerDrop Collect] Google Maps object not found';
42
+ }
43
+ },
44
+
45
+ resizeMap: function() {
46
+ var self = this;
47
+ self.options.mapClass.event.trigger(self.mapElement, 'resize')
48
+ },
49
+
50
+ createMarkers: function( data, markerCallback ) {
51
+ var self = this;
52
+
53
+ if (self.options.mapClass) {
54
+ self._clearMapBounds();
55
+
56
+ if (data.length) {
57
+ data.each(function (item) {
58
+ self._createMarker(item, markerCallback);
59
+ });
60
+ } else {
61
+ self._createMarker(data, markerCallback);
62
+ }
63
+
64
+ self._setMapBounds();
65
+ } else {
66
+ throw '[CornerDrop Collect] Google Maps object not found';
67
+ }
68
+ },
69
+
70
+ deleteMarkers: function() {
71
+ var self = this;
72
+
73
+ self._clearMarkers();
74
+ self.markers = [];
75
+ },
76
+
77
+ triggerMarker: function(marker) {
78
+ var self = this;
79
+
80
+ if (self.options.mapClass) {
81
+ if (marker.getAnimation() != null) {
82
+ marker.setAnimation(null);
83
+ } else {
84
+ marker.setAnimation(self.options.mapClass.Animation.BOUNCE);
85
+ window.setTimeout(function () {
86
+ marker.setAnimation(null);
87
+ }, 1400);
88
+ }
89
+
90
+ var infoWindowContent = '<strong>' + marker.title + ' (' + marker.distance + ' miles)</strong>';
91
+
92
+ if (marker.cdcAddress) {
93
+ infoWindowContent += '<br />' + marker.cdcAddress;
94
+ }
95
+
96
+ if (marker.cdcOpeningHours) {
97
+ infoWindowContent += '<br />' + marker.cdcOpeningHours;
98
+ }
99
+
100
+ self.infoWindow.setContent(infoWindowContent);
101
+ self.infoWindow.open(self.mapObject, marker);
102
+ } else {
103
+ throw '[CornerDrop Collect] Google Maps object not found';
104
+ }
105
+ },
106
+
107
+ _createMarker: function(item, markerCallback) {
108
+ var self = this;
109
+ var bounds = new self.options.mapClass.LatLng(item.location.latitude, item.location.longitude);
110
+ var marker = new self.options.mapClass.Marker({
111
+ position: bounds,
112
+ map: self.mapObject,
113
+ title: item.name,
114
+ id: item.id,
115
+ cdcAddress: item.addressHtml,
116
+ cdcOpeningHours: item.openingHoursHtml,
117
+ distance: item.location.distance.toFixed(1),
118
+ icon: self.options.markerImage
119
+ });
120
+
121
+ self.markers.push(marker);
122
+ self.bounds.push(bounds);
123
+
124
+ self.options.mapClass.event.addListener(marker, 'click', function() {
125
+ markerCallback(item.id);
126
+ });
127
+ },
128
+
129
+ _createLocationObject: function() {
130
+ var self = this;
131
+
132
+ self.locationObject = {
133
+ center: {
134
+ lat: self.options.mapOptions.center.lat,
135
+ lng: self.options.mapOptions.center.lng
136
+ },
137
+ zoom: self.options.mapOptions.zoom
138
+ }
139
+ },
140
+
141
+ _clearMarkers: function() {
142
+ var self = this;
143
+
144
+ for (var i = 0; i < self.markers.length; i++) {
145
+ self.markers[i].setMap(null);
146
+ }
147
+ },
148
+
149
+ _clearMapBounds: function() {
150
+ var self = this;
151
+
152
+ if (self.mapBounds) {
153
+ self.mapBounds = null;
154
+ self.bounds = [];
155
+ }
156
+ },
157
+
158
+ _setMapBounds: function() {
159
+ var self = this;
160
+
161
+ // Ensure all of the markers are shown inside the bounds
162
+ // of the map object
163
+ self.mapBounds = new self.options.mapClass.LatLngBounds(self.bounds[0]);
164
+ self.bounds.each(function(item) {
165
+ self.mapBounds.extend(item);
166
+ });
167
+ self.mapObject.fitBounds(self.mapBounds);
168
+ }
169
+
170
+ });
171
+ })();
js/cornerdrop/collect/search.js ADDED
@@ -0,0 +1,211 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function () {
5
+ 'use strict';
6
+
7
+ /* global Class, Ajax, $$, $H, shipping, shippingRegionUpdater */
8
+
9
+ window.CornerDrop.Collect.Search = Class.create({
10
+
11
+ initialize: function (options) {
12
+ var self = this;
13
+
14
+ self.options = Object.extend({
15
+ endpoint: null,
16
+ form: "#co-shipping-form",
17
+ storeIdField: "shipping[cornerdrop_store_id]",
18
+ prepareFormCallback: function () {},
19
+ regionUpdateCallback: function () {}
20
+ }, options || {});
21
+
22
+ if (!self.options.endpoint) {
23
+ throw "[CornerDrop Collect] Search endpoint missing!";
24
+ }
25
+
26
+ self.results = [];
27
+
28
+ self._injectMarkup();
29
+ self._applyObservers();
30
+ },
31
+
32
+ search: function (query, lat, long, callback) {
33
+ var self = this;
34
+
35
+ self.clear();
36
+
37
+ new Ajax.Request(self.options.endpoint, {
38
+ method: "GET",
39
+ parameters: {
40
+ q: query,
41
+ lat: lat,
42
+ long: long
43
+ },
44
+ evalJSON: true,
45
+ onSuccess: function (response) {
46
+ self.results = response.responseJSON;
47
+ },
48
+ onFailure: function (response) {
49
+ if (response.responseJSON) {
50
+ self.error = response.responseJSON.message;
51
+ } else {
52
+ self.error = true;
53
+ }
54
+ },
55
+ onComplete: function (response) {
56
+ if (callback) {
57
+ callback(self);
58
+ }
59
+ }
60
+ });
61
+ },
62
+
63
+ getResultById: function(id) {
64
+ var self = this;
65
+ var foundResult = null;
66
+
67
+ self.results.each(function (result) {
68
+ if (result.id == id) {
69
+ foundResult = result;
70
+ }
71
+ });
72
+
73
+ return foundResult;
74
+ },
75
+
76
+ select: function (id) {
77
+ var self = this;
78
+
79
+ self.selected = self.getResultById(id);
80
+
81
+ if (self.selected) {
82
+ this._fillForm(self.selected);
83
+ }
84
+
85
+ return !!self.selected;
86
+ },
87
+
88
+ deselect: function () {
89
+ var self = this;
90
+ self.resetStoreId();
91
+ self.selected = null;
92
+ },
93
+
94
+ clear: function () {
95
+ var self = this;
96
+
97
+ self.results = [];
98
+ self.error = null;
99
+ },
100
+
101
+ /**
102
+ * Return the currently selected store id, blank if no store is selected.
103
+ *
104
+ * @returns {*}
105
+ */
106
+ getStoreId: function () {
107
+ var element = $("shipping:cornerdrop_store_id");
108
+ if (element) {
109
+ return element.value;
110
+ }
111
+ },
112
+
113
+ resetStoreId: function() {
114
+ var element = $("shipping:cornerdrop_store_id");
115
+ if (element) {
116
+ element.value = null;
117
+ }
118
+ },
119
+
120
+ fillForm: function() {
121
+ var self = this;
122
+
123
+ if (self.selected) {
124
+ self._fillForm(self.selected);
125
+ }
126
+
127
+ return false;
128
+ },
129
+
130
+ _getForm: function () {
131
+ var self = this;
132
+
133
+ if (!self.form) {
134
+ self.form = $$(self.options.form).first();
135
+
136
+ if (!self.form) {
137
+ throw "[CornerDrop Collect] Shipping Address form not found!";
138
+ }
139
+ }
140
+
141
+ return self.form;
142
+ },
143
+
144
+ _getFormElement: function (form, name, first) {
145
+ first = typeof first !== 'undefined' ? first : true;
146
+
147
+ var elements = form.select('[name *= "[' + name + ']"]');
148
+
149
+ return first ? elements.first() : elements;
150
+ },
151
+
152
+ _injectMarkup: function () {
153
+ var self = this;
154
+
155
+ self._getForm().appendChild(new Element("input", {
156
+ type: "hidden",
157
+ name: self.options.storeIdField,
158
+ value: "",
159
+ id: "shipping:cornerdrop_store_id"
160
+ }));
161
+ },
162
+
163
+ _applyObservers: function () {
164
+ var self = this;
165
+
166
+ Event.observe(document, "cornerdrop_collect:disabled", self.resetStoreId.bind(this));
167
+ Event.observe(document, "cornerdrop_collect:enabled", self.fillForm.bind(self));
168
+ },
169
+
170
+ _fillForm: function (data) {
171
+ var self = this;
172
+
173
+ var element;
174
+ var form = self._getForm();
175
+
176
+ if (self.options.prepareFormCallback) {
177
+ self.options.prepareFormCallback(true);
178
+ }
179
+
180
+ $H(data.address).each(function (item) {
181
+ if (item.key == "street") {
182
+ var idx = 0;
183
+ self._getFormElement(form, "street", false).each(function (field) {
184
+ field.value = item.value[idx++];
185
+ });
186
+ } else {
187
+ element = self._getFormElement(form, item.key);
188
+ if (element) {
189
+ element.value = item.value;
190
+ }
191
+ }
192
+ });
193
+
194
+ if (self.options.regionUpdateCallback) {
195
+ self.options.regionUpdateCallback();
196
+ }
197
+
198
+ ["region_id", "region"].each(function (field) {
199
+ element = self._getFormElement(form, field);
200
+ if (element) {
201
+ element.value = data.address[field];
202
+ }
203
+ });
204
+
205
+ element = self._getFormElement(form, "cornerdrop_store_id");
206
+ if (element) {
207
+ element.value = data.id;
208
+ }
209
+ }
210
+ });
211
+ })();
js/cornerdrop/collect/switch.js ADDED
@@ -0,0 +1,185 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function () {
5
+ 'use strict';
6
+
7
+ /* global Class, $, $$ */
8
+
9
+ window.CornerDrop.Collect.Switch = Class.create({
10
+
11
+ initialize: function ( options ) {
12
+ var self = this;
13
+
14
+ self.options = Object.extend({
15
+ labels: {
16
+ checkbox: "Ship to a CornerDrop location",
17
+ deactivateButton: 'Switch to home delivery',
18
+ activateButton: 'Use CornerDrop'
19
+ },
20
+ value: false,
21
+ elements: {
22
+ toggleButton: '#cornerdrop-collect-toggle-button',
23
+ toggleButtonLocation: '#shipping-buttons-container',
24
+ billingFormList: '#co-billing-form ul.form-list',
25
+ shippingFormList: '#co-shipping-form ul.form-list'
26
+ }
27
+ }, options || {});
28
+
29
+ self.observers = [];
30
+
31
+ self.build();
32
+ },
33
+
34
+ build: function () {
35
+ var self = this;
36
+
37
+ // Create control element in the billing form
38
+
39
+ var control = new Element("li", {
40
+ id: "billing:cornerdrop_control",
41
+ class: "control"
42
+ });
43
+
44
+ control.appendChild(new Element("input", {
45
+ type: "hidden",
46
+ name: "billing[ship_to_cornerdrop]",
47
+ value: self.options.value ? "1" : "0",
48
+ id: "billing:ship_to_cornerdrop"
49
+ }));
50
+
51
+ control.appendChild(new Element("input", {
52
+ type: "radio",
53
+ name: "billing[use_for_shipping]",
54
+ value: "0",
55
+ checked: !!self.options.value,
56
+ title: self.options.labels.checkbox,
57
+ id: "billing:use_for_shipping_cornerdrop",
58
+ 'class': "radio"
59
+ }));
60
+
61
+ control.appendChild(new Element("label", {
62
+ for: "billing:use_for_shipping_cornerdrop"
63
+ }).update(self.options.labels.checkbox));
64
+
65
+ var billingFormList = $$(self.options.elements.billingFormList).first();
66
+ if (!billingFormList) {
67
+ throw "[CornerDrop Collect] Could not find the billing form list!";
68
+ }
69
+ billingFormList.appendChild(control);
70
+
71
+ // Create switch field in the shipping form
72
+
73
+ var cornerdropField = new Element("input", {
74
+ type: "hidden",
75
+ name: "shipping[is_cornerdrop_collect]",
76
+ value: self.options.value ? "1" : "0",
77
+ id: "shipping:is_cornerdrop_collect"
78
+ });
79
+
80
+ var shippingFormList = $$(self.options.elements.shippingFormList).first();
81
+ if (!shippingFormList) {
82
+ throw "[CornerDrop Collect] Could not find the shipping form list!";
83
+ }
84
+ shippingFormList.appendChild(cornerdropField);
85
+
86
+ // Create activate switch in shipping address form
87
+
88
+ var toggleLinkLabel = self.options.value ? self.options.labels.deactivateButton : self.options.labels.activateButton;
89
+ var toggleLink = new Element('a', {
90
+ 'id': self.options.elements.toggleButton.replace(/#/, ''),
91
+ 'href': '',
92
+ 'class': 'cdc-toggle-button'
93
+ }).update(toggleLinkLabel);
94
+
95
+ var insertLocation = $$(self.options.elements.toggleButtonLocation).first();
96
+ if (!insertLocation) {
97
+ throw "[CornerDrop Collect] Could not find the insert location";
98
+ }
99
+
100
+ insertLocation.insert({
101
+ before: toggleLink
102
+ });
103
+
104
+ // Attach observers
105
+
106
+ self._attachObserver($("billing:cornerdrop_control"), "click", self._enableCornerdrop.bind(self));
107
+ self._attachObserver($("billing:use_for_shipping_yes"), "click", self._disableCornerdrop.bind(self));
108
+ self._attachObserver($("billing:use_for_shipping_no"), "click", self._disableCornerdrop.bind(self));
109
+ self._attachObserver($$(self.options.elements.toggleButton).first(), "click", self._toggleCornerDrop.bind(self));
110
+ },
111
+
112
+ destroy: function () {
113
+ var self = this;
114
+
115
+ self._destroyObservers();
116
+
117
+ $("billing:cornerdrop_control").remove();
118
+ },
119
+
120
+ _toggleCornerDrop: function() {
121
+ event.preventDefault();
122
+ var self = this;
123
+
124
+ if (self.options.value) {
125
+ self._disableCornerdrop();
126
+ } else {
127
+ self._enableCornerdrop();
128
+ }
129
+ },
130
+
131
+ _enableCornerdrop: function () {
132
+ var self = this;
133
+
134
+ self.options.value = true;
135
+ $("shipping:same_as_billing").checked = false;
136
+ $("billing:ship_to_cornerdrop").value = "1";
137
+ $("shipping:is_cornerdrop_collect").value = "1";
138
+ $("billing:use_for_shipping_cornerdrop").checked = true;
139
+ $$(self.options.elements.toggleButton).first().update(self.options.labels.deactivateButton);
140
+ Event.fire(document, 'cornerdrop_collect:enabled');
141
+ },
142
+
143
+ _disableCornerdrop: function () {
144
+ var self = this;
145
+
146
+ var no_checked = $("billing:use_for_shipping_no").checked;
147
+ var yes_checked = $("billing:use_for_shipping_yes").checked;
148
+ var something_checked = no_checked || yes_checked;
149
+
150
+ self.options.value = false;
151
+ $("billing:ship_to_cornerdrop").value = "0";
152
+ $("shipping:is_cornerdrop_collect").value = "0";
153
+
154
+ if (!something_checked) {
155
+ $("billing:use_for_shipping_no").checked = true;
156
+ }
157
+
158
+ $$(self.options.elements.toggleButton).first().update(self.options.labels.activateButton);
159
+ Event.fire(document, 'cornerdrop_collect:disabled');
160
+ },
161
+
162
+ _attachObserver: function (element, event, handler) {
163
+ var self = this;
164
+
165
+ self.observers.push({
166
+ element: element,
167
+ event: event,
168
+ handler: handler
169
+ });
170
+
171
+ element.observe(event, handler);
172
+ },
173
+
174
+ _destroyObservers: function () {
175
+ var self = this;
176
+
177
+ self.observers.each(function (observer) {
178
+ observer.element.stopObserving(observer.event, observer.handler);
179
+ });
180
+
181
+ self.observers = [];
182
+ }
183
+
184
+ });
185
+ })();
js/cornerdrop/collect/ui.js ADDED
@@ -0,0 +1,558 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ if (!window.CornerDrop) window.CornerDrop = {};
2
+ if (!window.CornerDrop.Collect) window.CornerDrop.Collect = {};
3
+
4
+ (function() {
5
+ 'use strict';
6
+
7
+ /* global Class, $$, $H, google */
8
+
9
+ window.CornerDrop.Collect.UI = Class.create({
10
+ initialize: function( options ) {
11
+ var self = this;
12
+
13
+ self.options = Object.extend({
14
+ geolocationAPIClass: null,
15
+ searchClass: null,
16
+ gmapsClass: null,
17
+ geocoder: typeof google !== "undefined" && typeof google.maps !== "undefined" ? google.maps.Geocoder : null,
18
+ geocoderStatus: typeof google !== "undefined" && typeof google.maps !== "undefined" ? google.maps.GeocoderStatus : null,
19
+ searchTemplate: null,
20
+ shouldCheckTermsAndConditions: true,
21
+ termsAndConditionsLabel: 'By using this service you agree to the <a href="https://cornerdrop.com/legal/consumer-terms-retailer" target="_blank">Terms &amp; Conditions.</a>',
22
+ elements: {
23
+ cornerdropContainer: '.cdc-panel',
24
+ injectLocation: '#checkout-step-shipping',
25
+ searchForm: '#cdc-search-form',
26
+ searchField: '#cdc-search-form input',
27
+ geolocationIcon: '.js-cdc-geolocation',
28
+ searchList: '.js-cdc-search-results',
29
+ storeContainer: '.js-cdc-store',
30
+ selectedStore: '.js-cdc-store-details',
31
+ error: '.js-cdc-error',
32
+ shippingForm: '#co-shipping-form .form-list',
33
+ searchButton: '.js-cdc-search-button',
34
+ resetButton: '.js-cdc-reset-button',
35
+ resultsPager: '.js-cdc-results-pager',
36
+ undoElement: '.js-cdc-undo',
37
+ shippingFormSubmit: '#shipping-buttons-container button',
38
+ termsAndConditionsCheckbox: '#cornerdrop-collect-tc-checkbox',
39
+ termsAndConditionsLocation: '#cornerdrop-collect-toggle-button'
40
+ },
41
+ pager: {
42
+ resultsPerPage: 5
43
+ },
44
+ classes: {
45
+ hidden: 'cdc-hidden',
46
+ error: 'cdc-error',
47
+ loading: 'cdc-loading',
48
+ active: 'cdc-active',
49
+ resultItem: 'cdc-result',
50
+ show: 'cdc-show'
51
+ },
52
+ initialState: false,
53
+ afterRequestCallback: function() {
54
+
55
+ }
56
+ }, options || {});
57
+
58
+ self.els = {};
59
+ self.observers = [];
60
+ self.delegatedObservers = [];
61
+ self.searchValue = null;
62
+ self.isGeolocationQuery = null;
63
+ self.resultsPage = 1;
64
+
65
+ self.injectSearchTemplate();
66
+ self.injectTermsAndConditions();
67
+
68
+ self.createElementReferences(self.options.elements);
69
+ self.applyObservers();
70
+ self.addListeners();
71
+ self.toggleCornerdrop(self.options.initialState);
72
+ self.disableContinueButton(true);
73
+
74
+ if (self.options.gmapsClass) {
75
+ self.options.gmapsClass.createMap();
76
+ self._hideElement(self.options.gmapsClass.mapElement, true);
77
+ }
78
+
79
+ if (self.options.geocoder) {
80
+ self.geocoder = new self.options.geocoder();
81
+ }
82
+ },
83
+
84
+ createElementReferences: function(elements) {
85
+ var hash = $H(elements);
86
+ var self = this;
87
+
88
+ hash.each(function(item) {
89
+ self.els[item.key] = $$(item.value).first();
90
+ });
91
+ },
92
+
93
+ injectSearchTemplate: function() {
94
+ var self = this;
95
+ var injectLocation = $$(self.options.elements.injectLocation).first();
96
+
97
+ injectLocation.insert({
98
+ top: self.options.searchTemplate
99
+ });
100
+ },
101
+
102
+ /**
103
+ * Build terms and conditions elements.
104
+ */
105
+ injectTermsAndConditions: function() {
106
+ var self = this;
107
+
108
+ if (!self.options.shouldCheckTermsAndConditions) {
109
+ return;
110
+ }
111
+
112
+ var termsAndConditionsContainer = new Element('div', {
113
+ 'class': 'cdc-tc-container'
114
+ });
115
+
116
+ var termsAndConditionsCheckbox = new Element('input', {
117
+ 'type': 'checkbox',
118
+ 'checked': 'checked',
119
+ 'id': self.options.elements.termsAndConditionsCheckbox.replace(/#/, '')
120
+ });
121
+
122
+ var termsAndConditionsLabel = new Element('label', {
123
+ 'class': 'cdc-tc-label',
124
+ 'for': self.options.elements.termsAndConditionsCheckbox.replace(/#/, '')
125
+ }).update(self.options.termsAndConditionsLabel);
126
+
127
+ termsAndConditionsContainer.insert({
128
+ bottom: termsAndConditionsCheckbox
129
+ }).insert({
130
+ bottom: termsAndConditionsLabel
131
+ });
132
+
133
+ var termsAndConditionsInsertLocation = $$(self.options.elements.termsAndConditionsLocation).first();
134
+ if (termsAndConditionsInsertLocation) {
135
+ termsAndConditionsInsertLocation.insert({
136
+ before: termsAndConditionsContainer
137
+ });
138
+ }
139
+ },
140
+
141
+ requestLocation: function(callback, errorCallback) {
142
+ var self = this;
143
+
144
+ if ( self.options.geolocationAPIClass ) {
145
+ if ( callback && errorCallback ) {
146
+ self.options.geolocationAPIClass.getLocation(callback, errorCallback);
147
+ } else {
148
+ throw '[CornerDrop Collect] Geolocation callback not provided';
149
+ }
150
+ } else {
151
+ throw '[CornerDrop Collect] GeolocationAPI class not defined';
152
+ }
153
+ },
154
+
155
+ searchGeolocation: function(event) {
156
+ event.preventDefault();
157
+
158
+ var self = this;
159
+
160
+ self._resetFormButtons(event);
161
+ self.els.searchButton.addClassName(self.options.classes.loading);
162
+ self.els.geolocationIcon.addClassName(self.options.classes.active);
163
+ self.requestLocation(self.search.bind(self), self.error.bind(self));
164
+ self.isGeolocationQuery = true;
165
+ },
166
+
167
+ searchQuery: function(event) {
168
+ event.preventDefault();
169
+
170
+ var self = this;
171
+ var location = {
172
+ coords: {
173
+ latitude: null,
174
+ longitude: null
175
+ }
176
+ };
177
+
178
+ self.isGeolocationQuery = false;
179
+ self.els.searchButton.addClassName(self.options.classes.loading);
180
+ self.searchValue = self.els.searchField.value;
181
+ self.els.searchList.addClassName(self.options.classes.hidden);
182
+
183
+ if (self.geocoder) {
184
+ self.geocoder.geocode({ 'address': self.searchValue }, function geocoderResults(results, status) {
185
+ if (status == self.options.geocoderStatus.OK) {
186
+ location.coords.latitude = results[0].geometry.location.lat();
187
+ location.coords.longitude = results[0].geometry.location.lng();
188
+ self.search.call(self, location);
189
+ } else {
190
+ self.error('Location not found, please refine your search');
191
+ throw '[CornerDrop Collect] Geocoding failed:' + status;
192
+ }
193
+ });
194
+ } else {
195
+ self.requestLocation(self.search.bind(self), self.error.bind(self));
196
+ }
197
+ },
198
+
199
+ search: function(location) {
200
+ var self = this;
201
+ var latitude = location.coords.latitude;
202
+ var longitude = location.coords.longitude;
203
+
204
+ self.resultsPage = 1;
205
+
206
+ if (self.options.searchClass) {
207
+ if (latitude && longitude) {
208
+ self.options.searchClass.search(self.searchValue, latitude, longitude, self.displayResultsList.bind(self));
209
+ } else {
210
+ self.error('CornerDrop is currently unavailable');
211
+ throw '[CornerDrop Collect] Location services are unavailable';
212
+ }
213
+ } else {
214
+ throw '[CornerDrop Collect] Search class not found';
215
+ }
216
+ },
217
+
218
+ _createResult: function(item) {
219
+ var result = new Element('div');
220
+ var distance = item.location.distance.toFixed(1);
221
+
222
+ var itemTitle = new Element('span', {
223
+ 'class': 'cdc-result-item-title'
224
+ }).update(item.name + ' (' + distance + ' miles)');
225
+ result.appendChild(itemTitle);
226
+
227
+ var address = new Element('span', {
228
+ 'class': 'cdc-result-item-body'
229
+ }).update(item.addressHtml);
230
+ result.appendChild(address);
231
+
232
+ var openingHours = new Element('span', {
233
+ 'class': 'cdc-result-item-body'
234
+ }).update(item.openingHoursHtml);
235
+ result.appendChild(openingHours);
236
+
237
+ return result;
238
+ },
239
+
240
+ displayResultsList: function(classCallback) {
241
+ var self = this;
242
+ var resultsList = new Element('ul');
243
+ var searchList = self.els.searchList;
244
+ var error;
245
+
246
+ if (!self.options.searchClass.error) {
247
+
248
+ if (classCallback.results.length) {
249
+ searchList.innerHTML = '';
250
+
251
+ classCallback.results.each(function resultItem(item) {
252
+ var element = new Element('li', {
253
+ "data-store-id": item.id,
254
+ 'class': self.options.classes.resultItem
255
+ });
256
+
257
+ var result = self._createResult(item);
258
+
259
+ if (result) {
260
+ element.appendChild(result);
261
+
262
+ resultsList.insert({
263
+ bottom: element
264
+ });
265
+ }
266
+ });
267
+
268
+ searchList.insert(resultsList);
269
+
270
+ if (self.options.gmapsClass.options.mapClass) {
271
+ self.displayResultsOnMap(classCallback.results, self.setStore.bind(self));
272
+ } else {
273
+ self.setStore.bind(self);
274
+ }
275
+
276
+ self.els.searchList.removeClassName(self.options.classes.hidden);
277
+
278
+ if (error = self.els.error) {
279
+ error.addClassName(self.options.classes.hidden);
280
+ }
281
+
282
+ self._showResultsPage();
283
+ } else {
284
+ self.displayResultsOnMap(self.options.searchClass.selected, self.setStore.bind(self));
285
+ self.error('No results were found');
286
+ }
287
+ } else {
288
+ self.error('CornerDrop is currently unavailable');
289
+ }
290
+
291
+ self.els.searchButton.removeClassName(self.options.classes.loading);
292
+
293
+ if (self.isGeolocationQuery) {
294
+ self.els.geolocationIcon.addClassName('cdc-active');
295
+ self.els.searchField.value = '';
296
+ } else {
297
+ self.els.searchButton.addClassName(self.options.classes.hidden);
298
+ self.els.resetButton.removeClassName(self.options.classes.hidden);
299
+ self.els.geolocationIcon.removeClassName('cdc-active');
300
+ }
301
+ },
302
+
303
+ displayResultsOnMap: function(data, callback) {
304
+ var self = this;
305
+
306
+ // Setup the markers and ensure the map is displayed
307
+ self._hideElement(self.options.gmapsClass.mapElement, false);
308
+ self.options.gmapsClass.resizeMap();
309
+
310
+ self.options.gmapsClass.deleteMarkers();
311
+ if (data) {
312
+ self.options.gmapsClass.createMarkers(data, callback);
313
+ }
314
+ },
315
+
316
+ error: function(message) {
317
+ var self = this;
318
+ var errorElement;
319
+
320
+ if (!self.els.error) {
321
+ errorElement = new Element('div', {
322
+ class: self.options.classes.error
323
+ });
324
+
325
+ self.els.searchList.insert({
326
+ before: errorElement
327
+ });
328
+
329
+ self.els.error = errorElement;
330
+ }
331
+
332
+ self.els.error.innerHTML = message;
333
+ self.els.error.removeClassName(self.options.classes.hidden);
334
+ self.els.searchButton.removeClassName(self.options.classes.loading);
335
+ self.isGeolocationQuery = false;
336
+ },
337
+
338
+ selectResult: function(event, element) {
339
+ var self = this;
340
+
341
+ self.setStore(element.readAttribute('data-store-id'));
342
+ },
343
+
344
+ setStore: function(storeId) {
345
+ var self = this;
346
+ var item = self.options.searchClass.getResultById(storeId);
347
+
348
+ if (item) {
349
+ self.els.selectedStore.update(self._createResult(item));
350
+ self.options.searchClass.select(storeId);
351
+ self._hideElement(self.els.undoElement, false);
352
+
353
+ self._hideElement(self.els.storeContainer, false);
354
+ self._hideElement(self.els.searchList, true);
355
+
356
+ // For the marker with a matching ID to the storeId
357
+ // trigger animation and display of the markers info
358
+ self.options.gmapsClass.markers.each(function (element) {
359
+ if (element.id == storeId) {
360
+ self.options.gmapsClass.triggerMarker(element);
361
+ }
362
+ });
363
+
364
+ self.checkCanDisableContinueButton();
365
+ }
366
+ },
367
+
368
+ undoSetStore: function(event) {
369
+ event.preventDefault();
370
+ var self = this;
371
+
372
+ self.els.selectedStore.innerHTML = "";
373
+ self._hideElement(self.els.storeContainer, true);
374
+ self._hideElement(self.els.searchList, false);
375
+
376
+ self.options.searchClass.deselect();
377
+ self.checkCanDisableContinueButton();
378
+ },
379
+
380
+ /**
381
+ * Establish whether or not the continue button should be disabled by checking the store selection and the terms
382
+ * and conditions checkbox.
383
+ *
384
+ * If it should be enabled, enabled it. If it should be disabled, disable it.
385
+ */
386
+ checkCanDisableContinueButton: function () {
387
+ var self = this;
388
+
389
+ var isTermsAndConditionsChecked = !self.options.shouldCheckTermsAndConditions || self.els.termsAndConditionsCheckbox.checked;
390
+ var isStoredSelected = !!self.options.searchClass.selected;
391
+
392
+ if (isTermsAndConditionsChecked && isStoredSelected) {
393
+ self.disableContinueButton(false);
394
+ } else {
395
+ self.disableContinueButton(true);
396
+ }
397
+ },
398
+
399
+ disableContinueButton: function(state) {
400
+ var self = this;
401
+
402
+ if (state) {
403
+ self.els.shippingFormSubmit.disabled = 'disabled';
404
+ } else {
405
+ self.els.shippingFormSubmit.disabled = '';
406
+ }
407
+ },
408
+
409
+ checkTermsAndConditions: function (event) {
410
+ var self = this;
411
+ self.checkCanDisableContinueButton();
412
+ },
413
+
414
+ toggleCornerdrop: function(state, event) {
415
+ if (event) {
416
+ event.preventDefault();
417
+ }
418
+
419
+ var self = this;
420
+
421
+ self._hideElement(self.els.shippingForm, state);
422
+ self._hideElement(self.els.cornerdropContainer, !state);
423
+ self._hideElement($$('.cdc-tc-container').first(), !state);
424
+ if (state) {
425
+ self.checkCanDisableContinueButton();
426
+ } else {
427
+ self.disableContinueButton(false);
428
+ }
429
+ },
430
+
431
+ applyObservers: function() {
432
+ var self = this;
433
+
434
+ self._attachObserver(self.els.geolocationIcon, 'click', self.searchGeolocation.bind(self));
435
+ self._attachObserver(self.els.searchForm, 'submit', self.searchQuery.bind(self));
436
+ self._attachObserver(self.els.searchField, 'keyup', self._searchFieldActions.bind(self));
437
+ self._attachObserver(self.els.resetButton, 'click', self._resetFormButtons.bind(self));
438
+ self._attachObserver(self.els.resultsPager, 'click', self._showResultsPage.bind(self));
439
+ self._attachObserver(self.els.undoElement, 'click', self.undoSetStore.bind(self));
440
+ self._attachDelegatedObserver(self.els.searchList, 'click', 'li.cdc-result', self.selectResult.bind(self));
441
+
442
+ if (self.options.shouldCheckTermsAndConditions) {
443
+ self._attachObserver(self.els.termsAndConditionsCheckbox, 'click', self.checkTermsAndConditions.bind(self));
444
+ }
445
+ },
446
+
447
+ addListeners: function() {
448
+ var self = this;
449
+
450
+ Event.observe(document, 'cornerdrop_collect:enabled', self.toggleCornerdrop.bind(self, true));
451
+ Event.observe(document, 'cornerdrop_collect:disabled', self.toggleCornerdrop.bind(self, false));
452
+ },
453
+
454
+ destroyObservers: function() {
455
+ var self = this;
456
+
457
+ // Destroy event observers
458
+ self.observers.each(function (observer) {
459
+ Event.stopObserving(observer.element, observer.event, observer.handler);
460
+ });
461
+
462
+ self.observers = [];
463
+
464
+ // Destroy delegated observers
465
+ self.delegatedObservers.each(function (observer) {
466
+ observer.stop();
467
+ });
468
+
469
+ self.delegatedObservers = [];
470
+ },
471
+
472
+ _showResultsPage: function(event) {
473
+ if ( event ) {
474
+ event.preventDefault();
475
+ }
476
+
477
+ var self = this;
478
+ var end = self.resultsPage * self.options.pager.resultsPerPage;
479
+ var start = end - self.options.pager.resultsPerPage;
480
+ var elements = self.els.searchList.select('.' + self.options.classes.resultItem + ':nth-child(n+' + start + '):nth-child(-n+' + end + ')');
481
+
482
+ // Show the next page of items
483
+ elements.each(function(item) {
484
+ item.addClassName(self.options.classes.show);
485
+ });
486
+
487
+ if (start < self.options.searchClass.results.length) {
488
+ self.resultsPage++;
489
+ self.els.resultsPager.removeClassName(self.options.classes.hidden);
490
+ } else {
491
+ self.els.resultsPager.addClassName(self.options.classes.hidden);
492
+ }
493
+
494
+ // Hide pager if max has been met on last pagination
495
+ if (start + self.options.pager.resultsPerPage >= self.options.searchClass.results.length) {
496
+ self.els.resultsPager.addClassName(self.options.classes.hidden);
497
+ }
498
+ },
499
+
500
+ _searchFieldActions: function(event) {
501
+ var self = this;
502
+ var searchFieldLength = self.els.searchField.value.length;
503
+
504
+ if (searchFieldLength > 0) {
505
+ self.els.searchButton.addClassName(self.options.classes.active);
506
+ } else {
507
+ self.els.searchButton.removeClassName(self.options.classes.active);
508
+ }
509
+
510
+ self._resetFormButtons(event);
511
+ },
512
+
513
+ _resetFormButtons: function(event) {
514
+ var self = this;
515
+
516
+ if (event.keyCode !== 13) {
517
+ self.els.resetButton.addClassName(self.options.classes.hidden);
518
+ self.els.searchButton.removeClassName(self.options.classes.hidden);
519
+ }
520
+
521
+ if (event.keyCode === 0) {
522
+ self.els.searchButton.removeClassName(self.options.classes.active);
523
+ }
524
+ },
525
+
526
+ _attachObserver: function(element, event, handler) {
527
+ var self = this;
528
+
529
+ self.observers.push({
530
+ element: element,
531
+ event: event,
532
+ handler: handler
533
+ });
534
+
535
+ Event.observe(element, event, handler);
536
+ },
537
+
538
+ _attachDelegatedObserver: function(element, event, delegationElement, handler) {
539
+ var self = this;
540
+ var observer = Event.on(element, event, delegationElement, handler);
541
+
542
+ self.delegatedObservers.push(observer);
543
+ },
544
+
545
+ _hideElement: function(element, state) {
546
+ var self = this;
547
+
548
+ if (element) {
549
+ if (state) {
550
+ element.addClassName(self.options.classes.hidden);
551
+ } else {
552
+ element.removeClassName(self.options.classes.hidden);
553
+ }
554
+ }
555
+ }
556
+ });
557
+
558
+ })();
package.xml ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?xml version="1.0"?>
2
+ <package>
3
+ <name>CornerDrop_Collect</name>
4
+ <version>1.2.0</version>
5
+ <stability>stable</stability>
6
+ <license uri="https://cornerdrop.com/">CornerDrop</license>
7
+ <channel>community</channel>
8
+ <extends/>
9
+ <summary>Offer a click and collect solution to all your customers today.</summary>
10
+ <description>CornerDrop is the fastest growing UK wide parcel collection network, targeted at over 5,000 locations by 2016. You can offer CornerDrop without changing any fulfillment agreements or your packing processes.&#xD;
11
+ &#xD;
12
+ To support our launch and for a limited time, we are currently offering retailers who integrate &amp;amp; offer the CornerDrop Magento extension, 10 free credits!&#xD;
13
+ &#xD;
14
+ Assured first time delivery rates&#xD;
15
+ Happier customers, a better shopping experience and more repeat sales&#xD;
16
+ Less time managing customer complaints and compensation claims&#xD;
17
+ Your customers have access to the fastest growing parcel collection network in the UK (and not just train stations!)&#xD;
18
+ Easy to install and configure&#xD;
19
+ Uses Google Maps to allow customers to search for their nearest CornerDrop location and opening times&#xD;
20
+ Unique delivery codes and secure PIN, ensures that only the customer can collect their parcel&#xD;
21
+ CornerDrop assures each parcel up to the value of &#xA3;200&#xD;
22
+ Provides real convenience to your busy customers!&#xD;
23
+ CornerDrop sits separately to any shipping tools and integrates seamlessly into your store checkout process. Our extension can be offered alongside any other click and collection solution that you may have, to increase the number of locations that you can offer your customers.&#xD;
24
+ Free to download and simple to install.&#xD;
25
+ You are only charged once a customer has used the service (minimum purchase of 10 credits) &#x2013; a true PAYG service.&#xD;
26
+ &#xD;
27
+ You can find out more information and register the API for your account at https://cornerdrop.com/magento. If you have any questions, please contact us at https://cornerdrop.com/contact-us&#xD;
28
+ </description>
29
+ <notes>Initial release</notes>
30
+ <authors><author><name>CornerDrop</name><user>CornerDrop</user><email>alasota@cornerdrop.com</email></author></authors>
31
+ <date>2015-08-06</date>
32
+ <time>15:03:51</time>
33
+ <contents><target name="mageetc"><dir name="modules"><file name="CornerDrop_Collect.xml" hash="d0b626320e928e90d8efe38cac4bc76c"/></dir></target><target name="magecommunity"><dir name="CornerDrop"><dir name="Collect"><dir name="Block"><dir name="Adminhtml"><dir name="Form"><dir name="Field"><dir name="Account"><file name="Balance.php" hash="f98406499d46ba9938b4020a9ddff45b"/></dir></dir></dir></dir><dir name="Checkout"><file name="Success.php" hash="8ef06c1238ba4af9fd593774ba8d4254"/><file name="Switch.php" hash="9a700e7df647f01811c758cfdbcb089e"/></dir><dir name="Sales"><dir name="Order"><file name="Totals.php" hash="0d9845999fe2eacca5516b0895dd9949"/></dir></dir></dir><dir name="Helper"><file name="Api.php" hash="67c74a693b0e88e46c411eef410d4ed1"/><file name="Config.php" hash="602628cdb758d7a9d11a5d58e365d883"/><file name="Data.php" hash="a9f40bbfc679f28baf70764925cbc44d"/><file name="Order.php" hash="92cfe3cebfd589411bdb2acadef98454"/></dir><dir name="Model"><dir name="Api"><dir name="Action"><file name="OrderCancel.php" hash="35c8d7e7109ad096686b00150e8d7675"/><file name="OrderCreate.php" hash="dc5473e06809e3716e59482e1d4b29a2"/><file name="OrderDispatch.php" hash="5ea88918c680471375f2566776eea1ac"/><file name="OrderReserve.php" hash="ff1b5236b9acb6ca1e0e03839a2efc8a"/><file name="Search.php" hash="319453c85744a8e26b9d2c814710307a"/><file name="Status.php" hash="1276c6cd3865ae0d1849bd6ecdc20760"/></dir><file name="Action.php" hash="6387460f33b01021869e27d9d149b45c"/><file name="Request.php" hash="6cfddc8db491c7ca0080d573b13beee0"/><dir name="Response"><file name="Empty.php" hash="bfbaa43d4d497306f8da2b3a2c655697"/></dir><file name="Response.php" hash="7dce2136ca51d593f5d228153ae280a2"/></dir><file name="Cron.php" hash="4f9a640497398338ce2705211a30c585"/><file name="Observer.php" hash="7f515ebd6345e5bd854cb413936749ee"/><dir name="Resource"><file name="Setup.php" hash="147d81b7361f9f1195f28d0bb6b984eb"/></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><dir name="Total"><dir name="CornerDrop"><file name="Fee.php" hash="48ae579ca2e85763e9948ac3835cf46c"/></dir></dir></dir><dir name="Invoice"><dir name="Total"><dir name="CornerDrop"><file name="Fee.php" hash="7182e4731dc7050e23f548f0e9e5856f"/></dir></dir></dir></dir><dir name="Quote"><dir name="Address"><dir name="Total"><dir name="CornerDrop"><file name="Fee.php" hash="d6b96acd34f6f53e11cf30cda9fb72ca"/></dir></dir></dir></dir></dir></dir><dir name="Test"><dir name="Config"><file name="Base.php" hash="f21459ba9b4361c8c763510ff422da7a"/></dir><dir name="Helper"><file name="Data.php" hash="6fb31792dd3486b9958afd173ccaef3a"/></dir><dir name="Model"><dir name="Api"><dir name="Action"><dir name="fixtures"><file name="testExecute.yaml" hash="4bf971b7e6f563b6e5bb76d76dd6cf64"/></dir></dir><file name="Action.php" hash="531761671dfc4484a691a0b5417ff135"/><file name="Request.php" hash="f31d6e19575a537d7032a2b82cf015ea"/><dir name="Response"><dir name="providers"><file name="response_testIsSuccessful.yaml" hash="dcd28982bc03aa1e8fda487e033aa1c1"/></dir></dir><file name="Response.php" hash="21754f49b5614c09bd979de417613564"/><dir name="Test"><file name="Case.php" hash="6da3a5034451a458f3fd48ce1e08cb90"/></dir><dir name="data"><file name="data_response_success.json" hash="d4f878fbf642de88900d14e45a3bcdb8"/><file name="response_failed.json" hash="fc7fc43732a9c5dd02bcdbfcbc97d5d5"/><file name="response_nojson.json" hash="2debfdcf79f03e4a65a667d21ef9de14"/><file name="response_valid.json" hash="d4f878fbf642de88900d14e45a3bcdb8"/></dir></dir><dir name="Sales"><dir name="Order"><dir name="Creditmemo"><dir name="Total"><dir name="CornerDrop"><file name="Fee.php" hash="84b03283e27b1fd816201635c597be79"/><dir name="fixtures"><file name="testCornerDropFeeAddedWithNoTax.yaml" hash="73e7632380055b126fcf92c7132b3e59"/><file name="testCornerDropFeeAddedWithTax.yaml" hash="845d8e32971ba0f3d05244a512624424"/><file name="testCornerDropFeeNotAdded.yaml" hash="6fa7d5697f427f2b012119f5c98a4864"/></dir></dir></dir></dir><dir name="Invoice"><dir name="Total"><dir name="CornerDrop"><dir name="Fee"><dir name="fixtures"><file name="testCornerDropFeeAddedWithNoTax.yaml" hash="3ca60a8d63d85607e21f4056cd5e1c1e"/><file name="testCornerDropFeeAddedWithTax.yaml" hash="dbd4b0e984c33d67d42914b2b1fe51dc"/><file name="testCornerDropFeeNotAdded.yaml" hash="546edfba9d003abb71e25504d6a24bb8"/></dir></dir><file name="Fee.php" hash="9b3712ec678e9ab4e23997eeaed44882"/></dir></dir></dir></dir><dir name="Quote"><dir name="Address"><dir name="Total"><dir name="CornerDrop"><dir name="Fee"><dir name="fixtures"><file name="testCornerDropFeeAddedWithNoTax.yaml" hash="b73185d76bcf68a8f4427494a7edcec9"/><file name="testCornerDropFeeAddedWithTax.yaml" hash="990dbd28f7bc5df0b3022ca1324bd6dd"/><file name="testCornerDropFeeNotAdded.yaml" hash="978e2ea4f1cf243c1c0009b29d665474"/></dir></dir><file name="Fee.php" hash="4210ff4e9cbdcf9b7e4be01e065c4d7c"/></dir></dir></dir></dir></dir></dir><file name=".DS_Store" hash="d3e93ef36d9ad5164750e1060b7d57db"/></dir><dir name="controllers"><dir name="Adminhtml"><dir name="Cornerdrop"><dir name="Collect"><file name="SearchController.php" hash="24650d32e8f349e6b0509dd554977a21"/></dir></dir></dir><file name="SearchController.php" hash="e0a80753defd41c8fd74f68cf11fd272"/></dir><dir name="data"><dir name="cornerdrop_collect_setup"><file name="data-install-1.0.0.php" hash="5af153d7f4bbccb01b43192dc2d20e98"/></dir></dir><dir name="etc"><file name="adminhtml.xml" hash="13314d591c3e31da4c8dcc6ed855788c"/><file name="config.xml" hash="acef391a24eb76755abdb1617a29c18e"/><file name="system.xml" hash="cbcf83be33ea59ca73d2846e8945ad5e"/></dir><dir name="sql"><dir name="cornerdrop_collect_setup"><file name="install-1.0.0.php" hash="65791be82f1e27d834270b4298a29623"/><file name="upgrade-1.0.0-1.1.0.php" hash="572467dbfb19cd300667817e73e2a6c0"/><file name="upgrade-1.1.0-1.2.0.php" hash="1cdf2aa5ac04fe35ababbdbcb3ce3079"/></dir></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><dir name="cornerdrop"><file name="collect.xml" hash="f0b49d7f0db1da1cf77423cc2ece9290"/></dir></dir><dir name="template"><dir name="cornerdrop"><dir name="collect"><dir name="order"><dir name="create"><dir name="form"><dir name="address"><file name="shipping.phtml" hash="208494dde07849f56ea1543de7f281f7"/></dir></dir></dir></dir></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><dir name="cornerdrop"><file name="collect.xml" hash="d0cc6cc9426b15a41772f793f8330cde"/></dir></dir><dir name="template"><dir name="cornerdrop"><dir name="collect"><dir name="checkout"><file name="success.phtml" hash="809a6a237973e9ffedfffe35f42885c5"/><file name="switch.phtml" hash="ad52fd177f0a5ecf17cc1dc58abc377c"/></dir><dir name="email"><file name="shipment.phtml" hash="871f258e2997572074eef316c23d0c9b"/></dir><file name="search.phtml" hash="3c91f620562806745d28f761616a0f95"/></dir></dir></dir></dir></dir></dir></target><target name="magelocale"><dir name="en_US"><dir name="template"><dir name="email"><dir name="cornerdrop"><dir name="collect"><file name="code.html" hash="3001e4a02fd80da21e1ac608dedf4645"/></dir></dir></dir></dir></dir></target><target name="mageweb"><dir name="js"><dir name="cornerdrop"><dir name="collect"><file name="adminhtml.js" hash="f0ac452f665e1c805db1358cca78f3a4"/><file name="adminhtml_search.js" hash="51c23cb61d90f9b1840fe6f21b16bdfc"/><file name="adminhtml_ui.js" hash="173b95d667ed5934f3acdd53c6559add"/><file name="event.simulate.js" hash="0a68da6e1bb534e7a2848e3efd7a2116"/><file name="geolocationAPI.js" hash="2c36b8b741b4462e72f125e84724912d"/><file name="gmaps.js" hash="9da30fae7f25aae9a632dc8d6cb7993d"/><file name="search.js" hash="c522d932dbad7dcf0684bf3e3154b99e"/><file name="switch.js" hash="e3bd569c9cdd83fea6e2262a01912d38"/><file name="ui.js" hash="6bf0b7a81f43b907e72f9c1eb2cc63fa"/></dir></dir></dir></target><target name="mageskin"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="cornerdrop"><dir name="collect"><dir name="css"><file name="collect.css" hash="b657d1d1624da6d94102d55cd68a747d"/></dir><dir name="images"><file name="ajax-loader.gif" hash="7a7359b58d310f8edff5c1e6d46c8a09"/><file name="geolocation.png" hash="7721b57ba09ca1e3ba6b8e70b3683130"/><file name="reset.png" hash="882b5f458b8fd19356a758afe0b4062f"/><file name="search.png" hash="8c6298ce9cc6329f5d69810c3d2a4d71"/></dir></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="cornerdrop"><dir name="collect"><dir name="css"><file name="collect.css" hash="453495d721502344c3949160ad55a22c"/></dir><dir name="images"><file name="ajax-loader.gif" hash="7a7359b58d310f8edff5c1e6d46c8a09"/><file name="droppoint_active.png" hash="9f57a12c9f840944ae2ddeb1a46a63b8"/><file name="droppoint_inactive.png" hash="7fcf659b69695a001bf234cda72b4796"/><file name="droppoint_muted.png" hash="87efbda22a647a6f91dfee5211132496"/><file name="geolocation.png" hash="7721b57ba09ca1e3ba6b8e70b3683130"/><file name="logo_125.jpg" hash="0274087c0194b8b1f56e32788b928b4b"/><file name="logo_250.jpg" hash="d94f2421782938260b3d8ec5fff8e32b"/><file name="logo_500.jpg" hash="80a099917459d94a02b3a64ee867c0ba"/><file name="reset.png" hash="882b5f458b8fd19356a758afe0b4062f"/><file name="search.png" hash="8c6298ce9cc6329f5d69810c3d2a4d71"/></dir><file name=".DS_Store" hash="33c2f217f36b47c4ca54cf99420edf36"/></dir></dir></dir></dir></dir></target></contents>
34
+ <compatible/>
35
+ <dependencies><required><php><min>5.4.0</min><max>5.6.0</max></php></required></dependencies>
36
+ </package>
skin/adminhtml/default/default/cornerdrop/collect/css/collect.css ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .cdc-panel:after,
2
+ .cdc-search-container:after,
3
+ .cdc-error:after,
4
+ .cdc-search-results:after,
5
+ .cdc-toggle-button:before {
6
+ clear: both;
7
+ content: '';
8
+ display: table;
9
+ }
10
+
11
+ .cdc-panel {
12
+ margin-bottom: 10px;
13
+ }
14
+
15
+ .cdc-info {
16
+ margin-bottom: 10px;
17
+ }
18
+
19
+ .cdc-search-container {
20
+ margin-bottom: 10px;
21
+ }
22
+
23
+ .cdc-search-form {
24
+ display: inline-block;
25
+ position: relative;
26
+ max-width: calc(100% - 35px);
27
+ width: 365px;
28
+ }
29
+
30
+ .cdc-search-label {
31
+ border: 0;
32
+ clip: rect(0 0 0 0);
33
+ height: 1px;
34
+ margin: -1px;
35
+ overflow: hidden;
36
+ padding: 0;
37
+ position: absolute;
38
+ width: 1px;
39
+ }
40
+
41
+ .cdc-search-results ul {
42
+ display: block;
43
+ }
44
+
45
+ .cdc-result {
46
+ cursor: pointer;
47
+ display: none;
48
+ margin: 10px 0;
49
+ }
50
+
51
+ .cdc-result-item-title {
52
+ display: block;
53
+ font-weight: bold;
54
+ }
55
+
56
+ .cdc-result-item-body {
57
+ display: block;
58
+ }
59
+
60
+ .cdc-store {
61
+ clear: both;
62
+ padding: 20px 0;
63
+ }
64
+
65
+ .cdc-store-title {
66
+ font-weight: bold;
67
+ text-transform: uppercase;
68
+ }
69
+
70
+ .cdc-map-container {
71
+ margin: 10px auto;
72
+ }
73
+
74
+ .cdc-map {
75
+ height: 300px;
76
+ width: 100%;
77
+ }
78
+
79
+ .cdc-map:empty {
80
+ height: 0;
81
+ }
82
+
83
+ /* Classes */
84
+ .cdc-hidden {
85
+ display: none;
86
+ }
87
+
88
+ .cdc-error {
89
+ clear: both;
90
+ color: #df280a;
91
+ margin: 5px auto;
92
+ text-align: center;
93
+ }
94
+
95
+ .cdc-show {
96
+ display: inherit;
97
+ }
98
+
99
+ .cdc-active {
100
+ opacity: 1;
101
+ }
102
+
103
+ @media only screen and (min-width: 770px) {
104
+ .cdc-search-results {
105
+ float: left;
106
+ overflow: scroll;
107
+ max-height: 370px;
108
+ width: 35%;
109
+ }
110
+
111
+ .cdc-store {
112
+ clear: none;
113
+ float: left;
114
+ width: 35%;
115
+ }
116
+
117
+ .cdc-map-container {
118
+ float: right;
119
+ width: 65%;
120
+ }
121
+
122
+ .cdc-map {
123
+ height: 350px;
124
+ }
125
+
126
+ .cdc-result {
127
+ display: inherit;
128
+ }
129
+
130
+ /* This hides the pager for larger screens where it is not
131
+ * used. Conditional JS is therefore not required.
132
+ */
133
+ .js-cdc-results-pager {
134
+ display: none;
135
+ }
136
+ }
skin/adminhtml/default/default/cornerdrop/collect/images/ajax-loader.gif ADDED
Binary file
skin/adminhtml/default/default/cornerdrop/collect/images/geolocation.png ADDED
Binary file
skin/adminhtml/default/default/cornerdrop/collect/images/reset.png ADDED
Binary file
skin/adminhtml/default/default/cornerdrop/collect/images/search.png ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/.DS_Store ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/css/collect.css ADDED
@@ -0,0 +1,198 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .cdc-panel:after,
2
+ .cdc-search-container:after,
3
+ .cdc-error:after,
4
+ .cdc-search-results:after,
5
+ .cdc-toggle-button:before {
6
+ clear: both;
7
+ content: '';
8
+ display: table;
9
+ }
10
+
11
+ .cdc-logo {
12
+ display: inline-block;
13
+ vertical-align: top;
14
+ }
15
+
16
+ .cdc-panel {
17
+ margin-bottom: 10px;
18
+ }
19
+
20
+ .cdc-info {
21
+ margin-bottom: 10px;
22
+ }
23
+
24
+ .cdc-search-container {
25
+ margin-bottom: 10px;
26
+ }
27
+
28
+ .cdc-search-button,
29
+ .cdc-reset-button {
30
+ top: 0;
31
+ right: 0;
32
+ position: absolute;
33
+ }
34
+
35
+ .cdc-search-button {
36
+ background: transparent url(../images/search.png) no-repeat center;
37
+ }
38
+
39
+ .cdc-reset-button {
40
+ background: transparent url(../images/reset.png) no-repeat center;
41
+ }
42
+
43
+ .cdc-geolocation {
44
+ background: transparent url(../images/geolocation.png) no-repeat center;
45
+ cursor: pointer;
46
+ }
47
+
48
+ .cdc-geolocation:hover {
49
+ opacity: 1;
50
+ }
51
+
52
+ .cdc-geolocation,
53
+ .cdc-search-button,
54
+ .cdc-reset-button {
55
+ border: 0;
56
+ display: inline-block;
57
+ height: 30px;
58
+ text-indent: -9999px;
59
+ vertical-align: middle;
60
+ width: 30px;
61
+ }
62
+
63
+ .cdc-geolocation,
64
+ .cdc-search-button {
65
+ opacity: .5;
66
+ }
67
+
68
+ .cdc-search-form {
69
+ display: inline-block;
70
+ position: relative;
71
+ max-width: calc(100% - 35px);
72
+ width: 365px;
73
+ }
74
+
75
+ .cdc-search-label {
76
+ border: 0;
77
+ clip: rect(0 0 0 0);
78
+ height: 1px;
79
+ margin: -1px;
80
+ overflow: hidden;
81
+ padding: 0;
82
+ position: absolute;
83
+ width: 1px;
84
+ }
85
+
86
+ .cdc-search-results ul {
87
+ display: block;
88
+ }
89
+
90
+ .cdc-result {
91
+ cursor: pointer;
92
+ display: none;
93
+ margin: 10px 0;
94
+ }
95
+ .cdc-result:hover {
96
+ background-color: #dff4ff;
97
+ }
98
+
99
+ .cdc-result-item-title {
100
+ color: #39C;
101
+ display: block;
102
+ font-weight: bold;
103
+ }
104
+
105
+ .cdc-result-item-body {
106
+ display: block;
107
+ }
108
+
109
+ .cdc-store {
110
+ clear: both;
111
+ padding: 20px 0;
112
+ }
113
+
114
+ .cdc-store-title {
115
+ font-weight: bold;
116
+ text-transform: uppercase;
117
+ }
118
+
119
+ .cdc-map-container {
120
+ margin: 10px auto;
121
+ }
122
+
123
+ .cdc-map {
124
+ height: 300px;
125
+ width: 100%;
126
+ }
127
+
128
+ .cdc-map:empty {
129
+ height: 0;
130
+ }
131
+
132
+ .cdc-tc-container {
133
+ margin-bottom: 10px;
134
+ }
135
+
136
+ .cdc-tc-label {
137
+ cursor: pointer;
138
+ padding-left: 5px;
139
+ }
140
+
141
+ /* Classes */
142
+ .cdc-hidden {
143
+ display: none;
144
+ }
145
+
146
+ .cdc-error {
147
+ clear: both;
148
+ color: #df280a;
149
+ margin: 5px auto;
150
+ text-align: center;
151
+ }
152
+
153
+ .cdc-show {
154
+ display: inherit;
155
+ }
156
+
157
+ .cdc-loading {
158
+ background-image: url('../images/ajax-loader.gif');
159
+ }
160
+
161
+ .cdc-active {
162
+ opacity: 1;
163
+ }
164
+
165
+ @media only screen and (min-width: 770px) {
166
+ .cdc-search-results {
167
+ float: left;
168
+ overflow: scroll;
169
+ max-height: 370px;
170
+ width: 35%;
171
+ }
172
+
173
+ .cdc-store {
174
+ clear: none;
175
+ float: left;
176
+ width: 35%;
177
+ }
178
+
179
+ .cdc-map-container {
180
+ float: right;
181
+ width: 65%;
182
+ }
183
+
184
+ .cdc-map {
185
+ height: 350px;
186
+ }
187
+
188
+ .cdc-result {
189
+ display: inherit;
190
+ }
191
+
192
+ /* This hides the pager for larger screens where it is not
193
+ * used. Conditional JS is therefore not required.
194
+ */
195
+ .js-cdc-results-pager {
196
+ display: none;
197
+ }
198
+ }
skin/frontend/base/default/cornerdrop/collect/images/ajax-loader.gif ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/droppoint_active.png ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/droppoint_inactive.png ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/droppoint_muted.png ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/geolocation.png ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/logo_125.jpg ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/logo_250.jpg ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/logo_500.jpg ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/reset.png ADDED
Binary file
skin/frontend/base/default/cornerdrop/collect/images/search.png ADDED
Binary file