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.2 |
| Comparing to | |
| See all releases | |
Code changes from version 3.1.1 to 3.1.2
- app/code/local/Harapartners/ConnectorHub/Helper/Connector/Core.php +183 -0
- app/code/local/Harapartners/ConnectorHub/Helper/Mcrypt.php +87 -0
- app/code/local/Harapartners/ConnectorHub/Helper/Object.php +161 -0
- app/code/local/Harapartners/ConnectorHub/Model/Rewrite/Paypal/Api/Nvp.php +39 -0
- app/code/local/Harapartners/ConnectorHub/Model/Rewrite/Paypal/Config.php +58 -0
- app/code/local/Harapartners/ConnectorHub/etc/config.xml +54 -0
- app/code/local/Harapartners/SpeedTax/Block/Adminhtml/System/Config/Form/Field/Authentication.php +77 -0
- app/code/local/Harapartners/SpeedTax/Helper/Connector/Data.php +240 -0
- app/code/local/Harapartners/SpeedTax/Helper/Connector/Speedtax.php +182 -0
- app/code/local/Harapartners/SpeedTax/Helper/Data.php +30 -0
- app/code/local/Harapartners/SpeedTax/Helper/Processor.php +190 -0
- app/code/local/Harapartners/SpeedTax/Model/Observer.php +67 -0
- app/code/local/Harapartners/SpeedTax/Model/Rewrite/Tax/Sales/Total/Quote/Tax.php +56 -0
- app/code/local/Harapartners/SpeedTax/Model/Session.php +64 -0
- app/code/local/Harapartners/SpeedTax/Model/Source/Usregions.php +35 -0
- app/code/local/Harapartners/SpeedTax/controllers/Adminhtml/System/Config/AjaxController.php +55 -0
- app/code/local/Harapartners/SpeedTax/etc/config.xml +146 -0
- app/code/local/Harapartners/SpeedTax/etc/system.xml +167 -0
- app/code/local/Harapartners/SpeedTax/sql/speedtax_setup/mysql4-upgrade-3.0.9-3.1.0.php +126 -0
- app/etc/modules/Harapartners_ConnectorHub.xml +22 -0
- package.xml +4 -4
app/code/local/Harapartners/ConnectorHub/Helper/Connector/Core.php
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,182 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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();
|
app/etc/modules/Harapartners_ConnectorHub.xml
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
+
<active>true</active>
|
| 19 |
+
<codePool>local</codePool>
|
| 20 |
+
</Harapartners_ConnectorHub>
|
| 21 |
+
</modules>
|
| 22 |
+
</config>
|
package.xml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>SalesTax_Connector</name>
|
| 4 |
-
<version>3.1.
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license uri="http://www.harapartners.com/terms/eula">Hara Partners End User License Agreement</license>
|
| 7 |
<channel>community</channel>
|
|
@@ -10,9 +10,9 @@
|
|
| 10 |
<description>Simplify sales and use tax calculation, compliance, and management in the cloud!</description>
|
| 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-
|
| 14 |
-
<time>
|
| 15 |
-
<contents><target name="mageetc"><dir name="modules"><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.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>
|
| 10 |
<description>Simplify sales and use tax calculation, compliance, and management in the cloud!</description>
|
| 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>
|
