SalesTax_Connector - Version 3.1.3

Version Notes

Simplify sales and use tax calculation, compliance, and management in the cloud!

Download this release

Release Info

Developer Magento Core Team
Extension SalesTax_Connector
Version 3.1.3
Comparing to
See all releases


Code changes from version 3.1.2 to 3.1.3

app/code/local/Harapartners/ConnectorHub/Helper/Connector/Core.php DELETED
@@ -1,183 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- abstract class Harapartners_ConnectorHub_Helper_Connector_Core extends Mage_Core_Helper_Abstract {
14
-
15
- const REQUEST_ACTION_AUTHENTICATION = 'authentication';
16
-
17
- const REQUEST_SERVICE_MODE_TEST = 0;
18
- const REQUEST_SERVICE_MODE_SANDBOX = 10;
19
- const REQUEST_SERVICE_MODE_BETA = 50;
20
- const REQUEST_SERVICE_MODE_PRODUCTION = 100;
21
-
22
- const RESPONSE_STATUS_FAIL = 0;
23
- const RESPONSE_STATUS_SUCCESS = 100;
24
- const RESPONSE_STATUS_REAUTH = 200;
25
-
26
- const DEFAULT_CURLOPT_TIMEOUT = 60;
27
-
28
- protected $_serviceType = null;
29
-
30
- protected function _processRequest($request){
31
- // -------------- Prepare additional request meta -------------- //
32
- $adminEmail = "";
33
- if(!!Mage::getSingleton('admin/session')->getUser()){
34
- $adminEmail = Mage::getSingleton('admin/session')->getUser()->getEmail();
35
- }
36
- $request['meta'] = array_merge($request['meta'], array(
37
- 'service_type' => $this->getServiceType(),
38
- 'service_mode' => $this->getServiceMode(),
39
- 'auth_token' => $this->getToken('auth_token'),
40
- 'site_url' => Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB),
41
- 'account_name' => $adminEmail,
42
- 'platform' => 'magento',
43
- 'version' => Mage::getVersion()
44
- ));
45
-
46
- if(isset($request['data'])){
47
- $request['enc_data'] = $this->encryptRequestData($request['data']);
48
- unset($request['data']);
49
- }
50
-
51
- // -------------- Make request -------------- //
52
- $requestUrl = $this->_getConnectorHubUrl();
53
- $requestPostData = array('params' => base64_encode(json_encode($request)));
54
- $requestCh = curl_init();
55
- curl_setopt($requestCh, CURLOPT_URL, $requestUrl);
56
- curl_setopt($requestCh, CURLOPT_POST, 1);
57
- curl_setopt($requestCh, CURLOPT_POSTFIELDS, $requestPostData);
58
- curl_setopt($requestCh, CURLOPT_SSL_VERIFYPEER, $this->_getCurlSslVerifyPeer());
59
- curl_setopt($requestCh, CURLOPT_RETURNTRANSFER, 1);
60
- curl_setopt($requestCh, CURLOPT_TIMEOUT, self::DEFAULT_CURLOPT_TIMEOUT);
61
- $curlRawResponse = curl_exec($requestCh);
62
- $response = json_decode(base64_decode($curlRawResponse));
63
- curl_close($requestCh);
64
-
65
- // -------------- Process response -------------- //
66
- if(!$response){
67
- if($curlRawResponse){
68
- throw new Exception('Internal Error on Server.');
69
- }
70
- throw new Exception('Connection failed.');
71
- }
72
- //For now treat reauth the same as fail, the notification will prompt the admin user to update their credentials
73
- switch($response->meta->status){
74
- case self::RESPONSE_STATUS_FAIL:
75
- case self::RESPONSE_STATUS_REAUTH:
76
- throw new Exception($response->meta->message);
77
- break;
78
- case self::RESPONSE_STATUS_SUCCESS:
79
- break;
80
- default:
81
- break;
82
- }
83
- if(!!$response->enc_data){
84
- $dataToken = $this->getToken('data_token');
85
- $decData = Mage::helper('connectorhub/mcrypt')->init($dataToken)->decrypt(base64_decode($response->enc_data));
86
- $response->data = json_decode($decData);
87
- }
88
-
89
- return $response;
90
- }
91
-
92
- public function authenticationRequest($credentials){
93
- //For authentication request, directly send the data, rather than encrypted data with token
94
- $request = array(
95
- 'meta' => array(
96
- 'action' => self::REQUEST_ACTION_AUTHENTICATION,
97
- 'credentials' => $credentials
98
- )
99
- );
100
- $response = $this->_processRequest($request);
101
-
102
- //service_mode can be '0'
103
- if(is_null($response->meta->service_mode) || !$response->meta->auth_token || !$response->meta->data_token){
104
- throw new Exception('Authentication failed.');
105
- }
106
-
107
- $this->saveTokens($response);
108
- return $response;
109
- }
110
-
111
-
112
- // ======================= Essential overrides ======================= //
113
- abstract public function getServiceMode();
114
-
115
- abstract protected function _getConnectorHubUrl();
116
-
117
- abstract protected function _getConfigDataBasePath($key);
118
-
119
- abstract protected function _prepareCredentials();
120
-
121
-
122
- // ====================== Utilities/Helpers ====================== //
123
- public function getServiceType(){
124
- return $this->_serviceType;
125
- }
126
-
127
- public function getToken($tokenName, $serviceMode = null){
128
- if(!$serviceMode){
129
- $serviceMode = $this->getServiceMode();
130
- }
131
-
132
- //Load from DB, no cache
133
- $coreConfigData = Mage::getModel('core/config_data')->load($this->_getConfigDataBasePath('tokens'), 'path');
134
- $existingToken = json_decode($coreConfigData->getValue(), 1);
135
- if(isset($existingToken[$serviceMode][$tokenName])){
136
- return $existingToken[$serviceMode][$tokenName];
137
- }
138
- return null;
139
- }
140
-
141
- public function saveTokens($response){
142
- //Save to DB, no cache
143
- $coreConfigData = Mage::getModel('core/config_data')->load($this->_getConfigDataBasePath('tokens'), 'path');
144
- //In case the first time save
145
- $coreConfigData->setpath($this->_getConfigDataBasePath('tokens'));
146
-
147
- $existingToken = json_decode($coreConfigData->getValue(), 1);
148
- $existingToken[$response->meta->service_mode] = array(
149
- 'auth_token' => $response->meta->auth_token,
150
- 'data_token' => $response->meta->data_token
151
- );
152
- $coreConfigData->setValue(json_encode($existingToken));
153
- $coreConfigData->save();
154
- return;
155
- }
156
-
157
- public function encryptRequestData($requestData){
158
- //For authentication request, directly send the data, rather than encrypted data with token
159
- $authToken = $this->getToken('auth_token');
160
- $dataToken = $this->getToken('data_token');
161
- $encData = Mage::helper('connectorhub/mcrypt')->init($dataToken)->encrypt(json_encode($requestData));
162
- return base64_encode($encData);
163
- }
164
-
165
- protected function _getCurlSslVerifyPeer(){
166
- $sslVerifyPeer = 0;
167
- try{
168
- $secureUrlScheme = parse_url(Mage::getUrl('', array('_secure'=>true)), PHP_URL_SCHEME);
169
- if(strcasecmp($secureUrlScheme, "https") == 0){
170
- $sslVerifyPeer = 1;
171
- }
172
- }catch(Exception $e){
173
- $sslVerifyPeer = 0;
174
- }
175
- return $sslVerifyPeer;
176
- }
177
-
178
- protected function _getConnectorHubRootUrl(){
179
- // return Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB) . "ConnectorHub/";
180
- return "https://connectorhub.harapartners.com/";
181
- }
182
-
183
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/ConnectorHub/Helper/Mcrypt.php DELETED
@@ -1,87 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- class Harapartners_ConnectorHub_Helper_Mcrypt extends Harapartners_ConnectorHub_Helper_Object {
14
-
15
- public function init($key)
16
- {
17
- if (!$this->getCipher()) {
18
- $this->setCipher(MCRYPT_BLOWFISH);
19
- }
20
-
21
- if (!$this->getMode()) {
22
- $this->setMode(MCRYPT_MODE_ECB);
23
- }
24
-
25
- $this->setHandler(mcrypt_module_open($this->getCipher(), '', $this->getMode(), ''));
26
-
27
- if (!$this->getInitVector()) {
28
- if (MCRYPT_MODE_CBC == $this->getMode()) {
29
- $this->setInitVector(substr(
30
- md5(mcrypt_create_iv (mcrypt_enc_get_iv_size($this->getHandler()), MCRYPT_RAND)),
31
- - mcrypt_enc_get_iv_size($this->getHandler())
32
- ));
33
- } else {
34
- $this->setInitVector(mcrypt_create_iv (mcrypt_enc_get_iv_size($this->getHandler()), MCRYPT_RAND));
35
- }
36
- }
37
-
38
- $maxKeySize = mcrypt_enc_get_key_size($this->getHandler());
39
-
40
- if (strlen($key) > $maxKeySize) { // strlen() intentionally, to count bytes, rather than characters
41
- $this->setHandler(null);
42
- throw new Exception('Maximum key size must be smaller '.$maxKeySize);
43
- }
44
-
45
- mcrypt_generic_init($this->getHandler(), $key, $this->getInitVector());
46
-
47
- return $this;
48
- }
49
-
50
- public function encrypt($data)
51
- {
52
- if (!$this->getHandler()) {
53
- throw new Exception('Crypt module is not initialized.');
54
- }
55
- if (strlen($data) == 0) {
56
- return $data;
57
- }
58
- return mcrypt_generic($this->getHandler(), $data);
59
- }
60
-
61
- public function decrypt($data)
62
- {
63
- if (!$this->getHandler()) {
64
- throw new Exception('Crypt module is not initialized.');
65
- }
66
- if (strlen($data) == 0) {
67
- return $data;
68
- }
69
- //Encrypt-Decrypt may append "\0", such padding characters must be removed
70
- return rtrim(mdecrypt_generic($this->getHandler(), $data), "\0");
71
- }
72
-
73
-
74
- public function __destruct()
75
- {
76
- if ($this->getHandler()) {
77
- $this->_reset();
78
- }
79
- }
80
-
81
- protected function _reset()
82
- {
83
- mcrypt_generic_deinit($this->getHandler());
84
- mcrypt_module_close($this->getHandler());
85
- }
86
-
87
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/ConnectorHub/Helper/Object.php DELETED
@@ -1,161 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- class Harapartners_ConnectorHub_Helper_Object {
14
-
15
- protected $_data = array();
16
- protected $_hasDataChanges = false;
17
- protected $_syncFieldsMap = array();
18
- static protected $_underscoreCache = array();
19
-
20
- public function __call($method, $args){
21
- switch (substr($method, 0, 3)) {
22
- case 'get' :
23
- //Varien_Profiler::start('GETTER: '.get_class($this).'::'.$method);
24
- $key = $this->_underscore(substr($method,3));
25
- $data = $this->getData($key, isset($args[0]) ? $args[0] : null);
26
- //Varien_Profiler::stop('GETTER: '.get_class($this).'::'.$method);
27
- return $data;
28
-
29
- case 'set' :
30
- //Varien_Profiler::start('SETTER: '.get_class($this).'::'.$method);
31
- $key = $this->_underscore(substr($method,3));
32
- $result = $this->setData($key, isset($args[0]) ? $args[0] : null);
33
- //Varien_Profiler::stop('SETTER: '.get_class($this).'::'.$method);
34
- return $result;
35
-
36
- case 'uns' :
37
- //Varien_Profiler::start('UNS: '.get_class($this).'::'.$method);
38
- $key = $this->_underscore(substr($method,3));
39
- $result = $this->unsetData($key);
40
- //Varien_Profiler::stop('UNS: '.get_class($this).'::'.$method);
41
- return $result;
42
-
43
- case 'has' :
44
- //Varien_Profiler::start('HAS: '.get_class($this).'::'.$method);
45
- $key = $this->_underscore(substr($method,3));
46
- //Varien_Profiler::stop('HAS: '.get_class($this).'::'.$method);
47
- return isset($this->_data[$key]);
48
- }
49
- throw new Exception("Invalid method ".get_class($this)."::".$method."(".print_r($args,1).")");
50
- }
51
-
52
- public function addData(array $arr) {
53
- foreach($arr as $index=>$value) {
54
- $this->setData($index, $value);
55
- }
56
- return $this;
57
- }
58
-
59
- public function getData($key='', $index=null) {
60
- if (''===$key) {
61
- return $this->_data;
62
- }
63
-
64
- $default = null;
65
-
66
- // accept a/b/c as ['a']['b']['c']
67
- if (strpos($key,'/')) {
68
- $keyArr = explode('/', $key);
69
- $data = $this->_data;
70
- foreach ($keyArr as $i=>$k) {
71
- if ($k==='') {
72
- return $default;
73
- }
74
- if (is_array($data)) {
75
- if (!isset($data[$k])) {
76
- return $default;
77
- }
78
- $data = $data[$k];
79
- } else {
80
- return $default;
81
- }
82
- }
83
- return $data;
84
- }
85
-
86
- // legacy functionality for $index
87
- if (isset($this->_data[$key])) {
88
- if (is_null($index)) {
89
- return $this->_data[$key];
90
- }
91
-
92
- $value = $this->_data[$key];
93
- if (is_array($value)) {
94
- //if (isset($value[$index]) && (!empty($value[$index]) || strlen($value[$index]) > 0)) {
95
- /**
96
- * If we have any data, even if it empty - we should use it, anyway
97
- */
98
- if (isset($value[$index])) {
99
- return $value[$index];
100
- }
101
- return null;
102
- } elseif (is_string($value)) {
103
- $arr = explode("\n", $value);
104
- return (isset($arr[$index]) && (!empty($arr[$index]) || strlen($arr[$index]) > 0)) ? $arr[$index] : null;
105
- }
106
- return $default;
107
- }
108
- return $default;
109
- }
110
-
111
- public function setData($key, $value=null) {
112
- $this->_hasDataChanges = true;
113
- if(is_array($key)) {
114
- $this->_data = $key;
115
- $this->_addFullNames();
116
- } else {
117
- $this->_data[$key] = $value;
118
- if (isset($this->_syncFieldsMap[$key])) {
119
- $fullFieldName = $this->_syncFieldsMap[$key];
120
- $this->_data[$fullFieldName] = $value;
121
- }
122
- }
123
- return $this;
124
- }
125
-
126
- public function unsetData($key=null) {
127
- $this->_hasDataChanges = true;
128
- if (is_null($key)) {
129
- $this->_data = array();
130
- } else {
131
- unset($this->_data[$key]);
132
- if (isset($this->_syncFieldsMap[$key])) {
133
- $fullFieldName = $this->_syncFieldsMap[$key];
134
- unset($this->_data[$fullFieldName]);
135
- }
136
- }
137
- return $this;
138
- }
139
-
140
- protected function _addFullNames() {
141
- $existedShortKeys = array_intersect($this->_syncFieldsMap, array_keys($this->_data));
142
- if (!empty($existedShortKeys)) {
143
- foreach ($existedShortKeys as $key) {
144
- $fullFieldName = array_search($key, $this->_syncFieldsMap);
145
- $this->_data[$fullFieldName] = $this->_data[$key];
146
- }
147
- }
148
- }
149
-
150
- protected function _underscore($name){
151
- if (isset(self::$_underscoreCache[$name])) {
152
- return self::$_underscoreCache[$name];
153
- }
154
- #Varien_Profiler::start('underscore');
155
- $result = strtolower(preg_replace('/(.)([A-Z])/', "$1_$2", $name));
156
- #Varien_Profiler::stop('underscore');
157
- self::$_underscoreCache[$name] = $result;
158
- return $result;
159
- }
160
-
161
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/ConnectorHub/Model/Rewrite/Paypal/Api/Nvp.php DELETED
@@ -1,39 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- *
13
- */
14
- class Harapartners_ConnectorHub_Model_Rewrite_Paypal_Api_Nvp extends Mage_Paypal_Model_Api_Nvp {
15
-
16
- public function getButtonSourceEc(){
17
- return $this->getBuildNotationCode();
18
- }
19
-
20
- public function getButtonSourceDp(){
21
- return $this->getBuildNotationCode();
22
- }
23
-
24
- //Important build code update, for Mage_Paypal 1.4 -
25
- public function getBuildNotationCode($countryCode = null){
26
- if($this->_isModuleActive('Enterprise_Enterprise')){
27
- return 'Hara_SI_MagentoEE_PPA';
28
- }else{
29
- return 'Hara_SI_MagentoCE_PPA';
30
- }
31
- }
32
-
33
- private function _isModuleActive($code) {
34
- $module = Mage::getConfig()->getNode("modules/$code");
35
- $model = Mage::getConfig()->getNode("global/models/$code");
36
- return $module && $module->is('active') || $model;
37
- }
38
-
39
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/ConnectorHub/Model/Rewrite/Paypal/Config.php DELETED
@@ -1,58 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- *
13
- */
14
- class Harapartners_ConnectorHub_Model_Rewrite_Paypal_Config extends Mage_Paypal_Model_Config {
15
-
16
- protected $_isStagingMode = null;
17
-
18
- /* Compatibility for Staging server SSL verification */
19
- public function __get($key){
20
- if(strcmp($key, 'verifyPeer') == 0 || strcmp($key, 'verify_peer') == 0){
21
- if($this->_isStagingMode === null){
22
- $this->_isStagingMode = 0;
23
- try{
24
- $curlResource = curl_init("https://www.paypal.com/");
25
- curl_setopt($curlResource, CURLOPT_TIMEOUT, 3);
26
- curl_setopt($curlResource, CURLOPT_RETURNTRANSFER, false);
27
- curl_setopt($curlResource, CURLOPT_SSL_VERIFYPEER, true);
28
- curl_exec($curlResource);
29
- $curlError = curl_error($curlResource);
30
- curl_close($curlResource);
31
- if(!!$curlError){
32
- $this->_isStagingMode = 1;
33
- }
34
- }catch (Exception $ex){
35
- $this->_isStagingMode = 1;
36
- }
37
- }
38
- if($this->_isStagingMode == 1){
39
- return 0;
40
- }
41
- }
42
- return parent::__get($key);
43
- }
44
-
45
- public function getBuildNotationCode($countryCode = null){
46
- if($this->_isModuleActive('Enterprise_Enterprise')){
47
- return 'Hara_SI_MagentoEE_PPA';
48
- }else{
49
- return 'Hara_SI_MagentoCE_PPA';
50
- }
51
- }
52
- private function _isModuleActive($code) {
53
- $module = Mage::getConfig()->getNode("modules/$code");
54
- $model = Mage::getConfig()->getNode("global/models/$code");
55
- return $module && $module->is('active') || $model;
56
- }
57
-
58
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/ConnectorHub/etc/config.xml DELETED
@@ -1,54 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!--
3
- /*
4
- * NOTICE OF LICENSE
5
- *
6
- * This source file is subject to the End User Software Agreement (EULA).
7
- * It is also available through the world-wide-web at this URL:
8
- * http://www.harapartners.com/license
9
- * If you did not receive a copy of the license and are unable to
10
- * obtain it through the world-wide-web, please send an email
11
- * to eula@harapartners.com so we can send you a copy immediately.
12
- *
13
- */
14
- -->
15
- <config>
16
- <modules>
17
- <Harapartners_ConnectorHub>
18
- <version>1.0.0</version>
19
- </Harapartners_ConnectorHub>
20
- </modules>
21
- <global>
22
- <models>
23
- <connectorhub>
24
- <class>Harapartners_ConnectorHub_Model</class>
25
- </connectorhub>
26
- <paypal>
27
- <rewrite>
28
- <!-- /* Compatibility for Staging server SSL verification */ -->
29
- <config>Harapartners_ConnectorHub_Model_Rewrite_Paypal_Config</config>
30
- <api_nvp>Harapartners_ConnectorHub_Model_Rewrite_Paypal_Api_Nvp</api_nvp>
31
- </rewrite>
32
- </paypal>
33
- </models>
34
- <helpers>
35
- <connectorhub>
36
- <class>Harapartners_ConnectorHub_Helper</class>
37
- </connectorhub>
38
- </helpers>
39
- </global>
40
- <default>
41
- <connectorhub>
42
- <connectorhub>
43
- <url>https://www.connectorhub.com/</url>
44
- </connectorhub>
45
- </connectorhub>
46
- <paypal>
47
- <!-- /* Compatibility for Staging server SSL verification */ -->
48
- <wpp>
49
- <button_source_ec>Hara_SI_MagentoCE_PPA</button_source_ec>
50
- <button_source_dp>Hara_SI_MagentoCE_PPA</button_source_dp>
51
- </wpp>
52
- </paypal>
53
- </default>
54
- </config>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Block/Adminhtml/System/Config/Form/Field/Authentication.php DELETED
@@ -1,77 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
-
14
- class Harapartners_SpeedTax_Block_Adminhtml_System_Config_Form_Field_Authentication extends Mage_Adminhtml_Block_System_Config_Form_Field {
15
-
16
- protected function _toHtml() {
17
- $htmlId = $this->getHtmlId();
18
- $ajaxUrl = $this->getAjaxUrl();
19
- $buttonLabel = $this->escapeHtml($this->getButtonLabel());
20
-
21
- $htmlContent = <<< HTML_CONTENT
22
- <script type="text/javascript">
23
- function ajaxLogin() {
24
- var elem = $('$htmlId');
25
-
26
- params = {
27
- username: $('speedtax_speedtax_username').value,
28
- password: $('speedtax_speedtax_password').value,
29
- company_code: $('speedtax_speedtax_company_code').value,
30
- is_test_mode: $('speedtax_speedtax_is_test_mode').value
31
- };
32
-
33
- new Ajax.Request('$ajaxUrl', {
34
- parameters: params,
35
- onSuccess: function(response) {
36
- result = 'Login failed!';
37
- try {
38
- response = JSON.parse(response.responseText);
39
- result = response.message;
40
- if (response.status == 1) {
41
- elem.removeClassName('fail').addClassName('success');
42
- } else {
43
- elem.removeClassName('success').addClassName('fail');
44
- }
45
- } catch (e) {
46
- elem.removeClassName('success').addClassName('fail');
47
- }
48
- $('ajax_login_result').update(result);
49
- }
50
- });
51
- }
52
- </script>
53
- <button onclick="javascript:ajaxLogin(); return false;" class="scalable" type="button" id="$htmlId">
54
- <span><span><span id="ajax_login_result">$buttonLabel</span></span></span>
55
- </button>
56
- HTML_CONTENT;
57
-
58
- return $htmlContent;
59
- }
60
-
61
- public function render(Varien_Data_Form_Element_Abstract $element){
62
- $element->unsScope()->unsCanUseWebsiteValue()->unsCanUseDefaultValue();
63
- return parent::render($element);
64
- }
65
-
66
- protected function _getElementHtml(Varien_Data_Form_Element_Abstract $element){
67
- $originalData = $element->getOriginalData();
68
- $this->addData(array(
69
- 'button_label' => Mage::helper('speedtax')->__($originalData['button_label']),
70
- 'html_id' => $element->getHtmlId(),
71
- 'ajax_url' => Mage::getSingleton('adminhtml/url')->getUrl('speedtax_adminhtml/system_config_ajax/authentication')
72
- ));
73
-
74
- return $this->_toHtml();
75
- }
76
-
77
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Helper/Connector/Data.php DELETED
@@ -1,240 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- class Harapartners_SpeedTax_Helper_Connector_Data extends Mage_Core_Helper_Abstract {
14
-
15
- const TAX_SHIPPING_LINEITEM_TAX_CLASS = 'TAX_SHIPPING';
16
- const TAX_SHIPPING_LINEITEM_REFERNCE_NAME = 'TAX_SHIPPING';
17
-
18
- protected $_productTaxClassNoneTaxableId = 0; //Magento default
19
- // protected $_allowedCountryIds = array('US', 'CA');
20
-
21
- protected $_shipFromAddress = null;
22
- protected $_shipToAddress = null;
23
-
24
- // ========================== Main entry points ========================== //
25
- public function prepareSpeedTaxInvoiceByMageQuoteAddress(Mage_Sales_Model_Quote_Address $mageQuoteAddress) {
26
- $sptxInvoice = new stdClass();
27
- $sptxInvoice->lineItems = array();
28
- $sptxInvoice->customerIdentifier = Mage::getStoreConfig ( 'speedtax/speedtax/username' );
29
-
30
- foreach ( $mageQuoteAddress->getAllItems () as $mageQuoteItem ) {
31
- if(!!$mageQuoteItem->getParentItemId()){
32
- continue;
33
- }
34
- //Multiple shipping checkout, $mageQuoteItem is instance of Mage_Sales_Model_Quote_Address_Item, not a sub-class of Mage_Sales_Model_Quote_Item
35
- //Many product related fields must be obtained from the product object directly
36
- if($mageQuoteItem->getProduct()->getTaxClassId() == $this->_productTaxClassNoneTaxableId){
37
- continue;
38
- }
39
- if($mageQuoteItem->getRowTotal() - $mageQuoteItem->getDiscountAmount() <= 0){
40
- continue;
41
- }
42
-
43
- $lineItem = new stdClass();
44
- $lineItem->productCode = $this->_getProductCode($mageQuoteItem);
45
- $lineItem->customReference = $mageQuoteItem->getId();
46
- $lineItem->quantity = $mageQuoteItem->getQty();
47
- $lineItem->shipFromAddress = $this->_getShipFromAddress();
48
- $lineItem->shipToAddress = $this->_getShippingToAddress($mageQuoteAddress); //Note, address type is validated at the entry point 'queryQuoteAddress'
49
-
50
- //Price of row total, not unit price
51
- $lineItemPrice = new stdClass();
52
- $lineItemPrice->decimalValue = $mageQuoteItem->getRowTotal() - $mageQuoteItem->getDiscountAmount();
53
- $lineItem->salesAmount = $lineItemPrice;
54
-
55
- $lineItem->lineItemNumber = count( $sptxInvoice->lineItems );
56
- $sptxInvoice->lineItems[] = $lineItem;
57
- }
58
-
59
- // ----- Other line items ----- //
60
- //If global store config specifies: "tax_shipping", then create shipping cost line item. Note this is different from "Tax_Shipping" tax class of a product
61
- $shipingAmount = $mageQuoteAddress->getShippingAmount();
62
- if(!!Mage::getStoreConfig("speedtax/speedtax/tax_shipping") && $shipingAmount > 0.0){
63
- $shippingLineItem = $this->_generateLineItemFromShippingCost($mageQuoteAddress, $shipingAmount);
64
- $shippingLineItem->lineItemNumber = count( $sptxInvoice->lineItems );
65
- $sptxInvoice->lineItems[] = $shippingLineItem;
66
- }
67
-
68
- $sptxInvoice->invoiceDate = date('Y-m-d H:i:s');
69
- return $sptxInvoice;
70
- }
71
-
72
- public function prepareSpeedTaxInvoiceByMageOrderInvoice(Mage_Sales_Model_Order_Invoice $mageOrderInvoice) {
73
- //Clear the invoice number so that the request is just a query
74
- $mageOrderAddress = $mageOrderInvoice->getShippingAddress();
75
- $sptxInvoice = new stdClass();
76
-
77
- //Important to keep unique, invoice should already be attached to the order, count starts from 1
78
- $sptxInvoice->invoiceNumber =
79
- $mageOrderInvoice->getOrder()->getIncrementId()
80
- . '-INV-' . ($mageOrderInvoice->getOrder()->getInvoiceCollection()->count());
81
- $sptxInvoice->customerIdentifier = Mage::getStoreConfig ( 'speedtax/speedtax/username' );
82
-
83
- foreach ( $mageOrderInvoice->getAllItems() as $mageItem ) {
84
- if(!$mageItem->getTaxAmount() || $mageItem->getTaxAmount() <= 0.0){
85
- continue;
86
- }
87
- $lineItem = new stdClass();
88
- $lineItem->productCode = $this->_getProductCode($mageItem);
89
- $lineItem->customReference = $mageItem->getOrderItemId(); //This is during invoice creation, no ID available
90
- $lineItem->quantity = $mageItem->getQty();
91
- $lineItem->shipFromAddress = $this->_getShipFromAddress();
92
- $lineItem->shipToAddress = $this->_getShippingToAddress($mageOrderAddress); //Note, address type is validated at the entry point 'queryQuoteAddress'
93
-
94
- //Price of row total, not unit price
95
- $lineItemPrice = new stdClass();
96
- $lineItemPrice->decimalValue = $mageItem->getRowTotal() - $mageItem->getDiscountAmount();
97
- $lineItem->salesAmount = $lineItemPrice;
98
-
99
- $lineItem->lineItemNumber = count( $sptxInvoice->lineItems );
100
- $sptxInvoice->lineItems[] = $lineItem;
101
- }
102
-
103
- // ----- Other line items ----- //
104
- //If global store config specifies: "tax_shipping", then create shipping cost line item. Note this is different from "Tax_Shipping" tax class of a product
105
- if($mageOrderInvoice->getShippingAmount() === null){
106
- $mageOrderInvoice->collectTotals();
107
- }
108
- $shipingAmount = $mageOrderInvoice->getShippingAmount();
109
- if(!!Mage::getStoreConfig("speedtax/speedtax/tax_shipping") && $shipingAmount > 0.0){
110
- $shippingLineItem = $this->_generateLineItemFromShippingCost($mageOrderAddress, $shipingAmount);
111
- $shippingLineItem->lineItemNumber = count( $sptxInvoice->lineItems );
112
- $sptxInvoice->lineItems[] = $shippingLineItem;
113
- }
114
-
115
- $sptxInvoice->invoiceDate = date('Y-m-d H:i:s');
116
- return $sptxInvoice;
117
- }
118
-
119
- public function prepareSpeedTaxInvoiceByMageOrderCreditmemo(Mage_Sales_Model_Order_Creditmemo $mageOrderCreditmemo) {
120
- //Clear the invoice number so that the request is just a query
121
- $mageOrderAddress = $mageOrderCreditmemo->getShippingAddress();
122
- $sptxInvoice = new stdClass();
123
- //Important to keep unique, credit memo not yet attached to the order, count ++ so that it starts from 1
124
- $sptxInvoice->invoiceNumber =
125
- $mageOrderCreditmemo->getOrder()->getIncrementId()
126
- . '-CR-' . ($mageOrderCreditmemo->getOrder()->getCreditmemosCollection()->count() + 1);
127
- $sptxInvoice->customerIdentifier = Mage::getStoreConfig ( 'speedtax/speedtax/username' );
128
-
129
- foreach ( $mageOrderCreditmemo->getAllItems() as $mageItem ) {
130
- if(!$mageItem->getTaxAmount() || $mageItem->getTaxAmount() <= 0.0){
131
- continue;
132
- }
133
- $lineItem = new stdClass();
134
- $lineItem->productCode = $this->_getProductCode($mageItem);
135
- $lineItem->customReference = $mageItem->getOrderItemId(); //This is during credit memo creation, no ID available
136
- $lineItem->quantity = $mageItem->getQty();
137
- $lineItem->shipFromAddress = $this->_getShipFromAddress();
138
- $lineItem->shipToAddress = $this->_getShippingToAddress($mageOrderAddress); //Note, address type is validated at the entry point 'queryQuoteAddress'
139
-
140
- //Price of row total, not unit price
141
- $lineItemPrice = new stdClass();
142
- $lineItemPrice->decimalValue = $mageItem->getRowTotal() - $mageItem->getDiscountAmount();
143
- $lineItem->salesAmount = $lineItemPrice;
144
-
145
- $lineItem->lineItemNumber = count( $sptxInvoice->lineItems );
146
- $sptxInvoice->lineItems[] = $lineItem;
147
- }
148
-
149
- // ----- Other line items ----- //
150
- //If global store config specifies: "tax_shipping", then create shipping cost line item. Note this is different from "Tax_Shipping" tax class of a product
151
- if($mageOrderCreditmemo->getShippingAmount() === null){
152
- $mageOrderCreditmemo->collectTotals();
153
- }
154
- $shipingAmount = $mageOrderCreditmemo->getShippingAmount();
155
- if(!!Mage::getStoreConfig("speedtax/speedtax/tax_shipping") && $shipingAmount > 0.0){
156
- $shippingLineItem = $this->_generateLineItemFromShippingCost($mageOrderAddress, $shipingAmount);
157
- $shippingLineItem->lineItemNumber = count( $sptxInvoice->lineItems );
158
- $sptxInvoice->lineItems[] = $shippingLineItem;
159
- }
160
-
161
- $sptxInvoice->invoiceDate = date('Y-m-d H:i:s');
162
- return $sptxInvoice;
163
- }
164
-
165
- // ========================== Utilities ========================== //
166
- protected function _generateLineItemFromShippingCost($mageAddress, $shipingAmount) {
167
- $shippingLineItem = new stdClass();
168
- $shippingLineItem->productCode = self::TAX_SHIPPING_LINEITEM_TAX_CLASS;
169
- $shippingLineItem->customReference = self::TAX_SHIPPING_LINEITEM_REFERNCE_NAME;
170
- $shippingLineItem->quantity = 1;
171
- $shippingLineItem->shipFromAddress = $this->_getShipFromAddress ();
172
- $shippingLineItem->shipToAddress = $this->_getShippingToAddress ($mageAddress); //Note, address type is validated at the entry point 'queryQuoteAddress'
173
-
174
- $shippingPrice = new stdClass();
175
- $shippingPrice->decimalValue = $shipingAmount;
176
- $shippingLineItem->salesAmount = $shippingPrice;
177
-
178
- return $shippingLineItem;
179
- }
180
-
181
- //Shipping Origin Address
182
- protected function _getShipFromAddress() {
183
- if($this->_shipFromAddress === null){
184
- $this->_shipFromAddress = new stdClass();
185
- $countryId = Mage::getStoreConfig ( 'shipping/origin/country_id');
186
- $zip = Mage::getStoreConfig ('shipping/origin/postcode');
187
- $regionId = Mage::getStoreConfig ( 'shipping/origin/region_id');
188
- $state = Mage::getModel('directory/region')->load($regionId)->getName();
189
- $city = Mage::getStoreConfig ('shipping/origin/city');
190
- $street = Mage::getStoreConfig ('shipping/origin/street');
191
-
192
- $this->_shipFromAddress->address1 = $street;
193
- $this->_shipFromAddress->address2 = $city . ", " . $state . " " . $zip; //. ", " . $countryId;
194
- }
195
- return $this->_shipFromAddress;
196
- }
197
-
198
- //Shipping Destination Address
199
- protected function _getShippingToAddress($address) {
200
- if($this->_shipToAddress === null){
201
- $this->_shipToAddress = new stdClass();
202
- $country = $address->getCountry();
203
- $zip = $address->getPostcode(); //$zip = preg_replace('/[^0-9\-]*/', '', $address->getPostcode()); //US zip code clean up
204
- $state = $address->getRegion(); //No region resolution needed, $this->_getStateCodeByRegionId($address->getState());
205
- $city = $address->getCity();
206
- $street = implode(' ', $address->getStreet()); //In case of multiple line address
207
-
208
- $this->_shipToAddress->address1 = $street;
209
- $this->_shipToAddress->address2 = $city . ", " . $state . " " . $zip; //. ", " . $country;
210
- }
211
- return $this->_shipToAddress;
212
- }
213
-
214
-
215
- //In a standard setup, tax is calculated by tax class (i.e. product code), if empty use default
216
- //Advanced calculation by product SKU is also possible. Please contact SpeedTax support to setup advanced service
217
- protected function _getProductCode($item){
218
- $useTaxCode = Mage::helper('speedtax')->useTaxClass();
219
- if(!$useTaxCode){
220
- return $item->getSku();
221
- }
222
- if($taxCode = $this->_getTaxClassByItem($item)){
223
- return $taxCode;
224
- }else{
225
- return $item->getSku();
226
- }
227
- }
228
-
229
- protected function _getTaxClassByItem($item){
230
- $storeId = Mage::app()->getStore()->getId();
231
- $taxClassId = Mage::getResourceModel('catalog/product')->getAttributeRawValue($item->getProductId(), 'tax_class_id', $storeId);
232
- if($taxClassId){
233
- $taxClassCode = Mage::getModel('tax/class_source_product')->getOptionText($taxClassId);
234
- }else{
235
- $taxClassCode = null;
236
- }
237
- return $taxClassCode;
238
- }
239
-
240
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Helper/Connector/Speedtax.php DELETED
@@ -1,182 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- class Harapartners_SpeedTax_Helper_Connector_Speedtax extends Harapartners_ConnectorHub_Helper_Connector_Core {
14
-
15
- const REQUEST_ACTION_CALCULATE_INVOICE = 'CalculateInvoice';
16
- const REQUEST_ACTION_POST_INVOICE = 'PostInvoice';
17
- const REQUEST_ACTION_POST_CREDITMEMO = 'PostCreditmemo';
18
- const REQUEST_ACTION_VOID_INVOICE = 'VoidInvoice';
19
- const REQUEST_ACTION_BATCH_VOID_INVOICES = 'BatchVoidInvoices';
20
-
21
- const RESPONSE_TYPE_SUCCESS = 'SUCCESS';
22
- const RESPONSE_TYPE_FAILED_WITH_ERRORS = 'FAILED_WITH_ERRORS';
23
- const RESPONSE_TYPE_FAILED_INVOICE_NUMBER = 'FAILED_INVOICE_NUMBER';
24
-
25
- protected $_serviceType = 'speedtax';
26
-
27
- // ======================= Essential overrides ======================= //
28
- public function getServiceMode(){
29
- $serviceMode = Harapartners_ConnectorHub_Helper_Connector_Core::REQUEST_SERVICE_MODE_PRODUCTION;
30
- if(!!Mage::getStoreConfig($this->_getConfigDataBasePath('is_test_mode'))){
31
- $serviceMode = Harapartners_ConnectorHub_Helper_Connector_Core::REQUEST_SERVICE_MODE_TEST;
32
- }
33
- return $serviceMode;
34
- }
35
-
36
- protected function _getConnectorHubUrl(){
37
- return $this->_getConnectorHubRootUrl() . 'SpeedTax.php';
38
- }
39
-
40
- protected function _getConfigDataBasePath($key){
41
- return 'speedtax/speedtax/' . $key;
42
- }
43
-
44
- protected function _prepareCredentials(){
45
- $username = Mage::getStoreConfig($this->_getConfigDataBasePath('username'));
46
- $password = Mage::getStoreConfig($this->_getConfigDataBasePath('password'));
47
- $password = Mage::helper('core')->decrypt($password);
48
-
49
- $companyCode = Mage::getStoreConfig($this->_getConfigDataBasePath('company_code'));
50
- $isTestMode = Mage::getStoreConfig($this->_getConfigDataBasePath('is_test_mode'));
51
-
52
- $credentials = array(
53
- 'username' => $username,
54
- 'password' => $password,
55
- 'company_code' => $companyCode,
56
- 'is_test_mode' => $isTestMode
57
- );
58
- return $credentials;
59
- }
60
-
61
- // ====================== Requests ====================== //
62
- public function calculateInvoiceRequest($sptxInvoice){
63
- $response = $this->_doInvoiceRequest($sptxInvoice, self::REQUEST_ACTION_CALCULATE_INVOICE);
64
- return $response->data->result;
65
- }
66
-
67
- public function postInvoiceRequest($sptxInvoice){
68
- $response = $this->_doInvoiceRequest($sptxInvoice, self::REQUEST_ACTION_POST_INVOICE);
69
- return $response->data->result;
70
- }
71
-
72
- public function postCreditmemoRequest($sptxInvoice){
73
- $response = $this->_doInvoiceRequest($sptxInvoice, self::REQUEST_ACTION_POST_CREDITMEMO);
74
- return $response->data->result;
75
- }
76
-
77
- public function cancelAllOrderTransactions($invoiceNumbers){
78
- $credentials = $this->_prepareCredentials();
79
- $request = array(
80
- 'meta' => array(
81
- 'action' => $actionType
82
- ),
83
- 'data' => array(
84
- 'credentials' => $credentials,
85
- 'invoice' => $sptxInvoice
86
- )
87
- );
88
-
89
- $response = $this->_processRequest($request);
90
-
91
- //Essential validation!
92
- if(!$response->data || !$response->data->result){
93
- Mage::throwException('Invalid tax response');
94
- }
95
- $responseResult = $response->data->result;
96
- switch ($responseResult->resultType) {
97
- case self::RESPONSE_TYPE_SUCCESS:
98
- break;
99
- case self::RESPONSE_TYPE_FAILED_WITH_ERRORS:
100
- case self::RESPONSE_TYPE_FAILED_INVOICE_NUMBER:
101
- default :
102
- Mage::throwException('Tax request failed');
103
- break;
104
- }
105
-
106
- return $response;
107
- }
108
-
109
- protected function _doInvoiceRequest($sptxInvoice, $actionType){
110
- $credentials = $this->_prepareCredentials();
111
- $request = array(
112
- 'meta' => array(
113
- 'action' => $actionType
114
- ),
115
- 'data' => array(
116
- 'credentials' => $credentials,
117
- 'invoice' => $sptxInvoice
118
- )
119
- );
120
-
121
- $response = $this->_loadCachedInvoiceResponse($sptxInvoice, $actionType);
122
- if(!$response){
123
- $response = $this->_processRequest($request);
124
- $this->_saveCachedInvoiceResponse($response, $sptxInvoice, $actionType);
125
- }
126
-
127
- //Essential validation!
128
- if(!$response->data || !$response->data->result){
129
- Mage::throwException('Invalid tax response');
130
- }
131
- $responseResult = $response->data->result;
132
- switch ($responseResult->resultType) {
133
- case self::RESPONSE_TYPE_SUCCESS:
134
- break;
135
- case self::RESPONSE_TYPE_FAILED_WITH_ERRORS:
136
- case self::RESPONSE_TYPE_FAILED_INVOICE_NUMBER:
137
- default :
138
- Mage::throwException('Tax request failed');
139
- break;
140
- }
141
-
142
- return $response;
143
- }
144
-
145
- protected function _loadCachedInvoiceResponse($sptxInvoice, $actionType){
146
- if(!$this->_isCacheRequestAllowed($actionType)){
147
- return false;
148
- }
149
- $sptxInvoiceCacheKey = $this->_generateInvoiceCacheKey($sptxInvoice);
150
- $response = Mage::getSingleton('speedtax/session')->loadCachedResponse($sptxInvoiceCacheKey);
151
- return $response;
152
- }
153
-
154
- protected function _saveCachedInvoiceResponse($response, $sptxInvoice, $actionType){
155
- if(!$this->_isCacheRequestAllowed($actionType)){
156
- return false;
157
- }
158
- $sptxInvoiceCacheKey = $this->_generateInvoiceCacheKey($sptxInvoice);
159
- $response = Mage::getSingleton('speedtax/session')->saveCachedResponse($sptxInvoiceCacheKey, $response);
160
- return true;
161
- }
162
-
163
- protected function _isCacheRequestAllowed($actionType){
164
- $allRequestCache = false;
165
- switch($actionType){
166
- case self::REQUEST_ACTION_CALCULATE_INVOICE:
167
- $allRequestCache = true;
168
- break;
169
- default:
170
- $allRequestCache = false;
171
- break;
172
- }
173
- return $allRequestCache;
174
- }
175
-
176
- protected function _generateInvoiceCacheKey($sptxInvoice){
177
- $sptxInvoice = clone $sptxInvoice;
178
- $sptxInvoice->invoiceDate = null;
179
- return md5(json_encode($sptxInvoice));
180
- }
181
-
182
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Helper/Data.php DELETED
@@ -1,30 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- class Harapartners_SpeedTax_Helper_Data extends Mage_Core_Helper_Abstract {
14
-
15
- protected $_xmlPathPrefix = 'speedtax/speedtax/';
16
-
17
- // =========================== config and essential flags =========================== //
18
- public function isSpeedTaxEnabled(){
19
- return Mage::getStoreConfig ( $this->_xmlPathPrefix . 'is_enabled' );
20
- }
21
-
22
- public function useTaxClass(){
23
- return Mage::getStoreConfig ( $this->_xmlPathPrefix . 'customized_tax_class' );
24
- }
25
-
26
- public function isAddressValidationOn($address, $storeId) {
27
- return Mage::getStoreConfig( $this->_xmlPathPrefix . 'validate_address', $storeId);
28
- }
29
-
30
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Helper/Processor.php DELETED
@@ -1,190 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * NOTICE OF LICENSE
5
- *
6
- * This source file is subject to the End User Software Agreement (EULA).
7
- * It is also available through the world-wide-web at this URL:
8
- * http://www.harapartners.com/license [^]
9
- * If you did not receive a copy of the license and are unable to
10
- * obtain it through the world-wide-web, please send an email
11
- * to eula@harapartners.com so we can send you a copy immediately.
12
- *
13
- */
14
-
15
- class Harapartners_SpeedTax_Helper_Processor extends Mage_Core_Helper_Abstract {
16
-
17
- const SPEEDTAX_INVOICE_STATUS_PENDING = 0;
18
- const SPEEDTAX_INVOICE_STATUS_POSTED = 100;
19
- const SPEEDTAX_INVOICE_STATUS_VOID = 200;
20
- const SPEEDTAX_INVOICE_STATUS_ERROR = 300;
21
-
22
- // ========================== Actions ========================== //
23
- public function queryQuoteAddress(Mage_Sales_Model_Quote_Address $mageQuoteAddress){
24
- if (!$this->_isTaxable($mageQuoteAddress)){
25
- return false;
26
- }
27
- $sptxInvoice = Mage::helper('speedtax/connector_data')->prepareSpeedTaxInvoiceByMageQuoteAddress($mageQuoteAddress);
28
- if(!$sptxInvoice|| !$sptxInvoice->lineItems){
29
- return false;
30
- }
31
- $responseResult = Mage::helper('speedtax/connector_speedtax')->calculateInvoiceRequest($sptxInvoice);
32
- $this->_applyResponseToQuote($responseResult, $mageQuoteAddress);
33
- return $responseResult;
34
- }
35
-
36
- public function postOrderInvoice(Mage_Sales_Model_Order_Invoice $mageOrderInvoice){
37
- if(!!$mageOrderInvoice->getData('speedtax_transaction_id')){
38
- Mage::throwException('This invoice was already posted through SalesTax.');
39
- }
40
-
41
- $sptxInvoice = Mage::helper('speedtax/connector_data')->prepareSpeedTaxInvoiceByMageOrderInvoice($mageOrderInvoice);
42
- if(!$sptxInvoice || !$sptxInvoice->lineItems){
43
- return false;
44
- }
45
- //No caching allowed for order invoice
46
- $responseResult = Mage::helper('speedtax/connector_speedtax')->postInvoiceRequest($sptxInvoice);
47
- $this->_applyResponseToInvoice($responseResult, $mageOrderInvoice);
48
-
49
- return $responseResult;
50
- }
51
-
52
- public function postOrderCreditmemo(Mage_Sales_Model_Order_Creditmemo $mageOrderCreditmemo) {
53
- if(!!$mageOrderCreditmemo->getData('speedtax_transaction_id')){
54
- Mage::throwException('This credit memo was already posted through SalesTax.');
55
- }
56
-
57
- $sptxInvoice = Mage::helper('speedtax/connector_data')->prepareSpeedTaxInvoiceByMageOrderCreditmemo($mageOrderCreditmemo);
58
- if(!$sptxInvoice || !$sptxInvoice->lineItems){
59
- return false;
60
- }
61
- //No caching allowed for order invoice
62
- $responseResult = Mage::helper('speedtax/connector_speedtax')->postCreditmemoRequest($sptxInvoice);
63
- $this->_applyResponseToCreditmemo($responseResult, $mageOrderCreditmemo);
64
-
65
- return $responseResult;
66
- }
67
-
68
- public function cancelAllOrderTransactions(Mage_Sales_Model_Order $mageOrder) {
69
- $invoiceNumbers = array();
70
- $updateObjectArray = array();
71
- foreach($mageOrder->getInvoiceCollection() as $mageOrderInvoice){
72
- if(!!$mageOrderInvoice->getData('speedtax_invoice_number')
73
- && $mageOrderInvoice->getData('speedtax_invoice_status') == self::SPEEDTAX_INVOICE_STATUS_POSTED ){
74
- $invoiceNumbers[] = $mageOrderInvoice->getData('speedtax_invoice_number');
75
- $updateObjectArray[$mageOrderInvoice->getData('speedtax_invoice_number')] = $mageOrderInvoice;
76
- }
77
- }
78
- foreach($mageOrder->getCreditmemosCollection() as $mageOrderCreditmemo){
79
- if(!!$mageOrderCreditmemo->getData('speedtax_invoice_number')
80
- && $mageOrderCreditmemo->getData('speedtax_invoice_status') == self::SPEEDTAX_INVOICE_STATUS_POSTED ){
81
- $invoiceNumbers[] = $mageOrderCreditmemo->getData('speedtax_invoice_number');
82
- $updateObjectArray[$mageOrderCreditmemo->getData('speedtax_invoice_number')] = $mageOrderCreditmemo;
83
- }
84
- }
85
-
86
- if(!$invoiceNumbers){
87
- return false;
88
- }
89
- //No caching allowed for order invoice
90
- $responseResult = Mage::helper('speedtax/connector_speedtax')->cancelAllOrderTransactions($invoiceNumbers);
91
-
92
- //Update status
93
- $batchVoidResults = json_decode($responseResult->data->result->batchVoidResults, 1);
94
- foreach($batchVoidResults as $invoiceNumber => $voidResult){
95
- $updateObject = $updateObjectArray[$invoiceNumber];
96
- if($voidResult == Harapartners_SpeedTax_Helper_Connector_Speedtax::RESPONSE_TYPE_SUCCESS){
97
- $updateObject->setData('speedtax_invoice_status', self::SPEEDTAX_INVOICE_STATUS_VOID);
98
- }else{
99
- $updateObject->setData('speedtax_invoice_status', self::SPEEDTAX_INVOICE_STATUS_ERROR);
100
- }
101
- $updateObject->save();
102
- }
103
-
104
- return $responseResult;
105
- }
106
-
107
-
108
- // ========================== Utility Functions ========================== //
109
- //Mage_Sales_Model_Quote_Address or Mage_Sales_Model_Order_Address
110
- protected function _isTaxable($mageAddress) {
111
- //$mageAddress can be quote of order address, or null for virtual product
112
- if(!($mageAddress instanceof Varien_Object)
113
- || $mageAddress->getAddressType() != Mage_Sales_Model_Quote_Address::TYPE_SHIPPING
114
- ){
115
- return false;
116
- }
117
- //Nexus test
118
- $originsString = Mage::getStoreConfig('speedtax/speedtax/origins');
119
- return in_array($mageAddress->getRegionId(), explode(',', $originsString));
120
- }
121
-
122
- //Mage_Sales_Model_Quote_Address ONLY
123
- protected function _applyResponseToQuote($responseResult, Mage_Sales_Model_Quote_Address $mageQuoteAddress){
124
- foreach ( $mageQuoteAddress->getAllItems() as $mageQuoteItem ) {
125
- $taxAmount = $this->_getLineItemTaxAmountByItemId($responseResult, $mageQuoteItem->getId());
126
- $mageQuoteItem->setTaxAmount($taxAmount);
127
- $mageQuoteItem->setBaseTaxAmount($taxAmount);
128
- if(($mageQuoteItem->getRowTotal() - $mageQuoteItem->getDiscountAmount()) > 0){
129
- $mageQuoteItem->setTaxPercent (sprintf("%.4f", 100*$taxAmount/($mageQuoteItem->getRowTotal() - $mageQuoteItem->getDiscountAmount())));
130
- }
131
- }
132
- if(!!$this->_getTaxShippingAmount($responseResult)){
133
- $taxShippingAmount = $this->_getTaxShippingAmount($responseResult);
134
- $mageQuoteAddress->setShippingTaxAmount($taxShippingAmount);
135
- $mageQuoteAddress->setBaseShippingTaxAmount($taxShippingAmount);
136
- }
137
- return;
138
- }
139
-
140
- protected function _applyResponseToInvoice($responseResult, Mage_Sales_Model_Order_Invoice $mageOrderInvoice){
141
- $mageOrderInvoice->setData('speedtax_transaction_id', $responseResult->transactionId);
142
- $mageOrderInvoice->setData('speedtax_invoice_number', $responseResult->invoiceNumber);
143
- $mageOrderInvoice->setData('speedtax_invoice_status', self::SPEEDTAX_INVOICE_STATUS_POSTED);
144
- $mageOrderInvoice->save();
145
- return;
146
- }
147
-
148
- protected function _applyResponseToCreditmemo($responseResult, Mage_Sales_Model_Order_Creditmemo $mageOrderCreditmemo){
149
- $mageOrderCreditmemo->setData('speedtax_transaction_id', $responseResult->transactionId);
150
- $mageOrderCreditmemo->setData('speedtax_invoice_number', $responseResult->invoiceNumber);
151
- $mageOrderCreditmemo->setData('speedtax_invoice_status', self::SPEEDTAX_INVOICE_STATUS_POSTED);
152
- $mageOrderCreditmemo->save();
153
- return;
154
- }
155
-
156
- public function getTotalTax($responseResult) {
157
- return $responseResult->totalTax->decimalValue;
158
- }
159
-
160
- protected function _getLineItemTaxAmountByItemId($responseResult, $itemId) {
161
- foreach($responseResult->lineItemBundles->lineItems as $responseLineItem){
162
- if($responseLineItem->customReference == $itemId){
163
- return $responseLineItem->taxAmount->decimalValue;
164
- }
165
- }
166
- return 0.0;
167
- }
168
-
169
- protected function _getTaxShippingAmount() {
170
- foreach($responseResult->lineItemBundles->lineItems as $responseLineItem){
171
- if($responseLineItem->productCode == self::TAX_SHIPPING_LINEITEM_TAX_CLASS){
172
- return $responseLineItem->taxAmount->decimalValue;
173
- }
174
- }
175
- return 0.0;
176
- }
177
-
178
-
179
- //Adds a comment to order history. Method choosen based on Magento version.
180
- // protected function _addStatusHistoryComment($order, $comment) {
181
- // if(method_exists($order, 'addStatusHistoryComment')) {
182
- // $order->addStatusHistoryComment($comment)->save();;
183
- // } elseif(method_exists($order, 'addStatusToHistory')) {
184
- // $order->addStatusToHistory($order->getStatus(), $comment, false)->save();;
185
- // }
186
- // return $this;
187
- // }
188
-
189
-
190
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Model/Observer.php DELETED
@@ -1,67 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * NOTICE OF LICENSE
5
- *
6
- * This source file is subject to the End User Software Agreement (EULA).
7
- * It is also available through the world-wide-web at this URL:
8
- * http://www.harapartners.com/license [^]
9
- * If you did not receive a copy of the license and are unable to
10
- * obtain it through the world-wide-web, please send an email
11
- * to eula@harapartners.com so we can send you a copy immediately.
12
- *
13
- */
14
-
15
- class Harapartners_SpeedTax_Model_Observer extends Mage_Core_Model_Abstract {
16
-
17
- public function saleOrderInvoicePay(Varien_Event_Observer $observer) {
18
- if (!Mage::helper('speedtax')->isSpeedTaxEnabled()) {
19
- return;
20
- }
21
- $invoice = $observer->getEvent()->getInvoice();
22
- try {
23
- $processor = Mage::helper('speedtax/processor');
24
- $responseResult = $processor->postOrderInvoice($invoice);
25
- } catch( Exception $e ) {
26
- //Suppress exception so that the transaction is not reverted (payment already processed)
27
- Mage::logException($e);
28
- $maskedErrorMessage = 'There is an error processing tax information.';
29
- Mage::getSingleton('core/session')->addError($maskedErrorMessage);
30
- }
31
- }
32
-
33
- public function salesOrderCreditmemoRefund(Varien_Event_Observer $observer) {
34
- if (!Mage::helper('speedtax')->isSpeedTaxEnabled()) {
35
- return;
36
- }
37
- $creditmemo = $observer->getEvent()->getCreditmemo();
38
- try {
39
- $processor = Mage::helper('speedtax/processor');
40
- $responseResult = $processor->postOrderCreditmemo($creditmemo);
41
- } catch( Exception $e ) {
42
- //Suppress exception so that the transaction is not reverted (payment already processed)
43
- Mage::logException($e);
44
- $maskedErrorMessage = 'There is an error processing tax information.';
45
- Mage::getSingleton('core/session')->addError($maskedErrorMessage);
46
- }
47
- }
48
-
49
- //For manual cancel or order edit related cancellation
50
- public function orderCancelAfter(Varien_Event_Observer $observer) {
51
- if (!Mage::helper('speedtax')->isSpeedTaxEnabled()) {
52
- return;
53
- }
54
- $order = $observer->getEvent()->getOrder();
55
- try {
56
- $processor = Mage::helper('speedtax/processor');
57
- $responseResult = $processor->cancelAllOrderTransactions($order);
58
- } catch( Exception $e ) {
59
- //Suppress exception so that the transaction is not reverted (payment already processed)
60
- Mage::logException($e);
61
- $maskedErrorMessage = 'There is an error processing tax information.';
62
- Mage::getSingleton('core/session')->addError($maskedErrorMessage);
63
- }
64
- }
65
-
66
-
67
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Model/Rewrite/Tax/Sales/Total/Quote/Tax.php DELETED
@@ -1,56 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- class Harapartners_SpeedTax_Model_Rewrite_Tax_Sales_Total_Quote_Tax extends Mage_Tax_Model_Sales_Total_Quote_Tax {
14
-
15
- public function collect(Mage_Sales_Model_Quote_Address $address) {
16
- if (!Mage::helper('speedtax')->isSpeedTaxEnabled()) {
17
- return parent::collect($address);
18
- }
19
-
20
- $store = $address->getQuote()->getStore();
21
- $customer = $address->getQuote()->getCustomer();
22
-
23
- $address->setTotalAmount($this->getCode(), 0);
24
- $address->setBaseTotalAmount($this->getCode(), 0);
25
-
26
- $address->setTaxAmount(0);
27
- $address->setBaseTaxAmount(0);
28
- $address->setShippingTaxAmount(0);
29
- $address->setBaseShippingTaxAmount(0);
30
-
31
- //Init
32
- $this->_setAddress($address);
33
- $this->_setAmount(0);
34
- $this->_setBaseAmount(0);
35
-
36
- try {
37
- $processor = Mage::helper('speedtax/processor');
38
- $responseResult = $processor->queryQuoteAddress($address);
39
- //Address line item amount and shipping tax amount are updated within the query
40
- if (!!$responseResult) {
41
- $taxAmount = $processor->getTotalTax($responseResult);
42
- $this->_addAmount(Mage::app()->getStore()->convertPrice($taxAmount, false));
43
- $this->_addBaseAmount($taxAmount);
44
- }
45
- } catch(Exception $e) {
46
- //Tax collecting is very important, this is within the collect total (cannot bubble exceptions), force a redirect
47
- Mage::logException($e);
48
- $maskedErrorMessage = 'There is an error calculating tax.';
49
- Mage::getSingleton('core/session')->addError($maskedErrorMessage);
50
- throw new Mage_Core_Model_Session_Exception($maskedErrorMessage); //Session exceptions will be redirected to base URL
51
- }
52
-
53
- return $this;
54
- }
55
-
56
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Model/Session.php DELETED
@@ -1,64 +0,0 @@
1
- <?php
2
-
3
- /*
4
- * NOTICE OF LICENSE
5
- *
6
- * This source file is subject to the End User Software Agreement (EULA).
7
- * It is also available through the world-wide-web at this URL:
8
- * http://www.harapartners.com/license [^]
9
- * If you did not receive a copy of the license and are unable to
10
- * obtain it through the world-wide-web, please send an email
11
- * to eula@harapartners.com so we can send you a copy immediately.
12
- *
13
- */
14
-
15
- class Harapartners_SpeedTax_Model_Session extends Mage_Core_Model_Session_Abstract {
16
-
17
- const REQUEST_CACHE_TTL = 600;
18
-
19
- public function __construct() {
20
- $this->init('speedtax');
21
- }
22
-
23
- public function loadCachedResponse($sptxInvoiceCacheKey){
24
- $cacheStorage = $this->getData('cache_storage');
25
- if(!isset($cacheStorage[$sptxInvoiceCacheKey])){
26
- return false;
27
- }
28
- $cacheEntry = $cacheStorage[$sptxInvoiceCacheKey];
29
- if($this->_isCacheEntryValid($cacheEntry)){
30
- return json_decode($cacheEntry['response_json']);
31
- }
32
- return false;
33
- }
34
-
35
- public function saveCachedResponse($sptxInvoiceCacheKey, $response){
36
- $cacheStorage = $this->getData('cache_storage');
37
- if(!$cacheStorage){
38
- $cacheStorage = array();
39
- }
40
- $cacheStorage[$sptxInvoiceCacheKey] = array(
41
- 'timestamp' => time(),
42
- 'response_json' => json_encode($response)
43
- );
44
- $cacheStorage = $this->_clearExpiredEnties($cacheStorage);
45
- $this->setData('cache_storage', $cacheStorage);
46
- return true;
47
- }
48
-
49
- protected function _clearExpiredEnties($cacheStorage){
50
- foreach($cacheStorage as $sptxInvoiceCacheKey => $cacheEntry){
51
- if(!$this->_isCacheEntryValid($cacheEntry)){
52
- unset($cacheStorage[$sptxInvoiceCacheKey]);
53
- }
54
- }
55
- return $cacheStorage;
56
- }
57
-
58
- protected function _isCacheEntryValid($cacheEntry){
59
- return isset($cacheEntry['timestamp'])
60
- && $cacheEntry['timestamp'] + self::REQUEST_CACHE_TTL > time()
61
- && isset($cacheEntry['response_json']);
62
- }
63
-
64
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/Model/Source/Usregions.php DELETED
@@ -1,35 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- class Harapartners_Speedtax_Model_Source_Usregions
14
- {
15
- protected $_options;
16
-
17
- public function toOptionArray($isMultiselect=false)
18
- {
19
- if (!$this->_options) {
20
- $regionCollection = Mage::getModel( 'directory/region' )->getCollection();
21
- $regionCollection->getSelect()->where( 'country_id = ?', 'US' );
22
- $regionOptions = array();
23
- foreach( $regionCollection as $region ) {
24
- $regionOptions[] = array( 'label' => $region->getDefaultName(), 'value' => $region->getId() );
25
- }
26
- $this->_options = $regionOptions;
27
- }
28
- $options = $this->_options;
29
- if(!$isMultiselect){
30
- array_unshift($options, array('value'=>'', 'label'=>''));
31
- }
32
-
33
- return $options;
34
- }
35
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/controllers/Adminhtml/System/Config/AjaxController.php DELETED
@@ -1,55 +0,0 @@
1
- <?php
2
- /**
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- */
12
-
13
- class Harapartners_SpeedTax_Adminhtml_System_Config_AjaxController extends Mage_Adminhtml_Controller_Action {
14
-
15
- public function authenticationAction() {
16
-
17
- try{
18
- $username = $this->getRequest()->getParam('username');
19
- $password = $this->getRequest()->getParam('password');
20
- $companyCode = $this->getRequest()->getParam('company_code');
21
- $isTestMode = $this->getRequest()->getParam('is_test_mode');
22
- //Check encrypted config
23
- if (preg_match('/^\*+$/', $password)) {
24
- $password = Mage::helper('core')->decrypt(Mage::getStoreConfig('speedtax/speedtax/password'));
25
- }
26
- $credentials = array(
27
- 'username' => $username,
28
- 'password' => $password,
29
- 'company_code' => $companyCode,
30
- 'is_test_mode' => $isTestMode
31
- );
32
-
33
- //auth_token and data_token are handled within
34
- $result = Mage::helper ('speedtax/connector_speedtax')->authenticationRequest($credentials);
35
-
36
- }catch(Exception $e){
37
- $errorMessage = $e->getMessage();
38
- if(!$errorMessage){
39
- $errorMessage = 'Connection failed.';
40
- }
41
- echo json_encode(array(
42
- 'status' => 0,
43
- 'message' => $errorMessage
44
- )); //Json error
45
- exit;
46
- }
47
- //Need to send $websiteResultJson, the store config is still the cache value, not our new value
48
- echo json_encode(array(
49
- 'status' => 1,
50
- 'message' => 'Successful! Please save your configuration'
51
- )); //Json success
52
- exit;
53
- }
54
-
55
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/etc/config.xml DELETED
@@ -1,146 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!--
3
- /*
4
- * NOTICE OF LICENSE
5
- *
6
- * This source file is subject to the End User Software Agreement (EULA).
7
- * It is also available through the world-wide-web at this URL:
8
- * http://www.harapartners.com/license
9
- * If you did not receive a copy of the license and are unable to
10
- * obtain it through the world-wide-web, please send an email
11
- * to eula@harapartners.com so we can send you a copy immediately.
12
- *
13
- */
14
- -->
15
- <config>
16
- <modules>
17
- <Harapartners_SpeedTax>
18
- <version>3.1.0</version>
19
- </Harapartners_SpeedTax>
20
- </modules>
21
- <global>
22
- <blocks>
23
- <speedtax>
24
- <class>Harapartners_SpeedTax_Block</class>
25
- </speedtax>
26
- </blocks>
27
- <models>
28
- <speedtax>
29
- <class>Harapartners_SpeedTax_Model</class>
30
- </speedtax>
31
- <tax>
32
- <rewrite>
33
- <sales_total_quote_tax>Harapartners_SpeedTax_Model_Rewrite_Tax_Sales_Total_Quote_Tax</sales_total_quote_tax>
34
- </rewrite>
35
- </tax>
36
- <paypal>
37
- <rewrite>
38
- <!-- /* Compatibility for Staging server SSL verification */ -->
39
- <config>Harapartners_SpeedTax_Model_Rewrite_Paypal_Config</config>
40
- <api_nvp>Harapartners_SpeedTax_Model_Rewrite_Paypal_Api_Nvp</api_nvp>
41
- </rewrite>
42
- </paypal>
43
- </models>
44
- <helpers>
45
- <speedtax>
46
- <class>Harapartners_SpeedTax_Helper</class>
47
- </speedtax>
48
- </helpers>
49
- <resources>
50
- <speedtax_setup>
51
- <setup>
52
- <module>Harapartners_SpeedTax</module>
53
- </setup>
54
- <connection>
55
- <use>core_setup</use>
56
- </connection>
57
- </speedtax_setup>
58
- </resources>
59
- <events>
60
- <sales_order_invoice_pay>
61
- <observers>
62
- <speedtax>
63
- <type>singleton</type>
64
- <class>speedtax/observer</class>
65
- <method>saleOrderInvoicePay</method>
66
- </speedtax>
67
- </observers>
68
- </sales_order_invoice_pay>
69
- <sales_order_creditmemo_refund>
70
- <observers>
71
- <speedtax>
72
- <type>singleton</type>
73
- <class>speedtax/observer</class>
74
- <method>salesOrderCreditmemoRefund</method>
75
- </speedtax>
76
- </observers>
77
- </sales_order_creditmemo_refund>
78
- <order_cancel_after>
79
- <observers>
80
- <speedtax>
81
- <type>singleton</type>
82
- <class>speedtax/observer</class>
83
- <method>orderCancelAfter</method>
84
- </speedtax>
85
- </observers>
86
- </order_cancel_after>
87
- </events>
88
- </global>
89
- <adminhtml>
90
- <acl>
91
- <resources>
92
- <admin>
93
- <children>
94
- <system>
95
- <children>
96
- <config>
97
- <children>
98
- <speedtax translate="title" module="speedtax">
99
- <title>SpeedTax Configuration</title>
100
- </speedtax>
101
- </children>
102
- </config>
103
- </children>
104
- </system>
105
- </children>
106
- </admin>
107
- </resources>
108
- </acl>
109
- </adminhtml>
110
- <admin>
111
- <routers>
112
- <speedtax_adminhtml>
113
- <use>admin</use>
114
- <args>
115
- <module>Harapartners_SpeedTax_Adminhtml</module>
116
- <frontName>speedtax_adminhtml</frontName>
117
- </args>
118
- </speedtax_adminhtml>
119
- </routers>
120
- </admin>
121
- <default>
122
- <speedtax>
123
- <speedtax>
124
- <action>0</action>
125
- <url>https://www.speedtax.com/</url>
126
- <shipping_sku>Shipping</shipping_sku>
127
- <adjustment_positive_sku>Adjustment</adjustment_positive_sku>
128
- <adjustment_negative_sku>Adjustment</adjustment_negative_sku>
129
- <sales_person_code>Magento</sales_person_code>
130
- <error_full_stop>1</error_full_stop>
131
- <error_frontend_action>2</error_frontend_action>
132
- <error_frontend_message>Unfortunately, we could not calculate tax for your order. Please try again with a different address or contact us to complete your order.</error_frontend_message>
133
- <error_backend_message>There was an error getting tax rates from Speedtax. Please see the error log for details.</error_backend_message>
134
- <error_notification_toolbar>1</error_notification_toolbar>
135
- <onepage_normalize_message>Your shipping address has been modified during our validation process. Please confirm the address to the right is accurate.</onepage_normalize_message>
136
- </speedtax>
137
- </speedtax>
138
- <paypal>
139
- <!-- /* Compatibility for Staging server SSL verification */ -->
140
- <wpp>
141
- <button_source_ec>Hara_SI_MagentoCE_PPA</button_source_ec>
142
- <button_source_dp>Hara_SI_MagentoCE_PPA</button_source_dp>
143
- </wpp>
144
- </paypal>
145
- </default>
146
- </config>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/etc/system.xml DELETED
@@ -1,167 +0,0 @@
1
- <?xml version="1.0"?>
2
- <!--
3
- /*
4
- * NOTICE OF LICENSE
5
- *
6
- * This source file is subject to the End User Software Agreement (EULA).
7
- * It is also available through the world-wide-web at this URL:
8
- * http://www.harapartners.com/license
9
- * If you did not receive a copy of the license and are unable to
10
- * obtain it through the world-wide-web, please send an email
11
- * to eula@harapartners.com so we can send you a copy immediately.
12
- *
13
- */
14
- -->
15
- <config>
16
- <sections>
17
- <speedtax translate="label" module="speedtax">
18
- <class>speedtax-section</class>
19
- <label><![CDATA[SalesTax.com by <br/><img src="https://www.harapartners.com/skin/frontend/enterprise/harapartners/images/hp/HP2.0Logo.png" alt="HaraPartners" width="100" height="20">]]></label>
20
- <header_css>speedtax-header</header_css>
21
- <tab>sales</tab>
22
- <sort_order>304</sort_order>
23
- <show_in_default>1</show_in_default>
24
- <show_in_website>1</show_in_website>
25
- <show_in_store>1</show_in_store>
26
- <groups>
27
- <signup>
28
- <label>Sign up for SalesTax.com</label>
29
- <comment><![CDATA[
30
- <p class="switcher">
31
- Sign up for a <a href="http://harapartners.com/solutions/salestax/30daytrial" target="_blank" style="color: #00C3FF;">Free 30 Day Trial</a>.<br/>
32
- <a href="http://www.harapartners.com/solutions/salestax/signup" target="_blank" style="color: #00C3FF;">Sign up for SalesTax.com to process your Sales Taxes.</a>.<br/>
33
- Call with questions at <b>646-663-5672</b> or find more information under <a href="http://www.harapartners.com/salestax" target="_blank" style="color: #00C3FF;">http://www.harapartners.com/salestax</a>.
34
- </p>
35
- ]]></comment>
36
- <sort_order>0</sort_order>
37
- <show_in_default>1</show_in_default>
38
- <show_in_website>1</show_in_website>
39
- <show_in_store>1</show_in_store>
40
- <expanded>1</expanded>
41
- </signup>
42
- <speedtax>
43
- <label>SalesTax.com Configuration</label>
44
- <sort_order>0</sort_order>
45
- <show_in_default>1</show_in_default>
46
- <show_in_website>1</show_in_website>
47
- <show_in_store>1</show_in_store>
48
- <fields>
49
- <is_enabled translate="label">
50
- <label>Status</label>
51
- <comment>If the Status is set to "Disable", default Magento tax calculations will be used.</comment>
52
- <frontend_type>select</frontend_type>
53
- <source_model>adminhtml/system_config_source_enabledisable</source_model>
54
- <sort_order>100</sort_order>
55
- <show_in_default>1</show_in_default>
56
- <show_in_website>1</show_in_website>
57
- <show_in_store>1</show_in_store>
58
- </is_enabled>
59
- <username translate="label">
60
- <label>Username</label>
61
- <comment>Should have been provided in your sign up email.</comment>
62
- <frontend_type>text</frontend_type>
63
- <sort_order>110</sort_order>
64
- <show_in_default>1</show_in_default>
65
- <show_in_website>1</show_in_website>
66
- <show_in_store>1</show_in_store>
67
- <validate>required-entry</validate>
68
- </username>
69
- <password translate="label">
70
- <label>Password</label>
71
- <comment>Should have been provided in your sign up email.</comment>
72
- <frontend_type>obscure</frontend_type>
73
- <backend_model>adminhtml/system_config_backend_encrypted</backend_model>
74
- <sort_order>115</sort_order>
75
- <show_in_default>1</show_in_default>
76
- <show_in_website>1</show_in_website>
77
- <show_in_store>1</show_in_store>
78
- <validate>required-entry</validate>
79
- </password>
80
- <company_code translate="label">
81
- <label>Company Code</label>
82
- <comment>Should have been provided in your sign up email.</comment>
83
- <frontend_type>text</frontend_type>
84
- <sort_order>120</sort_order>
85
- <show_in_default>1</show_in_default>
86
- <show_in_website>1</show_in_website>
87
- <show_in_store>1</show_in_store>
88
- <validate>required-entry</validate>
89
- </company_code>
90
- <is_test_mode translate="label">
91
- <label>Test Mode</label>
92
- <comment>Switch between test and live modes. Requires a test account and credentials.</comment>
93
- <frontend_type>select</frontend_type>
94
- <source_model>adminhtml/system_config_source_yesno</source_model>
95
- <sort_order>125</sort_order>
96
- <show_in_default>1</show_in_default>
97
- <show_in_website>1</show_in_website>
98
- <show_in_store>1</show_in_store>
99
- </is_test_mode>
100
- <authentication_wizard translate="button_label">
101
- <label></label>
102
- <comment><![CDATA[You <b style="color: red;">must</b> validate your login credentials first and then <b style="color: red;">save</b> the configuration.]]></comment>
103
- <button_label>Validate login credentials</button_label>
104
- <frontend_model>speedtax/adminhtml_system_config_form_field_authentication</frontend_model>
105
- <sort_order>150</sort_order>
106
- <show_in_default>1</show_in_default>
107
- <show_in_website>1</show_in_website>
108
- <show_in_store>0</show_in_store>
109
- </authentication_wizard>
110
- <tax_shipping translate="label">
111
- <label>Calculate Taxes On Shipping</label>
112
- <comment>This will send a line item for SHIPPING to be taxed.</comment>
113
- <frontend_type>select</frontend_type>
114
- <source_model>adminhtml/system_config_source_enabledisable</source_model>
115
- <sort_order>311</sort_order>
116
- <show_in_default>1</show_in_default>
117
- <show_in_website>1</show_in_website>
118
- <show_in_store>1</show_in_store>
119
- </tax_shipping>
120
- <origins translate="label">
121
- <label>Nexus</label>
122
- <comment><![CDATA[Multiple-select. Select all states where you have nexus and want sales taxes to be used for.]]></comment>
123
- <frontend_type>multiselect</frontend_type>
124
- <sort_order>350</sort_order>
125
- <source_model>speedtax/source_usregions</source_model>
126
- <show_in_default>1</show_in_default>
127
- <show_in_website>1</show_in_website>
128
- <show_in_store>0</show_in_store>
129
- <validate>required-entry</validate>
130
- </origins>
131
- </fields>
132
- </speedtax>
133
- <help_extra>
134
- <label>SalesTax.com Help</label>
135
- <comment><![CDATA[
136
- <p class="switcher">
137
- Get help with configuring and setting up the SalesTax.com module at <a href="http://www.harapartners.com/salestax/help#configuration" target="_blank" style="color: #00C3FF;">http://www.harapartners.com/salestax/help#configuration</a>.<br/>
138
- Find more information at <a href="http://www.harapartners.com/salestax/help" target="_blank" style="color: #00C3FF;">http://www.harapartners.com/salestax/help</a>.<br/>
139
- Learn more about the SalesTax.com solution, additional features, updates and help at <a href="http://www.harapartners.com/salestax" target="_blank" style="color: #00C3FF;">http://www.harapartners.com/salestax</a>.
140
- </p>
141
- ]]></comment>
142
- <sort_order>100</sort_order>
143
- <show_in_default>1</show_in_default>
144
- <show_in_website>1</show_in_website>
145
- <show_in_store>1</show_in_store>
146
- <expanded>1</expanded>
147
- </help_extra>
148
- </groups>
149
- </speedtax>
150
- <shipping>
151
- <groups>
152
- <origin>
153
- <fields>
154
- <street translate="label">
155
- <label><![CDATA[Number & Street]]></label>
156
- <frontend_type>text</frontend_type>
157
- <sort_order>99</sort_order>
158
- <show_in_default>1</show_in_default>
159
- <show_in_website>1</show_in_website>
160
- <show_in_store>1</show_in_store>
161
- </street>
162
- </fields>
163
- </origin>
164
- </groups>
165
- </shipping>
166
- </sections>
167
- </config>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
app/code/local/Harapartners/SpeedTax/sql/speedtax_setup/mysql4-upgrade-3.0.9-3.1.0.php DELETED
@@ -1,126 +0,0 @@
1
- <?php
2
- /*
3
- * NOTICE OF LICENSE
4
- *
5
- * This source file is subject to the End User Software Agreement (EULA).
6
- * It is also available through the world-wide-web at this URL:
7
- * http://www.harapartners.com/license [^]
8
- * If you did not receive a copy of the license and are unable to
9
- * obtain it through the world-wide-web, please send an email
10
- * to eula@harapartners.com so we can send you a copy immediately.
11
- *
12
- */
13
- $installer = $this;
14
- $installer->startSetup();
15
-
16
- $speedTaxTransactionIdColumnName = 'speedtax_transaction_id';
17
- $speedtaxInvoiceNumberColumnName = 'speedtax_invoice_number';
18
- $speedtaxInvoiceStatusColumnName = 'speedtax_invoice_status';
19
- $connectionConfig = $installer->getConnection()->getConfig();
20
-
21
- // ================ Invoice ================ //
22
- $testQuery = "
23
- SELECT * FROM information_schema.COLUMNS
24
- WHERE column_name='$speedtaxInvoiceNumberColumnName'
25
- AND table_name='{$this->getTable('sales/invoice')}'
26
- AND table_schema='{$connectionConfig['dbname']}'
27
- ";
28
- if(!!$installer->getConnection()->fetchAll($testQuery)){
29
- $installer->run("
30
- ALTER TABLE `{$this->getTable('sales/invoice')}`
31
- DROP COLUMN `$speedtaxInvoiceNumberColumnName`;
32
- ");
33
- }
34
- $installer->run("
35
- ALTER TABLE `{$this->getTable('sales/invoice')}`
36
- ADD COLUMN `$speedtaxInvoiceNumberColumnName` varchar(255);
37
- ");
38
-
39
- $testQuery = "
40
- SELECT * FROM information_schema.COLUMNS
41
- WHERE column_name='$speedtaxInvoiceStatusColumnName'
42
- AND table_name='{$this->getTable('sales/invoice')}'
43
- AND table_schema='{$connectionConfig['dbname']}'
44
- ";
45
- if(!!$installer->getConnection()->fetchAll($testQuery)){
46
- $installer->run("
47
- ALTER TABLE `{$this->getTable('sales/invoice')}`
48
- DROP COLUMN `$speedtaxInvoiceStatusColumnName`;
49
- ");
50
- }
51
- $installer->run("
52
- ALTER TABLE `{$this->getTable('sales/invoice')}`
53
- ADD COLUMN `$speedtaxInvoiceStatusColumnName` SMALLINT(5) DEFAULT 0;
54
- ");
55
-
56
- $testQuery = "
57
- SELECT * FROM information_schema.COLUMNS
58
- WHERE column_name='$speedTaxTransactionIdColumnName'
59
- AND table_name='{$this->getTable('sales/invoice')}'
60
- AND table_schema='{$connectionConfig['dbname']}'
61
- ";
62
- if(!!$installer->getConnection()->fetchAll($testQuery)){
63
- $installer->run("
64
- ALTER TABLE `{$this->getTable('sales/invoice')}`
65
- DROP COLUMN `$speedTaxTransactionIdColumnName`;
66
- ");
67
- }
68
- $installer->run("
69
- ALTER TABLE `{$this->getTable('sales/invoice')}`
70
- ADD COLUMN `$speedTaxTransactionIdColumnName` varchar(255);
71
- ");
72
-
73
-
74
- // ================ Credit Memo ================ //
75
- $testQuery = "
76
- SELECT * FROM information_schema.COLUMNS
77
- WHERE column_name='$speedtaxInvoiceNumberColumnName'
78
- AND table_name='{$this->getTable('sales/creditmemo')}'
79
- AND table_schema='{$connectionConfig['dbname']}'
80
- ";
81
- if(!!$installer->getConnection()->fetchAll($testQuery)){
82
- $installer->run("
83
- ALTER TABLE `{$this->getTable('sales/creditmemo')}`
84
- DROP COLUMN `$speedtaxInvoiceNumberColumnName`;
85
- ");
86
- }
87
- $installer->run("
88
- ALTER TABLE `{$this->getTable('sales/creditmemo')}`
89
- ADD COLUMN `$speedtaxInvoiceNumberColumnName` varchar(255);
90
- ");
91
-
92
- $testQuery = "
93
- SELECT * FROM information_schema.COLUMNS
94
- WHERE column_name='$speedtaxInvoiceStatusColumnName'
95
- AND table_name='{$this->getTable('sales/creditmemo')}'
96
- AND table_schema='{$connectionConfig['dbname']}'
97
- ";
98
- if(!!$installer->getConnection()->fetchAll($testQuery)){
99
- $installer->run("
100
- ALTER TABLE `{$this->getTable('sales/creditmemo')}`
101
- DROP COLUMN `$speedtaxInvoiceStatusColumnName`;
102
- ");
103
- }
104
- $installer->run("
105
- ALTER TABLE `{$this->getTable('sales/creditmemo')}`
106
- ADD COLUMN `$speedtaxInvoiceStatusColumnName` SMALLINT(5) DEFAULT 0;
107
- ");
108
-
109
- $testQuery = "
110
- SELECT * FROM information_schema.COLUMNS
111
- WHERE column_name='$speedTaxTransactionIdColumnName'
112
- AND table_name='{$this->getTable('sales/creditmemo')}'
113
- AND table_schema='{$connectionConfig['dbname']}'
114
- ";
115
- if(!!$installer->getConnection()->fetchAll($testQuery)){
116
- $installer->run("
117
- ALTER TABLE `{$this->getTable('sales/creditmemo')}`
118
- DROP COLUMN `$speedTaxTransactionIdColumnName`;
119
- ");
120
- }
121
- $installer->run("
122
- ALTER TABLE `{$this->getTable('sales/creditmemo')}`
123
- ADD COLUMN `$speedTaxTransactionIdColumnName` varchar(255);
124
- ");
125
-
126
- $installer->endSetup();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>SalesTax_Connector</name>
4
- <version>3.1.2</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.harapartners.com/terms/eula">Hara Partners End User License Agreement</license>
7
  <channel>community</channel>
@@ -11,8 +11,8 @@
11
  <notes>Simplify sales and use tax calculation, compliance, and management in the cloud!</notes>
12
  <authors><author><name>Ken Nunes</name><user>auto-converted</user><email>Ken.nunes@wolterskluwer.com</email></author></authors>
13
  <date>2014-01-13</date>
14
- <time>05:17:09</time>
15
- <contents><target name="magelocal"><dir name="Harapartners"><dir name="ConnectorHub"><dir name="etc"><file name="config.xml" hash="8ca81abfe825b4311d3df7f2f8eadcda"/></dir><dir name="Helper"><dir name="Connector"><file name="Core.php" hash="1d080deb18839b511ce7d2c88f516bb6"/></dir><file name="Mcrypt.php" hash="928572b4884d60f03ecde04b63186ea2"/><file name="Object.php" hash="487cd77c21c8bb9dec6189cc19d8c6a5"/></dir><dir name="Model"><dir name="Rewrite"><dir name="Paypal"><dir name="Api"><file name="Nvp.php" hash="e260f23f4093e7932286f81bf48f855a"/></dir><file name="Config.php" hash="41db0559b01ef40fa3a33e85a416d016"/></dir></dir></dir></dir><dir name="SpeedTax"><dir name="Block"><dir name="Adminhtml"><dir name="System"><dir name="Config"><dir name="Form"><dir name="Field"><file name="Authentication.php" hash="8be5a91c0aa3d23ced5a2852b940dac3"/></dir></dir></dir></dir></dir></dir><dir name="controllers"><dir name="Adminhtml"><dir name="System"><dir name="Config"><file name="AjaxController.php" hash="3d127613228ef0decd5ea7e91c05ce83"/></dir></dir></dir></dir><dir name="etc"><file name="config.xml" hash="f72596362bf333084b88808ab7ca7ebb"/><file name="system.xml" hash="a213e1d32c12a2251ecaf639ae491bcc"/></dir><dir name="Helper"><dir name="Connector"><file name="Data.php" hash="4ae2eb94b6cf797eef7e2a7a8249e073"/><file name="Speedtax.php" hash="c818691755b59c20d1271a2f3c22d579"/></dir><file name="Data.php" hash="4a3805bc334300c5b79afa89a3330be6"/><file name="Processor.php" hash="600241518208610cc76ffd6051d1cb6a"/></dir><dir name="Model"><dir name="Rewrite"><dir name="Tax"><dir name="Sales"><dir name="Total"><dir name="Quote"><file name="Tax.php" hash="00a4b49781a30b5b19ea82b083dcd2df"/></dir></dir></dir></dir></dir><dir name="Source"><file name="Usregions.php" hash="2ab7713b5b46f142e133459952cd1ef5"/></dir><file name="Observer.php" hash="609d1237bc2eddedeb629ed322540fc8"/><file name="Session.php" hash="46175fe01434d91757499d5c0f7f2bee"/></dir><dir name="sql"><dir name="speedtax_setup"><file name="mysql4-upgrade-3.0.9-3.1.0.php" hash="886b0ebdd5b0234b89fcff5fc07fbfd1"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="Harapartners_ConnectorHub.xml" hash="77e80f0f2d28c0ff45b869d467b49bbf"/><file name="Harapartners_SpeedTax.xml" hash="4e25b9cfbbb9568913aeb75dbae21b0d"/></dir></target></contents>
16
  <compatible/>
17
  <dependencies/>
18
  </package>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>SalesTax_Connector</name>
4
+ <version>3.1.3</version>
5
  <stability>stable</stability>
6
  <license uri="http://www.harapartners.com/terms/eula">Hara Partners End User License Agreement</license>
7
  <channel>community</channel>
11
  <notes>Simplify sales and use tax calculation, compliance, and management in the cloud!</notes>
12
  <authors><author><name>Ken Nunes</name><user>auto-converted</user><email>Ken.nunes@wolterskluwer.com</email></author></authors>
13
  <date>2014-01-13</date>
14
+ <time>20:57:55</time>
15
+ <contents><target name="mageetc"><dir name="modules"><file name="Harapartners_ConnectorHub.xml" hash="77e80f0f2d28c0ff45b869d467b49bbf"/><file name="Harapartners_SpeedTax.xml" hash="4e25b9cfbbb9568913aeb75dbae21b0d"/></dir></target></contents>
16
  <compatible/>
17
  <dependencies/>
18
  </package>