Version Notes
Supported Magento 1.5.0.0 - 1.7.x, Magento Enterprise 1.8-1.12.x
Download this release
Release Info
| Developer | Exactor, Inc. |
| Extension | Mage_Exactor_Tax |
| Version | 2014.09.05 |
| Comparing to | |
| See all releases | |
Code changes from version 2014.03.04 to 2014.09.05
- app/code/local/Exactor/Core/Model/Mysql4/MerchantSettings/Collection.php~ +0 -40
- app/code/local/{Exactor → ZzzzzExactor}/Core/Helper/SessionCache.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/Core/Model/ExactorTransaction.php +3 -3
- app/code/local/{Exactor → ZzzzzExactor}/Core/Model/MerchantSettings.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/Core/Model/Mysql4/ExactorTransaction.php +1 -1
- app/code/local/{Exactor/Core/Model/Mysql4/MerchantSettings → ZzzzzExactor/Core/Model/Mysql4/ExactorTransaction}/Collection.php +3 -3
- app/code/local/{Exactor → ZzzzzExactor}/Core/Model/Mysql4/MerchantSettings.php +1 -1
- app/code/local/{Exactor/Core/Model/Mysql4/ExactorTransaction → ZzzzzExactor/Core/Model/Mysql4/MerchantSettings}/Collection.php +3 -3
- app/code/local/{Exactor → ZzzzzExactor}/Core/Model/Type/Onepage.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/Core/etc/config.xml +11 -11
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/Block/Form.php +5 -5
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/Helper/Data.php +7 -7
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/Helper/VersionResolver.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/controllers/Adminhtml/FormController.php +8 -8
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/controllers/AjaxController.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/controllers/IndexController.php +2 -2
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/etc/config.xml +11 -11
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/sql/ExactorSettings_setup/mysql4-install-14.04.2012.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/sql/ExactorSettings_setup/upgrade-2012.06.14-2012.09.25.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/Sales/Model/Observer.php +179 -91
- app/code/local/{Exactor → ZzzzzExactor}/Sales/etc/config.xml +32 -12
- app/code/local/{Exactor → ZzzzzExactor}/Tax/Helper/Calculation.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/Tax/Helper/Mapping.php +298 -165
- app/code/local/{Exactor → ZzzzzExactor}/Tax/Model/Sales/Total/Quote/Nominal/Tax.php +1 -1
- app/code/local/{Exactor → ZzzzzExactor}/Tax/Model/Sales/Total/Quote/Tax.php +168 -94
- app/code/local/{Exactor → ZzzzzExactor}/Tax/etc/config.xml +22 -9
- app/design/adminhtml/default/default/layout/exactorsettings.xml +1 -1
- app/etc/modules/{Exactor.xml → ZzzzzExactor.xml} +8 -8
- lib/ExactorCommons/ExactorCommons.php +7 -0
- lib/ExactorCommons/ExactorDomainObjects.php +84 -1
- lib/ExactorCommons/Magento.php +7 -7
- lib/ExactorCommons/config.php +10 -2
- package.xml +4 -4
app/code/local/Exactor/Core/Model/Mysql4/MerchantSettings/Collection.php~
DELETED
|
@@ -1,40 +0,0 @@
|
|
| 1 |
-
<?php
|
| 2 |
-
/**
|
| 3 |
-
* Magento
|
| 4 |
-
*
|
| 5 |
-
* NOTICE OF LICENSE
|
| 6 |
-
*
|
| 7 |
-
* This source file is subject to the Open Software License (OSL 3.0)
|
| 8 |
-
* that is bundled with this package in the file LICENSE.txt.
|
| 9 |
-
* It is also available through the world-wide-web at this URL:
|
| 10 |
-
* http://opensource.org/licenses/osl-3.0.php
|
| 11 |
-
* If you did not receive a copy of the license and are unable to
|
| 12 |
-
* obtain it through the world-wide-web, please send an email
|
| 13 |
-
* to license@magentocommerce.com so we can send you a copy immediately.
|
| 14 |
-
*
|
| 15 |
-
* DISCLAIMER
|
| 16 |
-
*
|
| 17 |
-
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 18 |
-
* versions in the future. If you wish to customize Magento for your
|
| 19 |
-
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
-
*
|
| 21 |
-
* @category Exactor
|
| 22 |
-
* @package Exactor_Exactordetails
|
| 23 |
-
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
-
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
-
*/
|
| 26 |
-
|
| 27 |
-
/**
|
| 28 |
-
* Exactor Exactordetails collection
|
| 29 |
-
*
|
| 30 |
-
* @category Exactor
|
| 31 |
-
* @package Exactor_Exactordetails
|
| 32 |
-
* @author Magento Core Team <core@magentocommerce.com>
|
| 33 |
-
*/
|
| 34 |
-
class Exactor_Core_Model_Mysql4_MerchantSettings_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract {
|
| 35 |
-
|
| 36 |
-
protected function _construct()
|
| 37 |
-
{
|
| 38 |
-
$this->_init('core/MerchantSettings');
|
| 39 |
-
}
|
| 40 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app/code/local/{Exactor → ZzzzzExactor}/Core/Helper/SessionCache.php
RENAMED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Time: 7:05 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
-
class
|
| 9 |
/**
|
| 10 |
* @var IExactorLogger
|
| 11 |
*/
|
| 5 |
* Time: 7:05 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
+
class ZzzzzExactor_Core_Helper_SessionCache extends Mage_Core_Helper_Abstract{
|
| 9 |
/**
|
| 10 |
* @var IExactorLogger
|
| 11 |
*/
|
app/code/local/{Exactor → ZzzzzExactor}/Core/Model/ExactorTransaction.php
RENAMED
|
@@ -19,7 +19,7 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
|
@@ -29,10 +29,10 @@
|
|
| 29 |
* Exactor Transaction
|
| 30 |
*
|
| 31 |
* @category Exactor
|
| 32 |
-
* @package
|
| 33 |
*/
|
| 34 |
|
| 35 |
-
class
|
| 36 |
{
|
| 37 |
protected function _construct() {
|
| 38 |
$this->_init('ExactorTransaction/ExactorTransaction');
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_Exactordetails
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 29 |
* Exactor Transaction
|
| 30 |
*
|
| 31 |
* @category Exactor
|
| 32 |
+
* @package ZzzzzExactor_ExactorSettings
|
| 33 |
*/
|
| 34 |
|
| 35 |
+
class ZzzzzExactor_Core_Model_ExactorTransaction extends Mage_Core_Model_Abstract
|
| 36 |
{
|
| 37 |
protected function _construct() {
|
| 38 |
$this->_init('ExactorTransaction/ExactorTransaction');
|
app/code/local/{Exactor → ZzzzzExactor}/Core/Model/MerchantSettings.php
RENAMED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Time: 4:46 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
-
class
|
| 9 |
{
|
| 10 |
// Commit Options
|
| 11 |
const COMMIT_ON_SALES_ORDER = "SL";
|
| 5 |
* Time: 4:46 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
+
class ZzzzzExactor_Core_Model_MerchantSettings extends Mage_Core_Model_Abstract
|
| 9 |
{
|
| 10 |
// Commit Options
|
| 11 |
const COMMIT_ON_SALES_ORDER = "SL";
|
app/code/local/{Exactor → ZzzzzExactor}/Core/Model/Mysql4/ExactorTransaction.php
RENAMED
|
@@ -1 +1 @@
|
|
| 1 |
-
<?php
|
| 2 |
* Magento
|
| 3 |
*
|
| 4 |
* NOTICE OF LICENSE
|
| 5 |
*
|
| 6 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 7 |
* that is bundled with this package in the file LICENSE.txt.
|
| 8 |
* It is also available through the world-wide-web at this URL:
|
| 9 |
* http://opensource.org/licenses/osl-3.0.php
|
| 10 |
* If you did not receive a copy of the license and are unable to
|
| 11 |
* obtain it through the world-wide-web, please send an email
|
| 12 |
* to license@magentocommerce.com so we can send you a copy immediately.
|
| 13 |
*
|
| 14 |
* DISCLAIMER
|
| 15 |
*
|
| 16 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 17 |
* versions in the future. If you wish to customize Magento for your
|
| 18 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 19 |
*
|
| 20 |
* @category Exactor
|
| 21 |
* @package Exactor_Exactordetails
|
| 22 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 23 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 24 |
*/
|
| 25 |
* Resource model for Exactor Exactordetails
|
| 26 |
*
|
| 27 |
* @category Exactor
|
| 28 |
* @package Exactor_Exactordetails
|
| 29 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 30 |
*/
|
| 31 |
|
| 32 |
protected function _construct()
|
| 33 |
{
|
| 34 |
$this->_init('ExactorTransaction/ExactorTransaction', 'ID');
|
| 35 |
}
|
|
|
|
| 36 |
* Magento
|
| 37 |
*
|
| 38 |
* NOTICE OF LICENSE
|
| 39 |
*
|
| 40 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 41 |
* that is bundled with this package in the file LICENSE.txt.
|
| 42 |
* It is also available through the world-wide-web at this URL:
|
| 43 |
* http://opensource.org/licenses/osl-3.0.php
|
| 44 |
* If you did not receive a copy of the license and are unable to
|
| 45 |
* obtain it through the world-wide-web, please send an email
|
| 46 |
* to license@magentocommerce.com so we can send you a copy immediately.
|
| 47 |
*
|
| 48 |
* DISCLAIMER
|
| 49 |
*
|
| 50 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 51 |
* versions in the future. If you wish to customize Magento for your
|
| 52 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 53 |
*
|
| 54 |
* @category Exactor
|
| 55 |
* @package ZzzzzExactor_Exactordetails
|
| 56 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 57 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 58 |
*/
|
| 59 |
* Resource model for Exactor Exactordetails
|
| 60 |
*
|
| 61 |
* @category Exactor
|
| 62 |
* @package ZzzzzExactor_Exactordetails
|
| 63 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 64 |
*/
|
| 65 |
|
| 66 |
protected function _construct()
|
| 67 |
{
|
| 68 |
$this->_init('ExactorTransaction/ExactorTransaction', 'ID');
|
| 69 |
}
|
|
|
|
| 1 |
* Magento
|
| 2 |
*
|
| 3 |
* NOTICE OF LICENSE
|
| 4 |
*
|
| 5 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 6 |
* that is bundled with this package in the file LICENSE.txt.
|
| 7 |
* It is also available through the world-wide-web at this URL:
|
| 8 |
* http://opensource.org/licenses/osl-3.0.php
|
| 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 license@magentocommerce.com so we can send you a copy immediately.
|
| 12 |
*
|
| 13 |
* DISCLAIMER
|
| 14 |
*
|
| 15 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 16 |
* versions in the future. If you wish to customize Magento for your
|
| 17 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 18 |
*
|
| 19 |
* @category Exactor
|
| 20 |
* @package Exactor_Exactordetails
|
| 21 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 22 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 23 |
*/
|
| 24 |
* Resource model for Exactor Exactordetails
|
| 25 |
*
|
| 26 |
* @category Exactor
|
| 27 |
* @package Exactor_Exactordetails
|
| 28 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 29 |
*/
|
| 30 |
|
| 31 |
protected function _construct()
|
| 32 |
{
|
| 33 |
$this->_init('ExactorTransaction/ExactorTransaction', 'ID');
|
| 34 |
}
|
| 35 |
+
<?php
|
| 36 |
* Magento
|
| 37 |
*
|
| 38 |
* NOTICE OF LICENSE
|
| 39 |
*
|
| 40 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 41 |
* that is bundled with this package in the file LICENSE.txt.
|
| 42 |
* It is also available through the world-wide-web at this URL:
|
| 43 |
* http://opensource.org/licenses/osl-3.0.php
|
| 44 |
* If you did not receive a copy of the license and are unable to
|
| 45 |
* obtain it through the world-wide-web, please send an email
|
| 46 |
* to license@magentocommerce.com so we can send you a copy immediately.
|
| 47 |
*
|
| 48 |
* DISCLAIMER
|
| 49 |
*
|
| 50 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 51 |
* versions in the future. If you wish to customize Magento for your
|
| 52 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 53 |
*
|
| 54 |
* @category Exactor
|
| 55 |
* @package ZzzzzExactor_Exactordetails
|
| 56 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 57 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 58 |
*/
|
| 59 |
* Resource model for Exactor Exactordetails
|
| 60 |
*
|
| 61 |
* @category Exactor
|
| 62 |
* @package ZzzzzExactor_Exactordetails
|
| 63 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 64 |
*/
|
| 65 |
|
| 66 |
protected function _construct()
|
| 67 |
{
|
| 68 |
$this->_init('ExactorTransaction/ExactorTransaction', 'ID');
|
| 69 |
}
|
app/code/local/{Exactor/Core/Model/Mysql4/MerchantSettings → ZzzzzExactor/Core/Model/Mysql4/ExactorTransaction}/Collection.php
RENAMED
|
@@ -19,16 +19,16 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 26 |
|
| 27 |
|
| 28 |
-
class
|
| 29 |
|
| 30 |
protected function _construct()
|
| 31 |
{
|
| 32 |
-
$this->_init('
|
| 33 |
}
|
| 34 |
}
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_Exactordetails
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 26 |
|
| 27 |
|
| 28 |
+
class ZzzzzExactor_Core_Model_Mysql4_ExactorTransaction_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract {
|
| 29 |
|
| 30 |
protected function _construct()
|
| 31 |
{
|
| 32 |
+
$this->_init('ZzzzzExactor_Core_Model_ExactorTransaction');
|
| 33 |
}
|
| 34 |
}
|
app/code/local/{Exactor → ZzzzzExactor}/Core/Model/Mysql4/MerchantSettings.php
RENAMED
|
@@ -1 +1 @@
|
|
| 1 |
-
<?php
|
| 2 |
* Magento
|
| 3 |
*
|
| 4 |
* NOTICE OF LICENSE
|
| 5 |
*
|
| 6 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 7 |
* that is bundled with this package in the file LICENSE.txt.
|
| 8 |
* It is also available through the world-wide-web at this URL:
|
| 9 |
* http://opensource.org/licenses/osl-3.0.php
|
| 10 |
* If you did not receive a copy of the license and are unable to
|
| 11 |
* obtain it through the world-wide-web, please send an email
|
| 12 |
* to license@magentocommerce.com so we can send you a copy immediately.
|
| 13 |
*
|
| 14 |
* DISCLAIMER
|
| 15 |
*
|
| 16 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 17 |
* versions in the future. If you wish to customize Magento for your
|
| 18 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 19 |
*
|
| 20 |
* @category Exactor
|
| 21 |
* @package Exactor_Exactordetails
|
| 22 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 23 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 24 |
*/
|
| 25 |
* Resource model for Exactor Exactordetails
|
| 26 |
*
|
| 27 |
* @category Exactor
|
| 28 |
* @package Exactor_Exactordetails
|
| 29 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 30 |
*/
|
| 31 |
|
| 32 |
protected function _construct()
|
| 33 |
{
|
| 34 |
$this->_init('MerchantSettings/MerchantSettings', 'ID');
|
| 35 |
}
|
|
|
|
| 36 |
* Magento
|
| 37 |
*
|
| 38 |
* NOTICE OF LICENSE
|
| 39 |
*
|
| 40 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 41 |
* that is bundled with this package in the file LICENSE.txt.
|
| 42 |
* It is also available through the world-wide-web at this URL:
|
| 43 |
* http://opensource.org/licenses/osl-3.0.php
|
| 44 |
* If you did not receive a copy of the license and are unable to
|
| 45 |
* obtain it through the world-wide-web, please send an email
|
| 46 |
* to license@magentocommerce.com so we can send you a copy immediately.
|
| 47 |
*
|
| 48 |
* DISCLAIMER
|
| 49 |
*
|
| 50 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 51 |
* versions in the future. If you wish to customize Magento for your
|
| 52 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 53 |
*
|
| 54 |
* @category Exactor
|
| 55 |
* @package ZzzzzExactor_Exactordetails
|
| 56 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 57 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 58 |
*/
|
| 59 |
* Resource model for Exactor Exactordetails
|
| 60 |
*
|
| 61 |
* @category Exactor
|
| 62 |
* @package ZzzzzExactor_Exactordetails
|
| 63 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 64 |
*/
|
| 65 |
|
| 66 |
protected function _construct()
|
| 67 |
{
|
| 68 |
$this->_init('MerchantSettings/MerchantSettings', 'ID');
|
| 69 |
}
|
|
|
|
| 1 |
* Magento
|
| 2 |
*
|
| 3 |
* NOTICE OF LICENSE
|
| 4 |
*
|
| 5 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 6 |
* that is bundled with this package in the file LICENSE.txt.
|
| 7 |
* It is also available through the world-wide-web at this URL:
|
| 8 |
* http://opensource.org/licenses/osl-3.0.php
|
| 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 license@magentocommerce.com so we can send you a copy immediately.
|
| 12 |
*
|
| 13 |
* DISCLAIMER
|
| 14 |
*
|
| 15 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 16 |
* versions in the future. If you wish to customize Magento for your
|
| 17 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 18 |
*
|
| 19 |
* @category Exactor
|
| 20 |
* @package Exactor_Exactordetails
|
| 21 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 22 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 23 |
*/
|
| 24 |
* Resource model for Exactor Exactordetails
|
| 25 |
*
|
| 26 |
* @category Exactor
|
| 27 |
* @package Exactor_Exactordetails
|
| 28 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 29 |
*/
|
| 30 |
|
| 31 |
protected function _construct()
|
| 32 |
{
|
| 33 |
$this->_init('MerchantSettings/MerchantSettings', 'ID');
|
| 34 |
}
|
| 35 |
+
<?php
|
| 36 |
* Magento
|
| 37 |
*
|
| 38 |
* NOTICE OF LICENSE
|
| 39 |
*
|
| 40 |
* This source file is subject to the Open Software License (OSL 3.0)
|
| 41 |
* that is bundled with this package in the file LICENSE.txt.
|
| 42 |
* It is also available through the world-wide-web at this URL:
|
| 43 |
* http://opensource.org/licenses/osl-3.0.php
|
| 44 |
* If you did not receive a copy of the license and are unable to
|
| 45 |
* obtain it through the world-wide-web, please send an email
|
| 46 |
* to license@magentocommerce.com so we can send you a copy immediately.
|
| 47 |
*
|
| 48 |
* DISCLAIMER
|
| 49 |
*
|
| 50 |
* Do not edit or add to this file if you wish to upgrade Magento to newer
|
| 51 |
* versions in the future. If you wish to customize Magento for your
|
| 52 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 53 |
*
|
| 54 |
* @category Exactor
|
| 55 |
* @package ZzzzzExactor_Exactordetails
|
| 56 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 57 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 58 |
*/
|
| 59 |
* Resource model for Exactor Exactordetails
|
| 60 |
*
|
| 61 |
* @category Exactor
|
| 62 |
* @package ZzzzzExactor_Exactordetails
|
| 63 |
* @author Magento Core Team <core@magentocommerce.com>
|
| 64 |
*/
|
| 65 |
|
| 66 |
protected function _construct()
|
| 67 |
{
|
| 68 |
$this->_init('MerchantSettings/MerchantSettings', 'ID');
|
| 69 |
}
|
app/code/local/{Exactor/Core/Model/Mysql4/ExactorTransaction → ZzzzzExactor/Core/Model/Mysql4/MerchantSettings}/Collection.php
RENAMED
|
@@ -19,16 +19,16 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 26 |
|
| 27 |
|
| 28 |
-
class
|
| 29 |
|
| 30 |
protected function _construct()
|
| 31 |
{
|
| 32 |
-
$this->_init('
|
| 33 |
}
|
| 34 |
}
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_Exactordetails
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 26 |
|
| 27 |
|
| 28 |
+
class ZzzzzExactor_Core_Model_Mysql4_MerchantSettings_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract {
|
| 29 |
|
| 30 |
protected function _construct()
|
| 31 |
{
|
| 32 |
+
$this->_init('ZzzzzExactor_Core_Model_MerchantSettings');
|
| 33 |
}
|
| 34 |
}
|
app/code/local/{Exactor → ZzzzzExactor}/Core/Model/Type/Onepage.php
RENAMED
|
@@ -1,6 +1,6 @@
|
|
| 1 |
<?php
|
| 2 |
|
| 3 |
-
class
|
| 4 |
/** @var Mage_Core_Model_Session_Abstract */
|
| 5 |
private $session;
|
| 6 |
|
| 1 |
<?php
|
| 2 |
|
| 3 |
+
class ZzzzzExactor_Core_Model_Type_Onepage extends Mage_Checkout_Model_Type_Onepage{
|
| 4 |
/** @var Mage_Core_Model_Session_Abstract */
|
| 5 |
private $session;
|
| 6 |
|
app/code/local/{Exactor → ZzzzzExactor}/Core/etc/config.xml
RENAMED
|
@@ -20,51 +20,51 @@
|
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
-
* @package
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
-
<
|
| 31 |
<version>2012.07.17</version>
|
| 32 |
-
</
|
| 33 |
</modules>
|
| 34 |
<global>
|
| 35 |
<models>
|
| 36 |
<checkout>
|
| 37 |
<rewrite>
|
| 38 |
-
<type_onepage>
|
| 39 |
</rewrite>
|
| 40 |
</checkout>
|
| 41 |
<!-- Settings -->
|
| 42 |
<MerchantSettings>
|
| 43 |
-
<class>
|
| 44 |
<resourceModel>MerchantSettings_mysql4</resourceModel>
|
| 45 |
</MerchantSettings>
|
| 46 |
<MerchantSettings_mysql4>
|
| 47 |
-
<class>
|
| 48 |
<entities>
|
| 49 |
<MerchantSettings><table>exactor_account</table></MerchantSettings>
|
| 50 |
</entities>
|
| 51 |
</MerchantSettings_mysql4>
|
| 52 |
<!-- Transaction data -->
|
| 53 |
<ExactorTransaction>
|
| 54 |
-
<class>
|
| 55 |
<resourceModel>ExactorTransaction_mysql4</resourceModel>
|
| 56 |
</ExactorTransaction>
|
| 57 |
<ExactorTransaction_mysql4>
|
| 58 |
-
<class>
|
| 59 |
<entities>
|
| 60 |
<ExactorTransaction><table>exactor_transaction_order</table></ExactorTransaction>
|
| 61 |
</entities>
|
| 62 |
</ExactorTransaction_mysql4>
|
| 63 |
</models>
|
| 64 |
<helpers>
|
| 65 |
-
<
|
| 66 |
-
<class>
|
| 67 |
-
</
|
| 68 |
</helpers>
|
| 69 |
<resources>
|
| 70 |
<!-- Exactor Merchant Settings -->
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
+
* @package ZzzzzExactor_Tax
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
+
<ZzzzzExactor_Core>
|
| 31 |
<version>2012.07.17</version>
|
| 32 |
+
</ZzzzzExactor_Core>
|
| 33 |
</modules>
|
| 34 |
<global>
|
| 35 |
<models>
|
| 36 |
<checkout>
|
| 37 |
<rewrite>
|
| 38 |
+
<type_onepage>ZzzzzExactor_Core_Model_Type_Onepage</type_onepage>
|
| 39 |
</rewrite>
|
| 40 |
</checkout>
|
| 41 |
<!-- Settings -->
|
| 42 |
<MerchantSettings>
|
| 43 |
+
<class>ZzzzzExactor_Core_Model_MerchantSettings</class>
|
| 44 |
<resourceModel>MerchantSettings_mysql4</resourceModel>
|
| 45 |
</MerchantSettings>
|
| 46 |
<MerchantSettings_mysql4>
|
| 47 |
+
<class>ZzzzzExactor_Core_Model_Mysql4</class>
|
| 48 |
<entities>
|
| 49 |
<MerchantSettings><table>exactor_account</table></MerchantSettings>
|
| 50 |
</entities>
|
| 51 |
</MerchantSettings_mysql4>
|
| 52 |
<!-- Transaction data -->
|
| 53 |
<ExactorTransaction>
|
| 54 |
+
<class>ZzzzzExactor_Core_Model_ExactorTransaction</class>
|
| 55 |
<resourceModel>ExactorTransaction_mysql4</resourceModel>
|
| 56 |
</ExactorTransaction>
|
| 57 |
<ExactorTransaction_mysql4>
|
| 58 |
+
<class>ZzzzzExactor_Core_Model_Mysql4</class>
|
| 59 |
<entities>
|
| 60 |
<ExactorTransaction><table>exactor_transaction_order</table></ExactorTransaction>
|
| 61 |
</entities>
|
| 62 |
</ExactorTransaction_mysql4>
|
| 63 |
</models>
|
| 64 |
<helpers>
|
| 65 |
+
<ZzzzzExactor_Core_SessionCache>
|
| 66 |
+
<class>ZzzzzExactor_Core_Helper_SessionCache</class>
|
| 67 |
+
</ZzzzzExactor_Core_SessionCache>
|
| 68 |
</helpers>
|
| 69 |
<resources>
|
| 70 |
<!-- Exactor Merchant Settings -->
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/Block/Form.php
RENAMED
|
@@ -19,7 +19,7 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
|
@@ -28,16 +28,16 @@
|
|
| 28 |
* ExactorSettings block
|
| 29 |
*
|
| 30 |
* @category Exactor
|
| 31 |
-
* @package
|
| 32 |
*/
|
| 33 |
|
| 34 |
-
class
|
| 35 |
|
| 36 |
-
//const MODEL_MERCHANT_SETTINGS = "
|
| 37 |
|
| 38 |
private $storeViewId = 0;
|
| 39 |
|
| 40 |
-
/** @var \
|
| 41 |
private $exactorSettingsHelper;
|
| 42 |
|
| 43 |
public function __construct() {
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_ExactorSettings
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 28 |
* ExactorSettings block
|
| 29 |
*
|
| 30 |
* @category Exactor
|
| 31 |
+
* @package ZzzzzExactor_ExactorSettingss
|
| 32 |
*/
|
| 33 |
|
| 34 |
+
class ZzzzzExactor_ExactorSettings_Block_Form extends Mage_Core_Block_Template {
|
| 35 |
|
| 36 |
+
//const MODEL_MERCHANT_SETTINGS = "ZzzzzExactor_Core_Model_MerchantSettings";
|
| 37 |
|
| 38 |
private $storeViewId = 0;
|
| 39 |
|
| 40 |
+
/** @var \ZzzzzExactor_ExactorSettings_Helper_Data */
|
| 41 |
private $exactorSettingsHelper;
|
| 42 |
|
| 43 |
public function __construct() {
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/Helper/Data.php
RENAMED
|
@@ -19,7 +19,7 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
|
@@ -30,14 +30,14 @@
|
|
| 30 |
* Time: 5:12 PM
|
| 31 |
*/
|
| 32 |
|
| 33 |
-
class
|
| 34 |
|
| 35 |
-
const MODEL_MERCHANT_SETTINGS = "
|
| 36 |
|
| 37 |
/**
|
| 38 |
* Returns merchant settings from DB or null if there is no any record
|
| 39 |
* @param null $storeViewId
|
| 40 |
-
* @return
|
| 41 |
*/
|
| 42 |
function loadMerchantSettings($storeViewId=null){
|
| 43 |
$merchantSettingsModel = $this->loadMerchantSettingsOrEmptyObject($storeViewId);
|
|
@@ -46,9 +46,9 @@ class Exactor_ExactorSettings_Helper_Data extends Mage_Core_Helper_Abstract{
|
|
| 46 |
}
|
| 47 |
|
| 48 |
/**
|
| 49 |
-
* Returns merchant settings from DB or empty
|
| 50 |
* @param null $storeViewId
|
| 51 |
-
* @return
|
| 52 |
*/
|
| 53 |
function loadMerchantSettingsOrEmptyObject($storeViewId=null){
|
| 54 |
//if ($storeViewId == null) $storeViewId = 1; // 1 - ID of the default store view
|
|
@@ -73,7 +73,7 @@ class Exactor_ExactorSettings_Helper_Data extends Mage_Core_Helper_Abstract{
|
|
| 73 |
* Returns merchant settings from DB
|
| 74 |
* or null if there is <strong>no any record</strong> or settings <strong>are not populated</strong>
|
| 75 |
* @param null $storeViewId
|
| 76 |
-
* @return
|
| 77 |
*/
|
| 78 |
public function loadValidMerchantSettings($storeViewId=null){
|
| 79 |
return $this->loadMerchantSettings($storeViewId);
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_ExactorSettings
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 30 |
* Time: 5:12 PM
|
| 31 |
*/
|
| 32 |
|
| 33 |
+
class ZzzzzExactor_ExactorSettings_Helper_Data extends Mage_Core_Helper_Abstract{
|
| 34 |
|
| 35 |
+
const MODEL_MERCHANT_SETTINGS = "ZzzzzExactor_Core_Model_MerchantSettings";
|
| 36 |
|
| 37 |
/**
|
| 38 |
* Returns merchant settings from DB or null if there is no any record
|
| 39 |
* @param null $storeViewId
|
| 40 |
+
* @return ZzzzzExactor_Core_Model_MerchantSettings|null
|
| 41 |
*/
|
| 42 |
function loadMerchantSettings($storeViewId=null){
|
| 43 |
$merchantSettingsModel = $this->loadMerchantSettingsOrEmptyObject($storeViewId);
|
| 46 |
}
|
| 47 |
|
| 48 |
/**
|
| 49 |
+
* Returns merchant settings from DB or empty ZzzzzExactor_Core_Model_MerchantSettings if there is no any record
|
| 50 |
* @param null $storeViewId
|
| 51 |
+
* @return ZzzzzExactor_Core_Model_MerchantSettings|null
|
| 52 |
*/
|
| 53 |
function loadMerchantSettingsOrEmptyObject($storeViewId=null){
|
| 54 |
//if ($storeViewId == null) $storeViewId = 1; // 1 - ID of the default store view
|
| 73 |
* Returns merchant settings from DB
|
| 74 |
* or null if there is <strong>no any record</strong> or settings <strong>are not populated</strong>
|
| 75 |
* @param null $storeViewId
|
| 76 |
+
* @return ZzzzzExactor_Core_Model_MerchantSettings|null
|
| 77 |
*/
|
| 78 |
public function loadValidMerchantSettings($storeViewId=null){
|
| 79 |
return $this->loadMerchantSettings($storeViewId);
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/Helper/VersionResolver.php
RENAMED
|
@@ -10,7 +10,7 @@
|
|
| 10 |
* Time: 2:35 PM
|
| 11 |
*/
|
| 12 |
|
| 13 |
-
class
|
| 14 |
function __construct() {
|
| 15 |
#call the model function here
|
| 16 |
$this->magentoVersion = Mage::getVersion();
|
| 10 |
* Time: 2:35 PM
|
| 11 |
*/
|
| 12 |
|
| 13 |
+
class ZzzzzExactor_Exactordetails_Helper_VersionResolver extends Mage_Core_Helper_Abstract{
|
| 14 |
function __construct() {
|
| 15 |
#call the model function here
|
| 16 |
$this->magentoVersion = Mage::getVersion();
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/controllers/Adminhtml/FormController.php
RENAMED
|
@@ -19,7 +19,7 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
|
@@ -28,12 +28,12 @@
|
|
| 28 |
* Exactor Settings controller
|
| 29 |
*
|
| 30 |
* @category Exactor
|
| 31 |
-
* @package
|
| 32 |
*/
|
| 33 |
|
| 34 |
-
class
|
| 35 |
{
|
| 36 |
-
const MODEL_MERCHANT_SETTINGS = "
|
| 37 |
const FORM_PARAM_CONTAINER = 'exactordetailsform';
|
| 38 |
|
| 39 |
private $EXACTOR_ADDRESS_ERROR_CODES = array(13,14);
|
|
@@ -68,7 +68,7 @@ class Exactor_ExactorSettings_Adminhtml_FormController extends Mage_Adminhtml_Co
|
|
| 68 |
$this->getLayout()->getBlock('ExactorSettingsForm')->setStoreViewId($storeViewId);
|
| 69 |
// Additional Actions
|
| 70 |
if ($this->getRequest()->getParam('action_del_settings',null) != null) {
|
| 71 |
-
/** @var
|
| 72 |
$exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 73 |
$exactorSettingsHelper->removeSettings($this->getRequest()->getParam('action_del_settings',null));
|
| 74 |
$this->sendSuccess("Successfully cleared settings");
|
|
@@ -83,7 +83,7 @@ class Exactor_ExactorSettings_Adminhtml_FormController extends Mage_Adminhtml_Co
|
|
| 83 |
|
| 84 |
/**
|
| 85 |
* Will be called before validation
|
| 86 |
-
* @param
|
| 87 |
* @return void
|
| 88 |
*/
|
| 89 |
protected function preprocessInput($merchantSettings){
|
|
@@ -135,7 +135,7 @@ class Exactor_ExactorSettings_Adminhtml_FormController extends Mage_Adminhtml_Co
|
|
| 135 |
public function postAction()
|
| 136 |
{
|
| 137 |
$this->setupExactorCommonLibrary();
|
| 138 |
-
/** @var
|
| 139 |
$exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 140 |
$formData = null;
|
| 141 |
// Validate if we need all needed information from client
|
|
@@ -174,7 +174,7 @@ class Exactor_ExactorSettings_Adminhtml_FormController extends Mage_Adminhtml_Co
|
|
| 174 |
/**
|
| 175 |
* Do validation and returns true if there are no any errors,
|
| 176 |
* Otherwise - returns false and populates $this->validationMessages array with error messages
|
| 177 |
-
* @param
|
| 178 |
* @return bool
|
| 179 |
*/
|
| 180 |
private function validate($merchantSettings){
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_ExactorSettings
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 28 |
* Exactor Settings controller
|
| 29 |
*
|
| 30 |
* @category Exactor
|
| 31 |
+
* @package ZzzzzExactor_ExactorSettings
|
| 32 |
*/
|
| 33 |
|
| 34 |
+
class ZzzzzExactor_ExactorSettings_Adminhtml_FormController extends Mage_Adminhtml_Controller_Action
|
| 35 |
{
|
| 36 |
+
const MODEL_MERCHANT_SETTINGS = "ZzzzzExactor_Core_Model_MerchantSettings";
|
| 37 |
const FORM_PARAM_CONTAINER = 'exactordetailsform';
|
| 38 |
|
| 39 |
private $EXACTOR_ADDRESS_ERROR_CODES = array(13,14);
|
| 68 |
$this->getLayout()->getBlock('ExactorSettingsForm')->setStoreViewId($storeViewId);
|
| 69 |
// Additional Actions
|
| 70 |
if ($this->getRequest()->getParam('action_del_settings',null) != null) {
|
| 71 |
+
/** @var ZzzzzExactor_ExactorSettings_Helper_Data $exactorSettingsHelper */
|
| 72 |
$exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 73 |
$exactorSettingsHelper->removeSettings($this->getRequest()->getParam('action_del_settings',null));
|
| 74 |
$this->sendSuccess("Successfully cleared settings");
|
| 83 |
|
| 84 |
/**
|
| 85 |
* Will be called before validation
|
| 86 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 87 |
* @return void
|
| 88 |
*/
|
| 89 |
protected function preprocessInput($merchantSettings){
|
| 135 |
public function postAction()
|
| 136 |
{
|
| 137 |
$this->setupExactorCommonLibrary();
|
| 138 |
+
/** @var ZzzzzExactor_ExactorSettings_Helper_Data $exactorSettingsHelper */
|
| 139 |
$exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 140 |
$formData = null;
|
| 141 |
// Validate if we need all needed information from client
|
| 174 |
/**
|
| 175 |
* Do validation and returns true if there are no any errors,
|
| 176 |
* Otherwise - returns false and populates $this->validationMessages array with error messages
|
| 177 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 178 |
* @return bool
|
| 179 |
*/
|
| 180 |
private function validate($merchantSettings){
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/controllers/AjaxController.php
RENAMED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Time: 1:13 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
-
class
|
| 9 |
const FIELD_EXACTOR_STATUS = "exactor_status";
|
| 10 |
|
| 11 |
/** @var Mage_Core_Model_Session_Abstract */
|
| 5 |
* Time: 1:13 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
+
class ZzzzzExactor_ExactorSettings_AjaxController extends Mage_Core_Controller_Front_Action{
|
| 9 |
const FIELD_EXACTOR_STATUS = "exactor_status";
|
| 10 |
|
| 11 |
/** @var Mage_Core_Model_Session_Abstract */
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/controllers/IndexController.php
RENAMED
|
@@ -19,12 +19,12 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 26 |
|
| 27 |
-
class
|
| 28 |
{
|
| 29 |
public function loginAction()
|
| 30 |
{
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_ExactorSettings
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 26 |
|
| 27 |
+
class ZzzzzExactor_ExactorSettings_Adminhtml_IndexController extends Mage_Adminhtml_Controller_Action
|
| 28 |
{
|
| 29 |
public function loginAction()
|
| 30 |
{
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/etc/config.xml
RENAMED
|
@@ -20,25 +20,25 @@
|
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
-
* @package
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
-
<
|
| 31 |
<version>2012.09.25</version>
|
| 32 |
-
</
|
| 33 |
</modules>
|
| 34 |
|
| 35 |
<global>
|
| 36 |
<helpers>
|
| 37 |
<ExactorSettings>
|
| 38 |
-
<class>
|
| 39 |
</ExactorSettings>
|
| 40 |
<ExactorSettings_versionresolver>
|
| 41 |
-
<class>
|
| 42 |
</ExactorSettings_versionresolver>
|
| 43 |
</helpers>
|
| 44 |
|
|
@@ -47,7 +47,7 @@
|
|
| 47 |
<!-- [start] -->
|
| 48 |
<ExactorSettings_setup>
|
| 49 |
<setup>
|
| 50 |
-
<module>
|
| 51 |
</setup>
|
| 52 |
<connection>
|
| 53 |
<use>core_setup</use>
|
|
@@ -58,7 +58,7 @@
|
|
| 58 |
|
| 59 |
<blocks>
|
| 60 |
<ExactorSettings>
|
| 61 |
-
<class>
|
| 62 |
</ExactorSettings>
|
| 63 |
</blocks>
|
| 64 |
|
|
@@ -69,7 +69,7 @@
|
|
| 69 |
<ExactorSettings>
|
| 70 |
<use>admin</use>
|
| 71 |
<args>
|
| 72 |
-
<module>
|
| 73 |
<frontName>ExactorSettings</frontName>
|
| 74 |
</args>
|
| 75 |
</ExactorSettings>
|
|
@@ -79,11 +79,11 @@
|
|
| 79 |
<adminhtml>
|
| 80 |
<!--<translate>
|
| 81 |
<modules>
|
| 82 |
-
<
|
| 83 |
<files>
|
| 84 |
-
<ExactorSettings>
|
| 85 |
</files>
|
| 86 |
-
</
|
| 87 |
</modules>
|
| 88 |
</translate>-->
|
| 89 |
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
+
* @package ZzzzzExactor_Exactordetails
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
+
<ZzzzzExactor_ExactorSettings>
|
| 31 |
<version>2012.09.25</version>
|
| 32 |
+
</ZzzzzExactor_ExactorSettings>
|
| 33 |
</modules>
|
| 34 |
|
| 35 |
<global>
|
| 36 |
<helpers>
|
| 37 |
<ExactorSettings>
|
| 38 |
+
<class>ZzzzzExactor_ExactorSettings_Helper</class>
|
| 39 |
</ExactorSettings>
|
| 40 |
<ExactorSettings_versionresolver>
|
| 41 |
+
<class>ZzzzzExactor_ExactorSettings_Helper_VersionResolver</class>
|
| 42 |
</ExactorSettings_versionresolver>
|
| 43 |
</helpers>
|
| 44 |
|
| 47 |
<!-- [start] -->
|
| 48 |
<ExactorSettings_setup>
|
| 49 |
<setup>
|
| 50 |
+
<module>ZzzzzExactor_ExactorSettings</module>
|
| 51 |
</setup>
|
| 52 |
<connection>
|
| 53 |
<use>core_setup</use>
|
| 58 |
|
| 59 |
<blocks>
|
| 60 |
<ExactorSettings>
|
| 61 |
+
<class>ZzzzzExactor_ExactorSettings_Block_Form</class>
|
| 62 |
</ExactorSettings>
|
| 63 |
</blocks>
|
| 64 |
|
| 69 |
<ExactorSettings>
|
| 70 |
<use>admin</use>
|
| 71 |
<args>
|
| 72 |
+
<module>ZzzzzExactor_ExactorSettings</module>
|
| 73 |
<frontName>ExactorSettings</frontName>
|
| 74 |
</args>
|
| 75 |
</ExactorSettings>
|
| 79 |
<adminhtml>
|
| 80 |
<!--<translate>
|
| 81 |
<modules>
|
| 82 |
+
<ZzzzzExactor_adminhtml>
|
| 83 |
<files>
|
| 84 |
+
<ExactorSettings>ZzzzzExactor_Exactordetails.csv</ExactorSettings>
|
| 85 |
</files>
|
| 86 |
+
</ZzzzzExactor_adminhtml>
|
| 87 |
</modules>
|
| 88 |
</translate>-->
|
| 89 |
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/sql/ExactorSettings_setup/mysql4-install-14.04.2012.php
RENAMED
|
@@ -19,7 +19,7 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_Exactordetails
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
app/code/local/{Exactor → ZzzzzExactor}/ExactorSettings/sql/ExactorSettings_setup/upgrade-2012.06.14-2012.09.25.php
RENAMED
|
@@ -19,7 +19,7 @@
|
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
-
* @package
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
| 19 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 20 |
*
|
| 21 |
* @category Exactor
|
| 22 |
+
* @package ZzzzzExactor_Exactordetails
|
| 23 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 24 |
* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
|
| 25 |
*/
|
app/code/local/{Exactor → ZzzzzExactor}/Sales/Model/Observer.php
RENAMED
|
@@ -1,23 +1,27 @@
|
|
| 1 |
<?php
|
|
|
|
| 2 |
/**
|
| 3 |
* User: Dmitry Berezovsky
|
| 4 |
* Date: 11/28/11
|
| 5 |
* Time: 12:02 PM
|
| 6 |
*/
|
|
|
|
|
|
|
| 7 |
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
/** @var Exactor_ExactorSettings_Helper_Data */
|
| 11 |
private $exactorSettingsHelper;
|
| 12 |
-
/** @var
|
| 13 |
private $sessionCache;
|
| 14 |
-
/** @var ExactorProcessingService*/
|
| 15 |
private $exactorProcessingService;
|
| 16 |
/**
|
| 17 |
-
* @var
|
| 18 |
*/
|
| 19 |
private $exactorMappingHelper;
|
| 20 |
|
|
|
|
|
|
|
|
|
|
| 21 |
/** @var IExactorLogger */
|
| 22 |
private $logger;
|
| 23 |
|
|
@@ -33,7 +37,8 @@ class Exactor_Sales_Model_Observer {
|
|
| 33 |
*/
|
| 34 |
private $invoiceProcessingCompatibilityList = array();
|
| 35 |
|
| 36 |
-
private function setupExactorCommonLibrary()
|
|
|
|
| 37 |
$libDir = Mage::getBaseDir("lib") . '/ExactorCommons';
|
| 38 |
require_once($libDir . '/XmlProcessing.php');
|
| 39 |
require_once($libDir . '/ExactorDomainObjects.php');
|
|
@@ -49,27 +54,29 @@ class Exactor_Sales_Model_Observer {
|
|
| 49 |
$this->setupExactorCommonLibrary();
|
| 50 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 51 |
$this->exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 52 |
-
$this->sessionCache = Mage::helper('
|
|
|
|
| 53 |
$this->exactorMappingHelper = Mage::helper('tax/mapping');
|
| 54 |
}
|
| 55 |
|
| 56 |
/**
|
| 57 |
* @param Mage_Sales_Model_Order|null $order
|
| 58 |
-
* @return
|
| 59 |
*/
|
| 60 |
-
private function loadMerchantSettings($order=null)
|
|
|
|
| 61 |
$logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 62 |
$storeViewId = $this->getStoreViewId($order);
|
| 63 |
$merchantSettings = $this->exactorSettingsHelper->loadValidMerchantSettings($storeViewId);
|
| 64 |
|
| 65 |
-
if ($merchantSettings == null){
|
| 66 |
$logger->error('Settings are not populated.', 'buildExactorProcessingService');
|
| 67 |
$this->exactorProcessingService = null;
|
| 68 |
return null;
|
| 69 |
-
}else{
|
| 70 |
$this->exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService(
|
| 71 |
-
|
| 72 |
-
|
| 73 |
}
|
| 74 |
return $merchantSettings;
|
| 75 |
}
|
|
@@ -78,9 +85,10 @@ class Exactor_Sales_Model_Observer {
|
|
| 78 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 79 |
* @return null|string
|
| 80 |
*/
|
| 81 |
-
private function getInvoiceIncrementId($invoice)
|
|
|
|
| 82 |
if ($invoice->getIncrementId() == null) {
|
| 83 |
-
try{
|
| 84 |
$entityType = Mage::getModel('eav/entity_type')->loadByCode("invoice");
|
| 85 |
$invoice->setIncrementId($entityType->fetchNewIncrementId($invoice->getStoreId()));
|
| 86 |
} catch (Exception $e) {
|
|
@@ -93,17 +101,18 @@ class Exactor_Sales_Model_Observer {
|
|
| 93 |
|
| 94 |
/**
|
| 95 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 96 |
-
* @param
|
| 97 |
* @return null
|
| 98 |
*/
|
| 99 |
-
private function commitTransactionForInvoice($invoice, $merchantSettings)
|
|
|
|
| 100 |
try {
|
| 101 |
-
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $invoice->getOrder()->getCreatedAt())){
|
| 102 |
-
$this->logger->info("Order " . $invoice->getOrder()->getIncrementId() ." is not under effective date. Skipping.", "commitTransactionForInvoice");
|
| 103 |
return;
|
| 104 |
}
|
| 105 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 106 |
-
|
| 107 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings);
|
| 108 |
foreach ($invoiceRequests as $invoiceRequest) {
|
| 109 |
$config = ExactorPluginConfig::getInstance();
|
|
@@ -113,7 +122,9 @@ class Exactor_Sales_Model_Observer {
|
|
| 113 |
return null;
|
| 114 |
}
|
| 115 |
}
|
| 116 |
-
$
|
|
|
|
|
|
|
| 117 |
}
|
| 118 |
} catch (Exception $e) {
|
| 119 |
$this->logger->error("Can't commit transaction. See details above. :" . $e->getMessage() . $e->getTraceAsString(), 'commitTransactionForInvoice');
|
|
@@ -122,15 +133,16 @@ class Exactor_Sales_Model_Observer {
|
|
| 122 |
|
| 123 |
/**
|
| 124 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 125 |
-
* @param
|
| 126 |
* @return null
|
| 127 |
*/
|
| 128 |
-
private function refundTransactionForInvoice($invoice, $merchantSettings)
|
|
|
|
| 129 |
try {
|
| 130 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 131 |
-
|
| 132 |
-
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $invoice->getOrder()->getCreatedAt())){
|
| 133 |
-
$this->logger->info("Order " . $invoice->getOrder()->getIncrementId() ." is not under effective date. Skipping.", "refundTransactionForInvoice");
|
| 134 |
return;
|
| 135 |
}
|
| 136 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings);
|
|
@@ -151,11 +163,12 @@ class Exactor_Sales_Model_Observer {
|
|
| 151 |
|
| 152 |
/**
|
| 153 |
* @param Mage_Sales_Model_Order $order
|
| 154 |
-
* @param
|
| 155 |
*/
|
| 156 |
-
private function refundAllInvoicesForOrder($order, $merchantSettings)
|
| 157 |
-
|
| 158 |
-
|
|
|
|
| 159 |
$this->refundTransactionForInvoice($invoice, $merchantSettings);
|
| 160 |
}
|
| 161 |
} catch (Exception $e) {
|
|
@@ -163,10 +176,11 @@ class Exactor_Sales_Model_Observer {
|
|
| 163 |
}
|
| 164 |
}
|
| 165 |
|
| 166 |
-
private function refundTransactionForOrder($order, $merchantSettings)
|
| 167 |
-
|
|
|
|
| 168 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 169 |
-
|
| 170 |
$config = ExactorPluginConfig::getInstance();
|
| 171 |
if ($config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_TRN_FILTER)) {
|
| 172 |
if (!$this->exactorMappingHelper->isAllowedLocation($config->get(EXACTOR_CONFIG_TRN_FILTER), $order->getShippingAddress())) {
|
|
@@ -175,7 +189,7 @@ class Exactor_Sales_Model_Observer {
|
|
| 175 |
}
|
| 176 |
}
|
| 177 |
$exactorProcessingService->refundTransactionForOrder($order->getIncrementId());
|
| 178 |
-
}catch (Exception $e){
|
| 179 |
$this->logger->error("Can't commit transaction. See details above.", 'refundTransactionForOrder');
|
| 180 |
}
|
| 181 |
}
|
|
@@ -187,17 +201,18 @@ class Exactor_Sales_Model_Observer {
|
|
| 187 |
* @param Mage_Sales_Model_Order $order
|
| 188 |
* @return bool
|
| 189 |
*/
|
| 190 |
-
private function processFinishedOrder($order)
|
|
|
|
| 191 |
$merchantSettings = $this->loadMerchantSettings($order);
|
| 192 |
-
if ($merchantSettings==null) return false;
|
| 193 |
-
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $order->getCreatedAt())){
|
| 194 |
-
$this->logger->info("Order " . $order->getIncrementId() ." is not under effective date. Skipping.",
|
| 195 |
"processFinishedOrder");
|
| 196 |
}
|
| 197 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 198 |
-
|
| 199 |
$transactionInfo = $this->sessionCache->popTransactionInfo();
|
| 200 |
-
if ($transactionInfo == null){
|
| 201 |
$this->logger->error('Nothing to process. There is no transaction in the session cache', 'processFinishedOrder');
|
| 202 |
return false;
|
| 203 |
}
|
|
@@ -205,11 +220,10 @@ class Exactor_Sales_Model_Observer {
|
|
| 205 |
$orderId = $order->getIncrementId();
|
| 206 |
$transactionInfo->setShoppingCartTrnId($orderId);
|
| 207 |
// Push latest transaction from the Session to DB
|
| 208 |
-
$this->exactorProcessingService->getPluginCallback()->saveTransactionInfo($transactionInfo
|
| 209 |
// if CommitOption is set up to commit on sales order - do commit the
|
| 210 |
// latest transaction from the session storage
|
| 211 |
-
if ($merchantSettings->getCommitOption() ==
|
| 212 |
-
{
|
| 213 |
$this->logger->info("Commiting transaction for order $orderId - " . $transactionInfo->getExactorTrnId(), 'processFinishedOrder');
|
| 214 |
try {
|
| 215 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoOrder($order, $merchantSettings);
|
|
@@ -219,6 +233,7 @@ class Exactor_Sales_Model_Observer {
|
|
| 219 |
}
|
| 220 |
//$this->exactorProcessingService->commitExistingInvoiceForOrder($orderId);
|
| 221 |
}
|
|
|
|
| 222 |
return true;
|
| 223 |
}
|
| 224 |
|
|
@@ -226,16 +241,17 @@ class Exactor_Sales_Model_Observer {
|
|
| 226 |
* Returns TaxResponse on success, and null - otherwise.
|
| 227 |
*
|
| 228 |
* @param \Mage_Sales_Model_Order $order
|
| 229 |
-
* @param \
|
| 230 |
* @return TaxResponseType
|
| 231 |
*/
|
| 232 |
-
public function commitTransactionForOrder($order, $merchantSettings)
|
|
|
|
| 233 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 234 |
-
|
| 235 |
try {
|
| 236 |
-
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $order->getCreatedAt())){
|
| 237 |
-
$this->logger->info("Order " . $order->getIncrementId() ." is not under effective date. Skipping.",
|
| 238 |
-
|
| 239 |
}
|
| 240 |
$exactorTransaction = $exactorProcessingService->loadTransactionInfoByOrderId($order->getIncrementId());
|
| 241 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoOrder($order, $merchantSettings);
|
|
@@ -252,7 +268,7 @@ class Exactor_Sales_Model_Observer {
|
|
| 252 |
$exactorTransaction->setIsCommited(true);
|
| 253 |
$exactorTransaction->setExactorTrnId($taxResponse->getFirstCommit()->getTransactionId());
|
| 254 |
$exactorProcessingService->getPluginCallback()
|
| 255 |
-
|
| 256 |
return $taxResponse;
|
| 257 |
} else {
|
| 258 |
$this->logger->error("New order should be represented by the single exactor transaction. Is", 'processFinishedOrder');
|
|
@@ -266,13 +282,14 @@ class Exactor_Sales_Model_Observer {
|
|
| 266 |
/**
|
| 267 |
* @param Varien_Event_Observer $observer
|
| 268 |
*/
|
| 269 |
-
public function handleAllOrdersCompleted($observer)
|
|
|
|
| 270 |
$this->logger->trace('called', 'handleAllOrdersCompleted');
|
| 271 |
if (is_array($observer->getOrders()))
|
| 272 |
$orders = array_reverse($observer->getOrders());
|
| 273 |
else
|
| 274 |
$orders = array($observer->getOrder());
|
| 275 |
-
foreach($orders as $order){
|
| 276 |
$this->processFinishedOrder($order);
|
| 277 |
}
|
| 278 |
// We need to clean the session storage here
|
|
@@ -282,17 +299,18 @@ class Exactor_Sales_Model_Observer {
|
|
| 282 |
/**
|
| 283 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 284 |
*/
|
| 285 |
-
private function partialRefund($creditMemo)
|
|
|
|
| 286 |
$merchantSettings = $this->loadMerchantSettings($creditMemo->getOrder());
|
| 287 |
-
if ($merchantSettings==null) return;
|
| 288 |
-
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $creditMemo->getOrder()->getCreatedAt())){
|
| 289 |
-
$this->logger->info("Order " . $creditMemo->getOrder()->getIncrementId() ." is not under effective date. Skipping.", "partialRefund");
|
| 290 |
return;
|
| 291 |
}
|
| 292 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestsForCreditMemo($creditMemo, $merchantSettings);
|
| 293 |
$config = ExactorPluginConfig::getInstance();
|
| 294 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService($merchantSettings->getMerchantID(),
|
| 295 |
-
|
| 296 |
foreach ($invoiceRequests as $invoice) {
|
| 297 |
if ($config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_TRN_FILTER)) {
|
| 298 |
if (!$this->exactorMappingHelper->isAllowedLocation($config->get(EXACTOR_CONFIG_TRN_FILTER), $invoice->getShipTo())) {
|
|
@@ -308,12 +326,52 @@ class Exactor_Sales_Model_Observer {
|
|
| 308 |
// =================================== EVENT HANDLERS =================================================================
|
| 309 |
// ====================================================================================================================
|
| 310 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 311 |
/**
|
| 312 |
* Event will be fired once new order has been created
|
| 313 |
* @param Varien_Event_Observer $observer
|
| 314 |
* @return void
|
| 315 |
*/
|
| 316 |
-
public function handleCreatedOrder($observer)
|
|
|
|
| 317 |
$this->logger->trace('called', 'handleCreatedOrder');
|
| 318 |
if ($this->shouldOrderProcessingRunInCompatibilityMode($observer->getOrder())) {
|
| 319 |
$this->logger->info('Order processing started in compatibility mode.', 'handleCreatedOrder');
|
|
@@ -322,9 +380,11 @@ class Exactor_Sales_Model_Observer {
|
|
| 322 |
}
|
| 323 |
}
|
| 324 |
|
| 325 |
-
private function shouldOrderProcessingRunInCompatibilityMode($order)
|
|
|
|
| 326 |
if ($order->getPayment() != null &&
|
| 327 |
-
strpos($order->getPayment()->getMethod(), "paypal_express") !== false
|
|
|
|
| 328 |
$this->logger->info('PayPal order detected', 'shouldOrderProcessingRunInCompatibilityMode');
|
| 329 |
return true;
|
| 330 |
}
|
|
@@ -335,7 +395,7 @@ class Exactor_Sales_Model_Observer {
|
|
| 335 |
}
|
| 336 |
|
| 337 |
$mageEdition = Mage::getEdition();
|
| 338 |
-
if ($mageEdition == Mage::EDITION_ENTERPRISE && $mageVersionInfo['major']==1 && $mageVersionInfo['minor'] == 8){
|
| 339 |
$this->logger->info('Magento Enterprise detected', 'shouldOrderProcessingRunInCompatibilityMode');
|
| 340 |
return true;
|
| 341 |
}
|
|
@@ -345,21 +405,22 @@ class Exactor_Sales_Model_Observer {
|
|
| 345 |
/**
|
| 346 |
* @param Varien_Event_Observer $observer
|
| 347 |
*/
|
| 348 |
-
public function handleNewCreditMemo(Varien_Event_Observer $observer)
|
|
|
|
| 349 |
$this->logger->trace('called', 'handleNewCreditMemo');
|
| 350 |
$merchantSettings = $this->loadMerchantSettings($observer->getCreditmemo()->getOrder());
|
| 351 |
-
if ($merchantSettings==null) return;
|
| 352 |
// TODO: What about COMMIT on shipment
|
| 353 |
-
if ($merchantSettings->getCommitOption() !=
|
| 354 |
-
if ($merchantSettings->getCommitOption() ==
|
| 355 |
$exactorTrnInfo = $this->exactorProcessingService->loadTransactionInfoByOrderId(
|
| 356 |
$observer->getCreditmemo()->getOrder()->getIncrementId());
|
| 357 |
-
if ($exactorTrnInfo != null && $exactorTrnInfo->getIsCommited()){
|
| 358 |
-
try{
|
| 359 |
$this->refundTransactionForOrder($observer->getCreditmemo()->getOrder(), $merchantSettings);
|
| 360 |
$exactorTrnInfo->setIsCommited(false);
|
| 361 |
$this->exactorProcessingService->getPluginCallback()
|
| 362 |
-
|
| 363 |
} catch (Exception $e) {
|
| 364 |
$this->logger->error("Can't refund credit memo", 'handleNewCreditMemo');
|
| 365 |
}
|
|
@@ -370,11 +431,12 @@ class Exactor_Sales_Model_Observer {
|
|
| 370 |
}
|
| 371 |
}
|
| 372 |
|
| 373 |
-
public function handleCancelOrder(Varien_Event_Observer $observer)
|
|
|
|
| 374 |
$this->logger->trace('called', 'handleCancelOrder');
|
| 375 |
$merchantSettings = $this->loadMerchantSettings($observer->getPayment()->getOrder());
|
| 376 |
-
if ($merchantSettings==null) return;
|
| 377 |
-
if ($merchantSettings->getCommitOption() ==
|
| 378 |
// Just do nothing
|
| 379 |
//$this->refundAllInvoicesForOrder($observer->getPayment()->getOrder(), $merchantSettings);
|
| 380 |
} else {
|
|
@@ -382,45 +444,70 @@ class Exactor_Sales_Model_Observer {
|
|
| 382 |
}
|
| 383 |
}
|
| 384 |
|
| 385 |
-
public function handleNewShipment(Varien_Event_Observer $observer)
|
|
|
|
| 386 |
$this->logger->trace('called', 'handleNewShipment');
|
| 387 |
$merchantSettings = $this->loadMerchantSettings($observer->getShipment()->getOrder());
|
| 388 |
-
if ($merchantSettings==null) return;
|
| 389 |
-
if ($merchantSettings->getCommitOption() ==
|
| 390 |
$this->commitTransactionForOrder($observer->getShipment()->getOrder(), $merchantSettings);
|
| 391 |
}
|
| 392 |
}
|
| 393 |
-
|
| 394 |
-
public function handleCancelInvoice(Varien_Event_Observer $observer)
|
|
|
|
| 395 |
$this->logger->trace('called', 'handleNewInvoice');
|
| 396 |
$merchantSettings = $this->loadMerchantSettings($observer->getInvoice()->getOrder());
|
| 397 |
-
if ($merchantSettings==null) return;
|
| 398 |
-
if ($merchantSettings->getCommitOption() ==
|
| 399 |
$this->refundTransactionForInvoice($observer->getInvoice(), $merchantSettings);
|
| 400 |
}
|
| 401 |
}
|
| 402 |
|
| 403 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 404 |
$this->logger->trace('called', 'handleNewInvoice');
|
| 405 |
-
$
|
| 406 |
-
|
| 407 |
-
|
| 408 |
-
|
| 409 |
-
if ($merchantSettings
|
| 410 |
-
|
| 411 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 412 |
/*$this->invoiceProcessingCompatibilityList[]= $incrementOrderId;*/
|
| 413 |
}
|
| 414 |
}
|
| 415 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 416 |
/**
|
| 417 |
* Checks if target date is under effective date, false - otherwise.
|
| 418 |
*
|
| 419 |
* @param $effectiveDate - Effective date
|
| 420 |
-
* @param $targetDate
|
| 421 |
* @return boolean
|
| 422 |
*/
|
| 423 |
-
private function underEffectiveDate($effectiveDate, $targetDate)
|
|
|
|
| 424 |
$effectiveTimestamp = strtotime($effectiveDate);
|
| 425 |
$targetTimestamp = strtotime('now');
|
| 426 |
if ($targetDate != null) {
|
|
@@ -433,9 +520,10 @@ class Exactor_Sales_Model_Observer {
|
|
| 433 |
* @param Mage_Sales_Model_Order|null $order
|
| 434 |
* @return int
|
| 435 |
*/
|
| 436 |
-
public function getStoreViewId($order=null)
|
|
|
|
| 437 |
$storeId = Mage::app()->getStore()->getId();
|
| 438 |
-
if ($order!=null){
|
| 439 |
$storeId = $order->getStoreId() ? $order->getStoreId() : 0;
|
| 440 |
}
|
| 441 |
return $storeId != 0 ? $storeId : Mage::app()->getDefaultStoreView()->getId();
|
| 1 |
<?php
|
| 2 |
+
|
| 3 |
/**
|
| 4 |
* User: Dmitry Berezovsky
|
| 5 |
* Date: 11/28/11
|
| 6 |
* Time: 12:02 PM
|
| 7 |
*/
|
| 8 |
+
class ZzzzzExactor_Sales_Model_Observer
|
| 9 |
+
{
|
| 10 |
|
| 11 |
+
/** @var ZzzzzExactor_ExactorSettings_Helper_Data */
|
|
|
|
|
|
|
| 12 |
private $exactorSettingsHelper;
|
| 13 |
+
/** @var ZzzzzExactor_Core_Helper_SessionCache */
|
| 14 |
private $sessionCache;
|
| 15 |
+
/** @var ExactorProcessingService */
|
| 16 |
private $exactorProcessingService;
|
| 17 |
/**
|
| 18 |
+
* @var ZzzzzExactor_Tax_Helper_Mapping
|
| 19 |
*/
|
| 20 |
private $exactorMappingHelper;
|
| 21 |
|
| 22 |
+
/** @var Mage_Core_Model_Session_Abstract */
|
| 23 |
+
private $session;
|
| 24 |
+
|
| 25 |
/** @var IExactorLogger */
|
| 26 |
private $logger;
|
| 27 |
|
| 37 |
*/
|
| 38 |
private $invoiceProcessingCompatibilityList = array();
|
| 39 |
|
| 40 |
+
private function setupExactorCommonLibrary()
|
| 41 |
+
{
|
| 42 |
$libDir = Mage::getBaseDir("lib") . '/ExactorCommons';
|
| 43 |
require_once($libDir . '/XmlProcessing.php');
|
| 44 |
require_once($libDir . '/ExactorDomainObjects.php');
|
| 54 |
$this->setupExactorCommonLibrary();
|
| 55 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 56 |
$this->exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 57 |
+
$this->sessionCache = Mage::helper('ZzzzzExactor_Core_SessionCache/');
|
| 58 |
+
$this->session = Mage::getSingleton('core/session', array('name' => 'frontend'));
|
| 59 |
$this->exactorMappingHelper = Mage::helper('tax/mapping');
|
| 60 |
}
|
| 61 |
|
| 62 |
/**
|
| 63 |
* @param Mage_Sales_Model_Order|null $order
|
| 64 |
+
* @return ZzzzzExactor_Core_Model_MerchantSettings|null
|
| 65 |
*/
|
| 66 |
+
private function loadMerchantSettings($order = null)
|
| 67 |
+
{
|
| 68 |
$logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 69 |
$storeViewId = $this->getStoreViewId($order);
|
| 70 |
$merchantSettings = $this->exactorSettingsHelper->loadValidMerchantSettings($storeViewId);
|
| 71 |
|
| 72 |
+
if ($merchantSettings == null) {
|
| 73 |
$logger->error('Settings are not populated.', 'buildExactorProcessingService');
|
| 74 |
$this->exactorProcessingService = null;
|
| 75 |
return null;
|
| 76 |
+
} else {
|
| 77 |
$this->exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService(
|
| 78 |
+
$merchantSettings->getMerchantID(),
|
| 79 |
+
$merchantSettings->getUserID());
|
| 80 |
}
|
| 81 |
return $merchantSettings;
|
| 82 |
}
|
| 85 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 86 |
* @return null|string
|
| 87 |
*/
|
| 88 |
+
private function getInvoiceIncrementId($invoice)
|
| 89 |
+
{
|
| 90 |
if ($invoice->getIncrementId() == null) {
|
| 91 |
+
try {
|
| 92 |
$entityType = Mage::getModel('eav/entity_type')->loadByCode("invoice");
|
| 93 |
$invoice->setIncrementId($entityType->fetchNewIncrementId($invoice->getStoreId()));
|
| 94 |
} catch (Exception $e) {
|
| 101 |
|
| 102 |
/**
|
| 103 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 104 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 105 |
* @return null
|
| 106 |
*/
|
| 107 |
+
private function commitTransactionForInvoice($invoice, $merchantSettings)
|
| 108 |
+
{
|
| 109 |
try {
|
| 110 |
+
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $invoice->getOrder()->getCreatedAt())) {
|
| 111 |
+
$this->logger->info("Order " . $invoice->getOrder()->getIncrementId() . " is not under effective date. Skipping.", "commitTransactionForInvoice");
|
| 112 |
return;
|
| 113 |
}
|
| 114 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 115 |
+
->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
| 116 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings);
|
| 117 |
foreach ($invoiceRequests as $invoiceRequest) {
|
| 118 |
$config = ExactorPluginConfig::getInstance();
|
| 122 |
return null;
|
| 123 |
}
|
| 124 |
}
|
| 125 |
+
$this->_lastInvoiceRequest = $invoiceRequest;
|
| 126 |
+
$this->_lastIncrementId = $this->getInvoiceIncrementId($invoice);
|
| 127 |
+
$exactorProcessingService->partialPayment($invoiceRequest, new DateTime(), $this->_lastIncrementId);
|
| 128 |
}
|
| 129 |
} catch (Exception $e) {
|
| 130 |
$this->logger->error("Can't commit transaction. See details above. :" . $e->getMessage() . $e->getTraceAsString(), 'commitTransactionForInvoice');
|
| 133 |
|
| 134 |
/**
|
| 135 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 136 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 137 |
* @return null
|
| 138 |
*/
|
| 139 |
+
private function refundTransactionForInvoice($invoice, $merchantSettings)
|
| 140 |
+
{
|
| 141 |
try {
|
| 142 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 143 |
+
->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
| 144 |
+
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $invoice->getOrder()->getCreatedAt())) {
|
| 145 |
+
$this->logger->info("Order " . $invoice->getOrder()->getIncrementId() . " is not under effective date. Skipping.", "refundTransactionForInvoice");
|
| 146 |
return;
|
| 147 |
}
|
| 148 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings);
|
| 163 |
|
| 164 |
/**
|
| 165 |
* @param Mage_Sales_Model_Order $order
|
| 166 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 167 |
*/
|
| 168 |
+
private function refundAllInvoicesForOrder($order, $merchantSettings)
|
| 169 |
+
{
|
| 170 |
+
try {
|
| 171 |
+
foreach ($order->getInvoiceCollection() as $invoice) {
|
| 172 |
$this->refundTransactionForInvoice($invoice, $merchantSettings);
|
| 173 |
}
|
| 174 |
} catch (Exception $e) {
|
| 176 |
}
|
| 177 |
}
|
| 178 |
|
| 179 |
+
private function refundTransactionForOrder($order, $merchantSettings)
|
| 180 |
+
{
|
| 181 |
+
try {
|
| 182 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 183 |
+
->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
| 184 |
$config = ExactorPluginConfig::getInstance();
|
| 185 |
if ($config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_TRN_FILTER)) {
|
| 186 |
if (!$this->exactorMappingHelper->isAllowedLocation($config->get(EXACTOR_CONFIG_TRN_FILTER), $order->getShippingAddress())) {
|
| 189 |
}
|
| 190 |
}
|
| 191 |
$exactorProcessingService->refundTransactionForOrder($order->getIncrementId());
|
| 192 |
+
} catch (Exception $e) {
|
| 193 |
$this->logger->error("Can't commit transaction. See details above.", 'refundTransactionForOrder');
|
| 194 |
}
|
| 195 |
}
|
| 201 |
* @param Mage_Sales_Model_Order $order
|
| 202 |
* @return bool
|
| 203 |
*/
|
| 204 |
+
private function processFinishedOrder($order)
|
| 205 |
+
{
|
| 206 |
$merchantSettings = $this->loadMerchantSettings($order);
|
| 207 |
+
if ($merchantSettings == null) return false;
|
| 208 |
+
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $order->getCreatedAt())) {
|
| 209 |
+
$this->logger->info("Order " . $order->getIncrementId() . " is not under effective date. Skipping.",
|
| 210 |
"processFinishedOrder");
|
| 211 |
}
|
| 212 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 213 |
+
->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
| 214 |
$transactionInfo = $this->sessionCache->popTransactionInfo();
|
| 215 |
+
if ($transactionInfo == null) {
|
| 216 |
$this->logger->error('Nothing to process. There is no transaction in the session cache', 'processFinishedOrder');
|
| 217 |
return false;
|
| 218 |
}
|
| 220 |
$orderId = $order->getIncrementId();
|
| 221 |
$transactionInfo->setShoppingCartTrnId($orderId);
|
| 222 |
// Push latest transaction from the Session to DB
|
| 223 |
+
$this->exactorProcessingService->getPluginCallback()->saveTransactionInfo($transactionInfo, $transactionInfo->getSignature());
|
| 224 |
// if CommitOption is set up to commit on sales order - do commit the
|
| 225 |
// latest transaction from the session storage
|
| 226 |
+
if ($merchantSettings->getCommitOption() == ZzzzzExactor_Core_Model_MerchantSettings::COMMIT_ON_SALES_ORDER) {
|
|
|
|
| 227 |
$this->logger->info("Commiting transaction for order $orderId - " . $transactionInfo->getExactorTrnId(), 'processFinishedOrder');
|
| 228 |
try {
|
| 229 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoOrder($order, $merchantSettings);
|
| 233 |
}
|
| 234 |
//$this->exactorProcessingService->commitExistingInvoiceForOrder($orderId);
|
| 235 |
}
|
| 236 |
+
$this->session->setLastInvoiceResponse(null);
|
| 237 |
return true;
|
| 238 |
}
|
| 239 |
|
| 241 |
* Returns TaxResponse on success, and null - otherwise.
|
| 242 |
*
|
| 243 |
* @param \Mage_Sales_Model_Order $order
|
| 244 |
+
* @param \ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 245 |
* @return TaxResponseType
|
| 246 |
*/
|
| 247 |
+
public function commitTransactionForOrder($order, $merchantSettings)
|
| 248 |
+
{
|
| 249 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 250 |
+
->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
| 251 |
try {
|
| 252 |
+
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $order->getCreatedAt())) {
|
| 253 |
+
$this->logger->info("Order " . $order->getIncrementId() . " is not under effective date. Skipping.",
|
| 254 |
+
"commitTransactionForOrder");
|
| 255 |
}
|
| 256 |
$exactorTransaction = $exactorProcessingService->loadTransactionInfoByOrderId($order->getIncrementId());
|
| 257 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoOrder($order, $merchantSettings);
|
| 268 |
$exactorTransaction->setIsCommited(true);
|
| 269 |
$exactorTransaction->setExactorTrnId($taxResponse->getFirstCommit()->getTransactionId());
|
| 270 |
$exactorProcessingService->getPluginCallback()
|
| 271 |
+
->saveTransactionInfo($exactorTransaction, $exactorTransaction->getSignature());
|
| 272 |
return $taxResponse;
|
| 273 |
} else {
|
| 274 |
$this->logger->error("New order should be represented by the single exactor transaction. Is", 'processFinishedOrder');
|
| 282 |
/**
|
| 283 |
* @param Varien_Event_Observer $observer
|
| 284 |
*/
|
| 285 |
+
public function handleAllOrdersCompleted($observer)
|
| 286 |
+
{
|
| 287 |
$this->logger->trace('called', 'handleAllOrdersCompleted');
|
| 288 |
if (is_array($observer->getOrders()))
|
| 289 |
$orders = array_reverse($observer->getOrders());
|
| 290 |
else
|
| 291 |
$orders = array($observer->getOrder());
|
| 292 |
+
foreach ($orders as $order) {
|
| 293 |
$this->processFinishedOrder($order);
|
| 294 |
}
|
| 295 |
// We need to clean the session storage here
|
| 299 |
/**
|
| 300 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 301 |
*/
|
| 302 |
+
private function partialRefund($creditMemo)
|
| 303 |
+
{
|
| 304 |
$merchantSettings = $this->loadMerchantSettings($creditMemo->getOrder());
|
| 305 |
+
if ($merchantSettings == null) return;
|
| 306 |
+
if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $creditMemo->getOrder()->getCreatedAt())) {
|
| 307 |
+
$this->logger->info("Order " . $creditMemo->getOrder()->getIncrementId() . " is not under effective date. Skipping.", "partialRefund");
|
| 308 |
return;
|
| 309 |
}
|
| 310 |
$invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestsForCreditMemo($creditMemo, $merchantSettings);
|
| 311 |
$config = ExactorPluginConfig::getInstance();
|
| 312 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService($merchantSettings->getMerchantID(),
|
| 313 |
+
$merchantSettings->getUserID());
|
| 314 |
foreach ($invoiceRequests as $invoice) {
|
| 315 |
if ($config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_TRN_FILTER)) {
|
| 316 |
if (!$this->exactorMappingHelper->isAllowedLocation($config->get(EXACTOR_CONFIG_TRN_FILTER), $invoice->getShipTo())) {
|
| 326 |
// =================================== EVENT HANDLERS =================================================================
|
| 327 |
// ====================================================================================================================
|
| 328 |
|
| 329 |
+
public function handleBeforeSaveQuote($observer)
|
| 330 |
+
{
|
| 331 |
+
$invoiceResponse = unserialize($this->session->getLastInvoiceResponse());
|
| 332 |
+
if (!$invoiceResponse) return;
|
| 333 |
+
// Restore line item tax broken by third-party extensions
|
| 334 |
+
$quote = $observer->getQuote();
|
| 335 |
+
|
| 336 |
+
/**
|
| 337 |
+
* @var Mage_Sales_Model_Quote_Item $item
|
| 338 |
+
*/
|
| 339 |
+
foreach ($quote->getAllItems() as $item) {
|
| 340 |
+
$taxResultItem = $invoiceResponse->getItemById($this->exactorMappingHelper->buildExactorItemId($item));
|
| 341 |
+
// If there is no item in response - set tax to 0
|
| 342 |
+
if ($taxResultItem == null) {
|
| 343 |
+
$item->setTaxAmount(0);
|
| 344 |
+
$item->setBaseTaxAmount(0);
|
| 345 |
+
$item->setTaxPercent(0);
|
| 346 |
+
} else { // Else - Apply tax to the item
|
| 347 |
+
$item->setTaxAmount($taxResultItem->getTotalTaxAmount());
|
| 348 |
+
$item->setBaseTaxAmount($taxResultItem->getTotalTaxAmount());
|
| 349 |
+
$this->applyTaxPercent($item, $taxResultItem);
|
| 350 |
+
}
|
| 351 |
+
}
|
| 352 |
+
}
|
| 353 |
+
|
| 354 |
+
/**
|
| 355 |
+
* @param Mage_Sales_Model_Quote_Item $quoteItem
|
| 356 |
+
* @param ResponseLineItem $resultItem
|
| 357 |
+
*/
|
| 358 |
+
private function applyTaxPercent($quoteItem, $resultItem)
|
| 359 |
+
{
|
| 360 |
+
$taxPercent = 0;
|
| 361 |
+
foreach ($resultItem->getTaxInfo() as $taxInfo) {
|
| 362 |
+
$taxPercent += $taxInfo->getTaxRate();
|
| 363 |
+
}
|
| 364 |
+
$taxPercent *= 100;
|
| 365 |
+
$quoteItem->setTaxPercent($taxPercent);
|
| 366 |
+
}
|
| 367 |
+
|
| 368 |
/**
|
| 369 |
* Event will be fired once new order has been created
|
| 370 |
* @param Varien_Event_Observer $observer
|
| 371 |
* @return void
|
| 372 |
*/
|
| 373 |
+
public function handleCreatedOrder($observer)
|
| 374 |
+
{
|
| 375 |
$this->logger->trace('called', 'handleCreatedOrder');
|
| 376 |
if ($this->shouldOrderProcessingRunInCompatibilityMode($observer->getOrder())) {
|
| 377 |
$this->logger->info('Order processing started in compatibility mode.', 'handleCreatedOrder');
|
| 380 |
}
|
| 381 |
}
|
| 382 |
|
| 383 |
+
private function shouldOrderProcessingRunInCompatibilityMode($order)
|
| 384 |
+
{
|
| 385 |
if ($order->getPayment() != null &&
|
| 386 |
+
strpos($order->getPayment()->getMethod(), "paypal_express") !== false
|
| 387 |
+
) {
|
| 388 |
$this->logger->info('PayPal order detected', 'shouldOrderProcessingRunInCompatibilityMode');
|
| 389 |
return true;
|
| 390 |
}
|
| 395 |
}
|
| 396 |
|
| 397 |
$mageEdition = Mage::getEdition();
|
| 398 |
+
if ($mageEdition == Mage::EDITION_ENTERPRISE && $mageVersionInfo['major'] == 1 && $mageVersionInfo['minor'] == 8) {
|
| 399 |
$this->logger->info('Magento Enterprise detected', 'shouldOrderProcessingRunInCompatibilityMode');
|
| 400 |
return true;
|
| 401 |
}
|
| 405 |
/**
|
| 406 |
* @param Varien_Event_Observer $observer
|
| 407 |
*/
|
| 408 |
+
public function handleNewCreditMemo(Varien_Event_Observer $observer)
|
| 409 |
+
{
|
| 410 |
$this->logger->trace('called', 'handleNewCreditMemo');
|
| 411 |
$merchantSettings = $this->loadMerchantSettings($observer->getCreditmemo()->getOrder());
|
| 412 |
+
if ($merchantSettings == null) return;
|
| 413 |
// TODO: What about COMMIT on shipment
|
| 414 |
+
if ($merchantSettings->getCommitOption() != ZzzzzExactor_Core_Model_MerchantSettings::COMMIT_NEVER) {
|
| 415 |
+
if ($merchantSettings->getCommitOption() == ZzzzzExactor_Core_Model_MerchantSettings::COMMIT_ON_SHIPMENT) {
|
| 416 |
$exactorTrnInfo = $this->exactorProcessingService->loadTransactionInfoByOrderId(
|
| 417 |
$observer->getCreditmemo()->getOrder()->getIncrementId());
|
| 418 |
+
if ($exactorTrnInfo != null && $exactorTrnInfo->getIsCommited()) {
|
| 419 |
+
try {
|
| 420 |
$this->refundTransactionForOrder($observer->getCreditmemo()->getOrder(), $merchantSettings);
|
| 421 |
$exactorTrnInfo->setIsCommited(false);
|
| 422 |
$this->exactorProcessingService->getPluginCallback()
|
| 423 |
+
->saveTransactionInfo($exactorTrnInfo, $exactorTrnInfo->getSignature());
|
| 424 |
} catch (Exception $e) {
|
| 425 |
$this->logger->error("Can't refund credit memo", 'handleNewCreditMemo');
|
| 426 |
}
|
| 431 |
}
|
| 432 |
}
|
| 433 |
|
| 434 |
+
public function handleCancelOrder(Varien_Event_Observer $observer)
|
| 435 |
+
{
|
| 436 |
$this->logger->trace('called', 'handleCancelOrder');
|
| 437 |
$merchantSettings = $this->loadMerchantSettings($observer->getPayment()->getOrder());
|
| 438 |
+
if ($merchantSettings == null) return;
|
| 439 |
+
if ($merchantSettings->getCommitOption() == ZzzzzExactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE) {
|
| 440 |
// Just do nothing
|
| 441 |
//$this->refundAllInvoicesForOrder($observer->getPayment()->getOrder(), $merchantSettings);
|
| 442 |
} else {
|
| 444 |
}
|
| 445 |
}
|
| 446 |
|
| 447 |
+
public function handleNewShipment(Varien_Event_Observer $observer)
|
| 448 |
+
{
|
| 449 |
$this->logger->trace('called', 'handleNewShipment');
|
| 450 |
$merchantSettings = $this->loadMerchantSettings($observer->getShipment()->getOrder());
|
| 451 |
+
if ($merchantSettings == null) return;
|
| 452 |
+
if ($merchantSettings->getCommitOption() == ZzzzzExactor_Core_Model_MerchantSettings::COMMIT_ON_SHIPMENT) {
|
| 453 |
$this->commitTransactionForOrder($observer->getShipment()->getOrder(), $merchantSettings);
|
| 454 |
}
|
| 455 |
}
|
| 456 |
+
|
| 457 |
+
public function handleCancelInvoice(Varien_Event_Observer $observer)
|
| 458 |
+
{
|
| 459 |
$this->logger->trace('called', 'handleNewInvoice');
|
| 460 |
$merchantSettings = $this->loadMerchantSettings($observer->getInvoice()->getOrder());
|
| 461 |
+
if ($merchantSettings == null) return;
|
| 462 |
+
if ($merchantSettings->getCommitOption() == ZzzzzExactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE) {
|
| 463 |
$this->refundTransactionForInvoice($observer->getInvoice(), $merchantSettings);
|
| 464 |
}
|
| 465 |
}
|
| 466 |
|
| 467 |
+
private $_lastInvoiceRequest = null;
|
| 468 |
+
private $_lastIncrementId = null;
|
| 469 |
+
|
| 470 |
+
public function handleNewInvoice(Varien_Event_Observer $observer)
|
| 471 |
+
{
|
| 472 |
$this->logger->trace('called', 'handleNewInvoice');
|
| 473 |
+
$this->_lastInvoiceRequest = null;
|
| 474 |
+
$this->_lastIncrementId = null;
|
| 475 |
+
$invoice = $observer->getInvoice();
|
| 476 |
+
$merchantSettings = $this->loadMerchantSettings($invoice->getOrder());
|
| 477 |
+
if ($merchantSettings == null) return;
|
| 478 |
+
|
| 479 |
+
if ($invoice->getOrder()->getPayment()->getMethodInstance()->isGateway() && $invoice->roundPrice($invoice->getBaseGrandTotal()) <= 0) {
|
| 480 |
+
$this->logger->info('Order ' . $invoice->getOrder()->getIncrementId() . ' with zero amount cannot be paid with Gateway!', 'handleNewInvoice');
|
| 481 |
+
return;
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
if ($merchantSettings->getCommitOption() == ZzzzzExactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE
|
| 485 |
+
/* && !in_array($incrementOrderId, $this->invoiceProcessingCompatibilityList)*/
|
| 486 |
+
) { // If flag is set this means that invoice has been handled already in compatibility mode.
|
| 487 |
+
$this->commitTransactionForInvoice($invoice, $merchantSettings);
|
| 488 |
/*$this->invoiceProcessingCompatibilityList[]= $incrementOrderId;*/
|
| 489 |
}
|
| 490 |
}
|
| 491 |
|
| 492 |
+
public function handleSubmitFailure(Varien_Event_Observer $observer)
|
| 493 |
+
{
|
| 494 |
+
$this->logger->trace('called', 'handleSubmitFailure');
|
| 495 |
+
if ($this->_lastInvoiceRequest == null) return;
|
| 496 |
+
$merchantSettings = $this->loadMerchantSettings($observer->getOrder());
|
| 497 |
+
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
|
| 498 |
+
->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
| 499 |
+
$exactorProcessingService->partialRefund($this->_lastInvoiceRequest, new DateTime(), $this->_lastIncrementId);
|
| 500 |
+
}
|
| 501 |
+
|
| 502 |
/**
|
| 503 |
* Checks if target date is under effective date, false - otherwise.
|
| 504 |
*
|
| 505 |
* @param $effectiveDate - Effective date
|
| 506 |
+
* @param $targetDate - Date to check
|
| 507 |
* @return boolean
|
| 508 |
*/
|
| 509 |
+
private function underEffectiveDate($effectiveDate, $targetDate)
|
| 510 |
+
{
|
| 511 |
$effectiveTimestamp = strtotime($effectiveDate);
|
| 512 |
$targetTimestamp = strtotime('now');
|
| 513 |
if ($targetDate != null) {
|
| 520 |
* @param Mage_Sales_Model_Order|null $order
|
| 521 |
* @return int
|
| 522 |
*/
|
| 523 |
+
public function getStoreViewId($order = null)
|
| 524 |
+
{
|
| 525 |
$storeId = Mage::app()->getStore()->getId();
|
| 526 |
+
if ($order != null) {
|
| 527 |
$storeId = $order->getStoreId() ? $order->getStoreId() : 0;
|
| 528 |
}
|
| 529 |
return $storeId != 0 ? $storeId : Mage::app()->getDefaultStoreView()->getId();
|
app/code/local/{Exactor → ZzzzzExactor}/Sales/etc/config.xml
RENAMED
|
@@ -20,24 +20,34 @@
|
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
-
* @package
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
-
|
| 30 |
-
<
|
| 31 |
<version>2012.10.19</version>
|
| 32 |
-
</
|
| 33 |
</modules>
|
| 34 |
<global>
|
| 35 |
<events>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
<checkout_submit_all_after>
|
| 37 |
<observers>
|
| 38 |
<exactor_sales_observer>
|
| 39 |
<type>singleton</type>
|
| 40 |
-
<class>
|
| 41 |
<method>handleAllOrdersCompleted</method>
|
| 42 |
</exactor_sales_observer>
|
| 43 |
</observers>
|
|
@@ -46,7 +56,7 @@
|
|
| 46 |
<observers>
|
| 47 |
<exactor_sales_observer>
|
| 48 |
<type>singleton</type>
|
| 49 |
-
<class>
|
| 50 |
<method>handleCreatedOrder</method>
|
| 51 |
</exactor_sales_observer>
|
| 52 |
</observers>
|
|
@@ -55,16 +65,25 @@
|
|
| 55 |
<observers>
|
| 56 |
<exactor_sales_observer>
|
| 57 |
<type>singleton</type>
|
| 58 |
-
<class>
|
| 59 |
<method>handleNewCreditMemo</method>
|
| 60 |
</exactor_sales_observer>
|
| 61 |
</observers>
|
| 62 |
</sales_order_creditmemo_refund>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
<sales_order_payment_cancel>
|
| 64 |
<observers>
|
| 65 |
<exactor_sales_observer>
|
| 66 |
<type>singleton</type>
|
| 67 |
-
<class>
|
| 68 |
<method>handleCancelOrder</method>
|
| 69 |
</exactor_sales_observer>
|
| 70 |
</observers>
|
|
@@ -73,7 +92,7 @@
|
|
| 73 |
<observers>
|
| 74 |
<exactor_sales_observer>
|
| 75 |
<type>singleton</type>
|
| 76 |
-
<class>
|
| 77 |
<method>handleNewShipment</method>
|
| 78 |
</exactor_sales_observer>
|
| 79 |
</observers>
|
|
@@ -82,7 +101,7 @@
|
|
| 82 |
<observers>
|
| 83 |
<exactor_sales_observer>
|
| 84 |
<type>singleton</type>
|
| 85 |
-
<class>
|
| 86 |
<method>handleNewInvoice</method>
|
| 87 |
</exactor_sales_observer>
|
| 88 |
</observers>
|
|
@@ -91,7 +110,7 @@
|
|
| 91 |
<observers>
|
| 92 |
<exactor_sales_observer>
|
| 93 |
<type>singleton</type>
|
| 94 |
-
<class>
|
| 95 |
<method>handleCancelInvoice</method>
|
| 96 |
</exactor_sales_observer>
|
| 97 |
</observers>
|
|
@@ -100,7 +119,8 @@
|
|
| 100 |
<models>
|
| 101 |
<tax>
|
| 102 |
<rewrite>
|
| 103 |
-
<sales_model_order_creditmemo_total_tax>
|
|
|
|
| 104 |
</rewrite>
|
| 105 |
</tax>
|
| 106 |
</models>
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
+
* @package ZzzzzExactor_Sales
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
+
<modules>
|
| 30 |
+
<ZzzzzExactor_Sales>
|
| 31 |
<version>2012.10.19</version>
|
| 32 |
+
</ZzzzzExactor_Sales>
|
| 33 |
</modules>
|
| 34 |
<global>
|
| 35 |
<events>
|
| 36 |
+
|
| 37 |
+
<sales_quote_save_before>
|
| 38 |
+
<observers>
|
| 39 |
+
<exactor_sales_observer>
|
| 40 |
+
<type>singleton</type>
|
| 41 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 42 |
+
<method>handleBeforeSaveQuote</method>
|
| 43 |
+
</exactor_sales_observer>
|
| 44 |
+
</observers>
|
| 45 |
+
</sales_quote_save_before>
|
| 46 |
<checkout_submit_all_after>
|
| 47 |
<observers>
|
| 48 |
<exactor_sales_observer>
|
| 49 |
<type>singleton</type>
|
| 50 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 51 |
<method>handleAllOrdersCompleted</method>
|
| 52 |
</exactor_sales_observer>
|
| 53 |
</observers>
|
| 56 |
<observers>
|
| 57 |
<exactor_sales_observer>
|
| 58 |
<type>singleton</type>
|
| 59 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 60 |
<method>handleCreatedOrder</method>
|
| 61 |
</exactor_sales_observer>
|
| 62 |
</observers>
|
| 65 |
<observers>
|
| 66 |
<exactor_sales_observer>
|
| 67 |
<type>singleton</type>
|
| 68 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 69 |
<method>handleNewCreditMemo</method>
|
| 70 |
</exactor_sales_observer>
|
| 71 |
</observers>
|
| 72 |
</sales_order_creditmemo_refund>
|
| 73 |
+
<sales_model_service_quote_submit_failure>
|
| 74 |
+
<observers>
|
| 75 |
+
<exactor_sales_observer>
|
| 76 |
+
<type>singleton</type>
|
| 77 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 78 |
+
<method>handleSubmitFailure</method>
|
| 79 |
+
</exactor_sales_observer>
|
| 80 |
+
</observers>
|
| 81 |
+
</sales_model_service_quote_submit_failure>
|
| 82 |
<sales_order_payment_cancel>
|
| 83 |
<observers>
|
| 84 |
<exactor_sales_observer>
|
| 85 |
<type>singleton</type>
|
| 86 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 87 |
<method>handleCancelOrder</method>
|
| 88 |
</exactor_sales_observer>
|
| 89 |
</observers>
|
| 92 |
<observers>
|
| 93 |
<exactor_sales_observer>
|
| 94 |
<type>singleton</type>
|
| 95 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 96 |
<method>handleNewShipment</method>
|
| 97 |
</exactor_sales_observer>
|
| 98 |
</observers>
|
| 101 |
<observers>
|
| 102 |
<exactor_sales_observer>
|
| 103 |
<type>singleton</type>
|
| 104 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 105 |
<method>handleNewInvoice</method>
|
| 106 |
</exactor_sales_observer>
|
| 107 |
</observers>
|
| 110 |
<observers>
|
| 111 |
<exactor_sales_observer>
|
| 112 |
<type>singleton</type>
|
| 113 |
+
<class>ZzzzzExactor_Sales_Model_Observer</class>
|
| 114 |
<method>handleCancelInvoice</method>
|
| 115 |
</exactor_sales_observer>
|
| 116 |
</observers>
|
| 119 |
<models>
|
| 120 |
<tax>
|
| 121 |
<rewrite>
|
| 122 |
+
<sales_model_order_creditmemo_total_tax>ZzzzzExactor_Sales_Model_Order_Creditmemo_Total_Tax
|
| 123 |
+
</sales_model_order_creditmemo_total_tax>
|
| 124 |
</rewrite>
|
| 125 |
</tax>
|
| 126 |
</models>
|
app/code/local/{Exactor → ZzzzzExactor}/Tax/Helper/Calculation.php
RENAMED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Time: 1:12 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
-
class
|
| 9 |
|
| 10 |
private $logger;
|
| 11 |
|
| 5 |
* Time: 1:12 PM
|
| 6 |
*/
|
| 7 |
|
| 8 |
+
class ZzzzzExactor_Tax_Helper_Calculation extends Mage_Core_Helper_Abstract {
|
| 9 |
|
| 10 |
private $logger;
|
| 11 |
|
app/code/local/{Exactor → ZzzzzExactor}/Tax/Helper/Mapping.php
RENAMED
|
@@ -4,18 +4,22 @@
|
|
| 4 |
* Date: 4/20/12
|
| 5 |
* Time: 1:12 PM
|
| 6 |
*/
|
| 7 |
-
|
| 8 |
-
class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
| 9 |
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
| 13 |
const EUC_HANDLING = 'EUC-13010301';
|
| 14 |
const EUC_NON_TAXABLE = 'EUC-99990101';
|
| 15 |
const EUC_GIFT_CARD = self::EUC_NON_TAXABLE;
|
| 16 |
-
const EUC_STORE_CREDIT = self::EUC_NON_TAXABLE;
|
| 17 |
|
|
|
|
|
|
|
|
|
|
| 18 |
const MSG_DEFAULT_SHIPPING_NAME = 'Default Shipping';
|
|
|
|
| 19 |
const MSG_HANDLING_FEE = 'Handling Fee';
|
| 20 |
const MSG_ADJUSTMENTS = 'Adjustments';
|
| 21 |
const MSG_SHIPPING_DESCRIPTION_PREFIX = 'Shipping Fee: ';
|
|
@@ -23,29 +27,30 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 23 |
const MSG_DISCOUNTED_BY = 'Discounted by $';
|
| 24 |
const MSG_ADJUSTMENTS_REFUND = "Adjustments Refund";
|
| 25 |
const MSG_GIFT_CARD_ITEM = "Gift card(-s)";
|
| 26 |
-
const MSG_STORE_CREDIT_ITEM = "Store credit";
|
| 27 |
|
|
|
|
| 28 |
const LINE_ITEM_ID_SHIPPING = "SHIPPING";
|
| 29 |
const LINE_ITEM_ID_HANDLING = "HANDLING";
|
| 30 |
const LINE_ITEM_ID_ADJUSTMENTS = "ADJUSTMENTS";
|
| 31 |
const LINE_ITEM_ID_GIFT_CARD = "GIFT_CARD";
|
| 32 |
const LINE_ITEM_ID_STORE_CREDIT = "STORE_CREDIT";
|
|
|
|
|
|
|
| 33 |
const INDEXED_LINE_ITEM_ID_PREFIX = '_';
|
| 34 |
|
| 35 |
const ATTRIBUTE_NAME_EXEMPTION = 'taxvat';
|
| 36 |
|
| 37 |
const MAX_SKU_CODE_LENGTH = 32;
|
| 38 |
|
| 39 |
-
private $logger;
|
| 40 |
|
|
|
|
| 41 |
|
| 42 |
const PO_ESTIMATE_TEXT = 'Estimated Tax ';
|
| 43 |
-
|
| 44 |
const UNKNOWN_STREET_TEXT = "";
|
| 45 |
const UNKNOWN_STATE_NAME = "UNKNOWN";
|
| 46 |
-
const UNKNOWN_ZIP_CODE = "00000";
|
| 47 |
|
| 48 |
|
|
|
|
| 49 |
const PRICE_TYPE_DYNAMIC = 0;
|
| 50 |
|
| 51 |
/**
|
|
@@ -55,7 +60,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 55 |
public function buildExactorItemId($magentoItem)
|
| 56 |
{
|
| 57 |
$itemId = $magentoItem->getId();
|
| 58 |
-
if ((defined('EXACTOR_BUILD_CUSTOM_ITEM_KEY') && constant('EXACTOR_BUILD_CUSTOM_ITEM_KEY')) || empty($itemId)){
|
| 59 |
$itemId = base64_encode(join(':', array($magentoItem->getSku(), $magentoItem->getProductId(),
|
| 60 |
$magentoItem->getRowTotal(), $magentoItem->getQtyOrdered())));
|
| 61 |
$this->getLogger()->info("Building custom item key: " . $itemId);
|
|
@@ -63,8 +68,9 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 63 |
return self::INDEXED_LINE_ITEM_ID_PREFIX . $itemId;
|
| 64 |
}
|
| 65 |
|
| 66 |
-
private function getLogger()
|
| 67 |
-
|
|
|
|
| 68 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 69 |
return $this->logger;
|
| 70 |
}
|
|
@@ -80,7 +86,8 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 80 |
* @param $middleName
|
| 81 |
* @return string
|
| 82 |
*/
|
| 83 |
-
private function buildFullName($firstName, $lastName, $middleName=null)
|
|
|
|
| 84 |
$parts = array($firstName, $middleName, $lastName);
|
| 85 |
return join(' ', $parts);
|
| 86 |
}
|
|
@@ -89,15 +96,16 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 89 |
* @param Mage_Customer_Model_Address_Abstract $address
|
| 90 |
* @return AddressType|null
|
| 91 |
*/
|
| 92 |
-
private function buildExactorAddressForAbstractAddress($address)
|
|
|
|
| 93 |
$exactorAddress = new AddressType();
|
| 94 |
-
if ($address==null) return null;
|
| 95 |
// Set defaults
|
| 96 |
$exactorAddress->setStreet1(self::UNKNOWN_STREET_TEXT);
|
| 97 |
$exactorAddress->setFullName("Unknown Buyer");
|
| 98 |
//
|
| 99 |
-
$fullName = trim($address->getName())
|
| 100 |
-
if (strlen($fullName)>0)
|
| 101 |
$exactorAddress->setFullName($fullName);
|
| 102 |
if ($address->getStreetFull() != null)
|
| 103 |
$exactorAddress->setStreet1($address->getStreetFull());
|
|
@@ -107,7 +115,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 107 |
$exactorAddress->setPostalCode($address->getPostcode());
|
| 108 |
// It is possible that postal code or state will be missing (e.g. the tax estimation form)
|
| 109 |
// In this case we will try to determine region basing on the given Postal Code
|
| 110 |
-
if (strlen(trim($exactorAddress->getStateOrProvince()))==0 && strlen(trim($exactorAddress->getPostalCode()))!=0){
|
| 111 |
$exactorAddress->setStateOrProvince(RegionResolver::getInstance()->getStateOrProvinceByCode(trim($exactorAddress->getPostalCode())));
|
| 112 |
}
|
| 113 |
if (!$exactorAddress->hasData()) return null;
|
|
@@ -118,7 +126,8 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 118 |
* @param Mage_Sales_Model_Order_Address $address
|
| 119 |
* @return AddressType|null
|
| 120 |
*/
|
| 121 |
-
public function buildExactorAddressForOrderAddress($address)
|
|
|
|
| 122 |
return $this->buildExactorAddressForAbstractAddress($address);
|
| 123 |
}
|
| 124 |
|
|
@@ -126,47 +135,50 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 126 |
* @param Mage_Sales_Model_Quote_Address $address
|
| 127 |
* @return AddressType|null
|
| 128 |
*/
|
| 129 |
-
public function buildExactorAddressForQuoteAddress($address)
|
|
|
|
| 130 |
return $this->buildExactorAddressForAbstractAddress($address);
|
| 131 |
}
|
| 132 |
|
| 133 |
/**
|
| 134 |
* @param Mage_Sales_Model_Quote_Item_Abstract $magentoItem
|
| 135 |
-
* @param
|
| 136 |
* @return string
|
| 137 |
*/
|
| 138 |
-
public function getSKUForItem($magentoItem, $merchantSettings)
|
| 139 |
-
|
|
|
|
| 140 |
$product = $magentoItem->getProduct();
|
| 141 |
if ($product == null)
|
| 142 |
$product = Mage::getModel('catalog/product')
|
| 143 |
->setStoreId($magentoItem->getStoreId())
|
| 144 |
->load($magentoItem->getProductId());
|
| 145 |
-
switch ($merchantSettings->getSourceOfSKU()){
|
| 146 |
-
case
|
| 147 |
$sku = '';
|
| 148 |
break;
|
| 149 |
-
case
|
| 150 |
$sku = $magentoItem->getSku();
|
| 151 |
break;
|
| 152 |
-
case
|
| 153 |
$attributeSetName = 'Default';
|
| 154 |
-
try{
|
| 155 |
$attributeSetModel = Mage::getModel("eav/entity_attribute_set");
|
| 156 |
$attributeSetModel->load($product->getAttributeSetId());
|
| 157 |
-
$attributeSetName
|
| 158 |
-
}catch(Exception $e){
|
|
|
|
| 159 |
$sku = $attributeSetName;
|
| 160 |
break;
|
| 161 |
-
case
|
| 162 |
$category = $product->getCategory();
|
| 163 |
if ($category != null)
|
| 164 |
$sku = $category->getName();
|
| 165 |
break;
|
| 166 |
-
case
|
| 167 |
-
/** @var Mage_Tax_Model_Mysql4_Class_Collection $taxClassCollection
|
| 168 |
$taxClassCollection = Mage::getModel('tax/class')->getCollection();
|
| 169 |
-
/** @var Mage_Tax_Model_Class $taxClass
|
| 170 |
$taxClass = $taxClassCollection->getItemById($product->getTaxClassId());
|
| 171 |
if ($taxClass == null) $sku = ''; else $sku = $taxClass->getClassName();
|
| 172 |
break;
|
|
@@ -174,11 +186,12 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 174 |
return substr($sku, self::PRICE_TYPE_DYNAMIC, self::MAX_SKU_CODE_LENGTH); // Max length for SKU is 32 characters
|
| 175 |
}
|
| 176 |
|
| 177 |
-
private function isUSPSShipping($methodName)
|
|
|
|
| 178 |
$uspsShippingNames = array('USPS', 'Mail', 'Post', 'USPostal');
|
| 179 |
// Remove all spaces and dots from the original name to simplify search
|
| 180 |
-
$methodName = preg_replace('/[\.\s]/',''
|
| 181 |
-
foreach($uspsShippingNames as $currName){
|
| 182 |
if (stristr($methodName, $currName)) return true;
|
| 183 |
}
|
| 184 |
return false;
|
|
@@ -186,30 +199,32 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 186 |
|
| 187 |
/**
|
| 188 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 189 |
-
* @param
|
| 190 |
* @return LineItemType|null
|
| 191 |
*/
|
| 192 |
-
public function getShippingLineItemForQuoteAddress($quoteAddress, $merchantSettings)
|
|
|
|
| 193 |
|
| 194 |
if ($quoteAddress->getAddressType() == Mage_Sales_Model_Quote_Address::TYPE_BILLING) return null; // There is no shipping fees there
|
| 195 |
-
if ($quoteAddress->getShippingAmount()==0) return null;
|
| 196 |
$shippingLineItem = $this->getShippingLineItem($merchantSettings, $quoteAddress->getShippingMethod(),
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 200 |
return $shippingLineItem;
|
| 201 |
}
|
| 202 |
|
| 203 |
/**
|
| 204 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 205 |
-
* @param
|
| 206 |
* @return LineItemType|null
|
| 207 |
*/
|
| 208 |
-
public function getShippingLineItemForCreditMemo($creditMemo, $merchantSettings)
|
| 209 |
-
|
|
|
|
| 210 |
$lineItem = $this->getShippingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod(),
|
| 211 |
-
|
| 212 |
-
|
| 213 |
// For refunds we shouldn't subtract handling amount
|
| 214 |
$lineItem->setGrossAmount($creditMemo->getShippingAmount());
|
| 215 |
return $lineItem;
|
|
@@ -217,46 +232,54 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 217 |
|
| 218 |
/**
|
| 219 |
* @param Mage_Sales_Model_Order $order
|
| 220 |
-
* @param
|
| 221 |
* @return LineItemType|null
|
| 222 |
*/
|
| 223 |
-
public function getShippingLineItemForOrder($order, $merchantSettings)
|
|
|
|
| 224 |
if ($order->getBaseShippingAmount() == 0) return null;
|
| 225 |
$lineItem = $this->getShippingLineItem($merchantSettings, $order->getShippingMethod(),
|
| 226 |
-
|
| 227 |
-
|
|
|
|
| 228 |
return $lineItem;
|
| 229 |
}
|
| 230 |
|
| 231 |
/**
|
| 232 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 233 |
-
* @param
|
| 234 |
* @return LineItemType|null
|
| 235 |
*/
|
| 236 |
-
public function getShippingLineItemForInvoice($invoice, $merchantSettings)
|
|
|
|
| 237 |
if ($invoice->getBaseShippingAmount() == 0) return null;
|
| 238 |
return $this->getShippingLineItemForOrder($invoice->getOrder(), $merchantSettings);
|
| 239 |
}
|
| 240 |
|
| 241 |
/**
|
| 242 |
-
* @param
|
| 243 |
* @param $carrierName
|
| 244 |
* @param $carrierDescription
|
| 245 |
* @param $amount
|
| 246 |
* @param int $discount
|
| 247 |
* @return LineItemType
|
| 248 |
*/
|
| 249 |
-
private function getShippingLineItem($merchantSettings, $carrierName, $carrierDescription, $amount, $discount=0)
|
|
|
|
|
|
|
| 250 |
$shippingLineItem = new LineItemType();
|
| 251 |
$shippingLineItem->setDescription(self::MSG_SHIPPING_DESCRIPTION_PREFIX . $carrierDescription);
|
| 252 |
-
if (trim($shippingLineItem->getDescription())==''){
|
| 253 |
$shippingLineItem->setDescription(self::MSG_DEFAULT_SHIPPING_NAME);
|
| 254 |
}
|
| 255 |
// Get EUC code for shipping
|
| 256 |
$shippingEUC = self::EUC_SHIPPING_COMMON_CARRIER;
|
| 257 |
-
|
|
|
|
|
|
|
|
|
|
| 258 |
$shippingEUC = self::EUC_SHIPPING_AND_HANDLING;
|
| 259 |
-
}else if ($this->isUSPSShipping($carrierName)){
|
| 260 |
$shippingEUC = self::EUC_SHIPPING_USPS;
|
| 261 |
}
|
| 262 |
$shippingLineItem->setSKU($shippingEUC);
|
|
@@ -264,72 +287,140 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 264 |
$shippingLineItem->setId(self::LINE_ITEM_ID_SHIPPING);
|
| 265 |
$shippingLineItem->setQuantity(1);
|
| 266 |
// If shipping doesn't include handling we should subtract handling from the total shipping amount
|
| 267 |
-
if (!$
|
| 268 |
-
$amount -= $this->getHandlingFeeByMethodName($carrierName);
|
| 269 |
}
|
| 270 |
$shippingLineItem->setGrossAmount($amount);
|
| 271 |
-
$this->applyDiscountToLineItem($shippingLineItem
|
| 272 |
return $shippingLineItem;
|
| 273 |
}
|
| 274 |
|
| 275 |
-
|
| 276 |
-
|
| 277 |
/**
|
| 278 |
* Returns handling feed amount by given name, or 0 if there is no handling
|
| 279 |
* @param $name
|
| 280 |
-
* @return
|
| 281 |
*/
|
| 282 |
-
private function getHandlingFeeByMethodName($name)
|
| 283 |
-
|
| 284 |
-
if ($name
|
|
|
|
| 285 |
// Fetch carriers information from Magento config to determine handling amount
|
| 286 |
$carriers = Mage::getStoreConfig('carriers');
|
| 287 |
if (!array_key_exists($name, $carriers)) return self::PRICE_TYPE_DYNAMIC;
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 293 |
}
|
| 294 |
-
|
|
|
|
| 295 |
}
|
| 296 |
|
|
|
|
|
|
|
| 297 |
/**
|
| 298 |
-
* @param
|
| 299 |
* @param $carrierName
|
| 300 |
* @return LineItemType|null
|
| 301 |
*/
|
| 302 |
-
public function getHandlingLineItem($merchantSettings, $carrierName)
|
| 303 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 304 |
$handlingLineItem = new LineItemType();
|
| 305 |
$handlingLineItem->setId(self::LINE_ITEM_ID_HANDLING);
|
| 306 |
$handlingLineItem->setDescription(self::MSG_HANDLING_FEE);
|
| 307 |
$handlingLineItem->setSKU(self::EUC_HANDLING);
|
| 308 |
$handlingLineItem->setQuantity(1);
|
| 309 |
-
$handlingLineItem->setGrossAmount($this->getHandlingFeeByMethodName($carrierName));
|
| 310 |
-
if ($handlingLineItem->getGrossAmount()== self::PRICE_TYPE_DYNAMIC) return null;
|
| 311 |
return $handlingLineItem;
|
| 312 |
}
|
| 313 |
|
| 314 |
/**
|
| 315 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 316 |
-
* @param
|
| 317 |
* @return LineItemType|null
|
| 318 |
*/
|
| 319 |
-
private function getHandlingLineItemForQuoteAddress($quoteAddress, $merchantSettings)
|
|
|
|
| 320 |
if ($quoteAddress->getAddressType() == Mage_Sales_Model_Quote_Address::TYPE_BILLING) return null; // There is no shipping fees there
|
| 321 |
-
return $this->getHandlingLineItem(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 322 |
}
|
| 323 |
|
| 324 |
/**
|
| 325 |
* @param \Mage_Sales_Model_Quote_Address_Item|\Mage_Sales_Model_Quote_Item $magentoItem
|
| 326 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 327 |
-
* @param
|
| 328 |
* @return LineItemType
|
| 329 |
*/
|
| 330 |
public function buildLineItemForMagentoItem($magentoItem,
|
| 331 |
$quoteAddress,
|
| 332 |
-
$merchantSettings)
|
|
|
|
| 333 |
$lineItem = new LineItemType();
|
| 334 |
$lineItem->setDescription($magentoItem->getName());
|
| 335 |
if ($magentoItem->getBaseRowTotal())
|
|
@@ -337,9 +428,9 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 337 |
else
|
| 338 |
$lineItem->setGrossAmount(0.0);
|
| 339 |
$lineItem->setQuantity($magentoItem->getTotalQty());
|
| 340 |
-
if ($magentoItem instanceof Mage_Sales_Model_Order_Creditmemo_Item){
|
| 341 |
$lineItem->setSKU($this->getSKUForItem($magentoItem->getOrderItem(), $merchantSettings));
|
| 342 |
-
}else{
|
| 343 |
$lineItem->setSKU($this->getSKUForItem($magentoItem, $merchantSettings));
|
| 344 |
}
|
| 345 |
if (!$this->isDiscountExempt($magentoItem)) {
|
|
@@ -354,7 +445,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 354 |
$product = Mage::getModel('catalog/product')
|
| 355 |
->setStoreId($magentoItem->getStoreId())
|
| 356 |
->load($magentoItem->getProductId());
|
| 357 |
-
}
|
| 358 |
if (in_array($product->getTypeId(), array(Mage_Catalog_Model_Product_Type::TYPE_BUNDLE))) {
|
| 359 |
if ($product->getPriceType() == self::PRICE_TYPE_DYNAMIC) {
|
| 360 |
$lineItem->setGrossAmount(0);
|
|
@@ -369,13 +460,14 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 369 |
* @param \Mage_Sales_Model_Quote_Address_Item|\Mage_Sales_Model_Quote_Item $magentoItem
|
| 370 |
* @return void
|
| 371 |
*/
|
| 372 |
-
private function isDiscountExempt($magentoItem)
|
|
|
|
| 373 |
try {
|
| 374 |
$config = ExactorPluginConfig::getInstance();
|
| 375 |
if (!$config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS)) return false;
|
| 376 |
$exempted = $config->get(EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS);
|
| 377 |
if (!isset($exempted)) return false;
|
| 378 |
-
if ($magentoItem->getOrderItem() != null){
|
| 379 |
$magentoItem = $magentoItem->getOrderItem();
|
| 380 |
}
|
| 381 |
$actual = preg_split('/,/', $magentoItem->getAppliedRuleIds());
|
|
@@ -395,8 +487,9 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 395 |
* @param LineItemType $item
|
| 396 |
* @param int $discountAmount
|
| 397 |
*/
|
| 398 |
-
private function applyDiscountToLineItem($item, $discountAmount=0)
|
| 399 |
-
|
|
|
|
| 400 |
$discountedLine = self::MSG_DISCOUNTED_BY . $discountAmount;
|
| 401 |
$item->setDescription($item->getDescription() . " ($discountedLine)");
|
| 402 |
$item->setGrossAmount($item->getGrossAmount() - $discountAmount);
|
|
@@ -405,45 +498,48 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 405 |
|
| 406 |
/**
|
| 407 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 408 |
-
* @param
|
| 409 |
* @return mixed|string
|
| 410 |
*/
|
| 411 |
private function getExemptionIdForQuoteAddress($quoteAddress,
|
| 412 |
-
$merchantSettings)
|
|
|
|
| 413 |
$exemptionId = '';
|
| 414 |
-
if ($merchantSettings->getExemptionsSupported()){
|
| 415 |
$customerExemptionId = $quoteAddress->getQuote()->getCustomer()->getData(self::ATTRIBUTE_NAME_EXEMPTION);
|
| 416 |
-
if ($customerExemptionId!=null) $exemptionId
|
| 417 |
}
|
| 418 |
return $exemptionId;
|
| 419 |
}
|
| 420 |
|
| 421 |
/**
|
| 422 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 423 |
-
* @param
|
| 424 |
* @return string
|
| 425 |
*/
|
| 426 |
private function getExemptionIdForCreditMemo($creditMemo,
|
| 427 |
-
$merchantSettings)
|
|
|
|
| 428 |
$exemptionId = '';
|
| 429 |
-
if ($merchantSettings->getExemptionsSupported()){
|
| 430 |
$customerExemptionId = $creditMemo->getOrder()->getCustomerTaxvat();
|
| 431 |
-
if ($customerExemptionId!=null) $exemptionId
|
| 432 |
}
|
| 433 |
return $exemptionId;
|
| 434 |
}
|
| 435 |
|
| 436 |
/**
|
| 437 |
* @param Mage_Sales_Model_Order $order
|
| 438 |
-
* @param
|
| 439 |
* @return string
|
| 440 |
*/
|
| 441 |
private function getExemptionIdForOrder($order,
|
| 442 |
-
$merchantSettings)
|
|
|
|
| 443 |
$exemptionId = '';
|
| 444 |
-
if ($merchantSettings->getExemptionsSupported()){
|
| 445 |
$customerExemptionId = $order->getCustomerTaxvat();
|
| 446 |
-
if ($customerExemptionId!=null) $exemptionId
|
| 447 |
}
|
| 448 |
return $exemptionId;
|
| 449 |
}
|
|
@@ -452,9 +548,10 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 452 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 453 |
* @return string
|
| 454 |
*/
|
| 455 |
-
private function getCurrentCurrencyCode($quoteAddress)
|
|
|
|
| 456 |
$store = Mage::app()->getStore();
|
| 457 |
-
if ($quoteAddress->getQuote() != null && $quoteAddress->getQuote()->getStoreId() != null){
|
| 458 |
$store = $quoteAddress->getQuote()->getStore();
|
| 459 |
}
|
| 460 |
return $this->getCurrencyCodeForStore($store);
|
|
@@ -464,15 +561,17 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 464 |
* @param Mage_Core_Model_Store $store
|
| 465 |
* @return string
|
| 466 |
*/
|
| 467 |
-
private function getCurrencyCodeForStore($store)
|
|
|
|
| 468 |
$currency = 'USD';
|
| 469 |
-
if ($store != null){
|
| 470 |
-
$currency = $store->getBaseCurrencyCode()!=null ? $store->getBaseCurrencyCode() : $currency;
|
| 471 |
}
|
| 472 |
return $currency;
|
| 473 |
}
|
| 474 |
|
| 475 |
-
private function buildGiftCardLineItem($amount)
|
|
|
|
| 476 |
$lineItem = new LineItemType();
|
| 477 |
$lineItem->setGrossAmount($amount);
|
| 478 |
$lineItem->setQuantity(1);
|
|
@@ -482,7 +581,8 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 482 |
return $lineItem;
|
| 483 |
}
|
| 484 |
|
| 485 |
-
private function buildStoreCreditLineItem($amount)
|
|
|
|
| 486 |
$lineItem = new LineItemType();
|
| 487 |
$lineItem->setGrossAmount($amount);
|
| 488 |
$lineItem->setQuantity(1);
|
|
@@ -494,34 +594,34 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 494 |
|
| 495 |
/**
|
| 496 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 497 |
-
* @param
|
| 498 |
* @param bool $isMultishipping
|
| 499 |
* @param $isEstimation
|
| 500 |
* @return InvoiceRequestType
|
| 501 |
*/
|
| 502 |
public function buildInvoiceRequestForQuoteAddress($quoteAddress,
|
| 503 |
$merchantSettings,
|
| 504 |
-
$isMultishipping, $isEstimation)
|
|
|
|
| 505 |
// Building Invoice Parts
|
| 506 |
$shipToAddress = $this->buildExactorAddressForQuoteAddress($quoteAddress);
|
| 507 |
// Trying to find billing address in the quote
|
| 508 |
$billingAddress = $this->buildExactorAddressForQuoteAddress($quoteAddress->getQuote()->getBillingAddress());
|
| 509 |
|
| 510 |
-
|
| 511 |
-
|
|
|
|
|
|
|
| 512 |
// If this is just tax estimation for not logged in user
|
| 513 |
// we just need to use shipping as billing
|
| 514 |
-
if ($isEstimation){
|
| 515 |
$billingAddress = $shipToAddress;
|
|
|
|
| 516 |
}
|
| 517 |
-
// If shipping info unavailable - fallback to billing information
|
| 518 |
-
if ($shipToAddress == null || !$shipToAddress->hasData()) $shipToAddress=$billingAddress;
|
| 519 |
-
if ($shipToAddress == null || !$shipToAddress->hasData()) $shipToAddress=null;
|
| 520 |
-
if ($shipToAddress == null) return null;
|
| 521 |
// Composing invoice object
|
| 522 |
$invoiceRequest = new InvoiceRequestType();
|
| 523 |
$invoiceRequest->setSaleDate(new DateTime());
|
| 524 |
-
$invoiceRequest->setPurchaseOrderNumber(self::PO_ESTIMATE_TEXT
|
| 525 |
$invoiceRequest->setShipTo($shipToAddress);
|
| 526 |
$invoiceRequest->setBillTo($billingAddress);
|
| 527 |
$invoiceRequest->setCurrencyCode($this->getCurrentCurrencyCode($quoteAddress));
|
|
@@ -539,8 +639,8 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 539 |
$exactorLineItem->setId($this->buildExactorItemId($magentoItem));
|
| 540 |
// If this is non-multishipping request we should set
|
| 541 |
// ship to address to billing address for VIRTUAL ITEMS
|
| 542 |
-
if (!$isMultishipping){
|
| 543 |
-
if ($magentoItem->getProduct()->getIsVirtual()){
|
| 544 |
// Previouse requirements was to set BillTo address for wi as Shipping info for virtual products
|
| 545 |
/*$virtualShipToAddress = $invoiceRequest->getShipTo(); //( $isEstimation ? $invoiceRequest->getShipFrom() : $billingAddress);
|
| 546 |
$exactorLineItem->setShipTo($virtualShipToAddress);
|
|
@@ -550,7 +650,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 550 |
$invoiceRequest->addLineItem($exactorLineItem);
|
| 551 |
}
|
| 552 |
// Gift Cards
|
| 553 |
-
if ($quoteAddress->getBaseGiftCardsAmount() != null && $quoteAddress->getBaseGiftCardsAmount() != 0){
|
| 554 |
$invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $quoteAddress->getBaseGiftCardsAmount()));
|
| 555 |
}
|
| 556 |
// Store Credit
|
|
@@ -558,9 +658,21 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 558 |
if ($storeCreditAmount != null && $storeCreditAmount != 0) {
|
| 559 |
$invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
|
| 560 |
}
|
|
|
|
| 561 |
// Shipping & Handling
|
| 562 |
-
$
|
| 563 |
-
$
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 564 |
return $invoiceRequest;
|
| 565 |
}
|
| 566 |
|
|
@@ -576,25 +688,27 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 576 |
*/
|
| 577 |
private function calculateProratedShippingAndHandling($orderedShippingAmount, $alreadyProcessedAmount,
|
| 578 |
$targetShippingAmount, $handlingTotalAmount,
|
| 579 |
-
$store)
|
|
|
|
| 580 |
// $orderedShippingAmount = $invoice->getOrder()->getBaseShippingAmount();
|
| 581 |
// $alreadyProcessedAmount = $invoice->getOrder()->getBaseShippingRefunded();
|
| 582 |
// $targetShippingAmount = $invoice->getBaseShippingAmount();
|
| 583 |
// $handlingTotalAmount = $handlingLineItem->getGrossAmount();
|
| 584 |
$delta = $orderedShippingAmount - $alreadyProcessedAmount + $targetShippingAmount;
|
| 585 |
$shippingFactor = $targetShippingAmount / $delta;
|
| 586 |
-
$handlingAmount = $handlingTotalAmount
|
| 587 |
$shippingAmount = $targetShippingAmount - $handlingAmount;
|
| 588 |
return array($store->roundPrice($shippingAmount),
|
| 589 |
-
|
| 590 |
}
|
| 591 |
|
| 592 |
/** Return invoice requests by credit memo. In case if credit memo contains adjustments - returns 2 separated invoices
|
| 593 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 594 |
-
* @param
|
| 595 |
* @return array InvoiceRequestType
|
| 596 |
*/
|
| 597 |
-
public function buildInvoiceRequestsForCreditMemo($creditMemo, $merchantSettings)
|
|
|
|
| 598 |
$result = array();
|
| 599 |
$invoiceRequest = new InvoiceRequestType();
|
| 600 |
$invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($creditMemo->getBillingAddress()));
|
|
@@ -606,9 +720,9 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 606 |
$invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
|
| 607 |
// Line items
|
| 608 |
$magentoItems = $creditMemo->getAllItems();
|
| 609 |
-
foreach ($magentoItems as $magentoItem){
|
| 610 |
$exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
|
| 611 |
-
if ($exactorLineItem != null){
|
| 612 |
$exactorLineItem->setQuantity($magentoItem->getQty());
|
| 613 |
}
|
| 614 |
$invoiceRequest->addLineItem($exactorLineItem);
|
|
@@ -617,12 +731,12 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 617 |
$shippingLineItem = $this->getShippingLineItemForCreditMemo($creditMemo, $merchantSettings);
|
| 618 |
$handlingLineItem = null;
|
| 619 |
|
| 620 |
-
if ($shippingLineItem!=null) {
|
| 621 |
-
$handlingLineItem = $this->getHandlingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod());
|
| 622 |
-
if ($handlingLineItem!=null){
|
| 623 |
$delta = $creditMemo->getOrder()->getBaseShippingAmount() - $creditMemo->getOrder()->getBaseShippingRefunded() + $creditMemo->getBaseShippingAmount();
|
| 624 |
$shippingFactor = $creditMemo->getBaseShippingAmount() / $delta;
|
| 625 |
-
$handlingAmount = $handlingLineItem->getGrossAmount()
|
| 626 |
$shippingAmount = $creditMemo->getBaseShippingAmount() - $handlingAmount;
|
| 627 |
// Update amounts
|
| 628 |
$shippingLineItem->setGrossAmount($creditMemo->getStore()->roundPrice($shippingAmount));
|
|
@@ -632,6 +746,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 632 |
|
| 633 |
$invoiceRequest->addLineItem($shippingLineItem);
|
| 634 |
$invoiceRequest->addLineItem($handlingLineItem);
|
|
|
|
| 635 |
|
| 636 |
$result[] = $invoiceRequest;
|
| 637 |
// Adjustments
|
|
@@ -640,19 +755,19 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 640 |
$adjustmentsItem->setDescription(self::MSG_ADJUSTMENTS);
|
| 641 |
$adjustmentsItem->setQuantity(1);
|
| 642 |
$adjustmentsItem->setSKU(self::EUC_NON_TAXABLE);
|
| 643 |
-
$adjustmentsItem->setGrossAmount($creditMemo->getAdjustmentPositive()
|
| 644 |
if ($adjustmentsItem->getGrossAmount() != 0
|
| 645 |
-
|
| 646 |
-
|
| 647 |
) {
|
| 648 |
$adjustmentInvoice = clone $invoiceRequest;
|
| 649 |
$adjustmentInvoice->setPurchaseOrderNumber(self::MSG_ADJUSTMENTS_REFUND);
|
| 650 |
$adjustmentInvoice->setLineItems(array());
|
| 651 |
-
if ($adjustmentsItem->getGrossAmount() != 0){
|
| 652 |
$adjustmentInvoice->addLineItem($adjustmentsItem);
|
| 653 |
}
|
| 654 |
// Gift Cards
|
| 655 |
-
if ($creditMemo->getBaseGiftCardsAmount() != null && $creditMemo->getBaseGiftCardsAmount() != 0){
|
| 656 |
$adjustmentInvoice->addLineItem($this->buildGiftCardLineItem(-1 * $creditMemo->getBaseGiftCardsAmount()));
|
| 657 |
}
|
| 658 |
// Store Credit
|
|
@@ -670,23 +785,25 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 670 |
* @param string $default
|
| 671 |
* @return DateTime
|
| 672 |
*/
|
| 673 |
-
private function getCreatedAtDateForMageOrder($order, $default='now')
|
|
|
|
| 674 |
$res = $default;
|
| 675 |
-
try{
|
| 676 |
-
$res= '@'
|
| 677 |
} catch (Exception $e) {
|
| 678 |
$this->logger->error("Can't get date. Using default value." . $e->getMessage(),
|
| 679 |
-
|
| 680 |
}
|
| 681 |
return new DateTime($res);
|
| 682 |
}
|
| 683 |
|
| 684 |
/**
|
| 685 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 686 |
-
* @param
|
| 687 |
* @return array
|
| 688 |
*/
|
| 689 |
-
public function buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings)
|
|
|
|
| 690 |
$result = array();
|
| 691 |
$invoiceRequest = new InvoiceRequestType();
|
| 692 |
$invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($invoice->getBillingAddress()));
|
|
@@ -699,9 +816,9 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 699 |
//$invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
|
| 700 |
// Line items
|
| 701 |
$magentoItems = $invoice->getAllItems();
|
| 702 |
-
foreach ($magentoItems as $magentoItem){
|
| 703 |
$exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
|
| 704 |
-
if ($exactorLineItem != null){
|
| 705 |
$exactorLineItem->setQuantity($magentoItem->getQty());
|
| 706 |
}
|
| 707 |
$invoiceRequest->addLineItem($exactorLineItem);
|
|
@@ -709,13 +826,17 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 709 |
// Shipping & Handling
|
| 710 |
$shippingLineItem = $this->getShippingLineItemForInvoice($invoice, $merchantSettings);
|
| 711 |
$handlingLineItem = null;
|
| 712 |
-
if ($shippingLineItem!=null) {
|
| 713 |
-
$handlingLineItem = $this->getHandlingLineItem(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 714 |
}
|
| 715 |
$invoiceRequest->addLineItem($shippingLineItem);
|
| 716 |
$invoiceRequest->addLineItem($handlingLineItem);
|
| 717 |
// Gift cards
|
| 718 |
-
if ($invoice->getBaseGiftCardsAmount() != null && $invoice->getBaseGiftCardsAmount() != 0){
|
| 719 |
$invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $invoice->getBaseGiftCardsAmount()));
|
| 720 |
}
|
| 721 |
// Store Credit
|
|
@@ -723,16 +844,19 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 723 |
if ($storeCreditAmount != null && $storeCreditAmount != 0) {
|
| 724 |
$invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
|
| 725 |
}
|
|
|
|
|
|
|
| 726 |
$result[] = $invoiceRequest;
|
| 727 |
return $result;
|
| 728 |
}
|
| 729 |
|
| 730 |
/**
|
| 731 |
* @param Mage_Sales_Model_Order $order
|
| 732 |
-
* @param
|
| 733 |
* @return array
|
| 734 |
*/
|
| 735 |
-
public function buildInvoiceRequestForMagentoOrder($order, $merchantSettings)
|
|
|
|
| 736 |
$result = array();
|
| 737 |
$invoiceRequest = new InvoiceRequestType();
|
| 738 |
$invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($order->getBillingAddress()));
|
|
@@ -744,9 +868,9 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 744 |
$invoiceRequest->setExemptionId($this->getExemptionIdForOrder($order, $merchantSettings));
|
| 745 |
// Line items
|
| 746 |
$magentoItems = $order->getAllItems();
|
| 747 |
-
foreach ($magentoItems as $magentoItem){
|
| 748 |
$exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
|
| 749 |
-
if ($exactorLineItem != null){
|
| 750 |
$exactorLineItem->setQuantity($magentoItem->getQtyOrdered());
|
| 751 |
$exactorLineItem->setId($this->buildExactorItemId($magentoItem));
|
| 752 |
}
|
|
@@ -755,13 +879,17 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 755 |
// Shipping & Handling
|
| 756 |
$shippingLineItem = $this->getShippingLineItemForOrder($order, $merchantSettings);
|
| 757 |
$handlingLineItem = null;
|
| 758 |
-
if ($shippingLineItem!=null) {
|
| 759 |
-
$handlingLineItem = $this->getHandlingLineItem(
|
|
|
|
|
|
|
|
|
|
|
|
|
| 760 |
}
|
| 761 |
$invoiceRequest->addLineItem($shippingLineItem);
|
| 762 |
$invoiceRequest->addLineItem($handlingLineItem);
|
| 763 |
// Gift cards
|
| 764 |
-
if ($order->getBaseGiftCardsAmount() != null && $order->getBaseGiftCardsAmount() != 0){
|
| 765 |
$invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $order->getBaseGiftCardsAmount()));
|
| 766 |
}
|
| 767 |
// Store Credit
|
|
@@ -769,6 +897,8 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 769 |
if ($storeCreditAmount != null && $storeCreditAmount != 0) {
|
| 770 |
$invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
|
| 771 |
}
|
|
|
|
|
|
|
| 772 |
$result[] = $invoiceRequest;
|
| 773 |
return $result;
|
| 774 |
}
|
|
@@ -778,7 +908,8 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 778 |
* @param Mage_Customer_Model_Address_Abstract|AddressType $address
|
| 779 |
* @return bool
|
| 780 |
*/
|
| 781 |
-
public function isAllowedLocation($filter, $address)
|
|
|
|
| 782 |
/* Filter has the following structure:
|
| 783 |
countryName1: array(state1, state2, state3)
|
| 784 |
countryName1: array(state1, state2, state3)
|
|
@@ -802,8 +933,9 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 802 |
* @param AddressType $address
|
| 803 |
* @return bool
|
| 804 |
*/
|
| 805 |
-
private function isAddessFullyPopulated($address)
|
| 806 |
-
|
|
|
|
| 807 |
return strlen(trim($address->getStreet1())) > 0
|
| 808 |
&& strlen(trim($address->getFullName())) > 0
|
| 809 |
&& strlen(trim($address->getCity())) > 0;
|
|
@@ -817,9 +949,10 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
|
|
| 817 |
* @param InvoiceRequestType $invoice
|
| 818 |
* @return bool
|
| 819 |
*/
|
| 820 |
-
public function isInvoiceAddressesFullyPopulated($invoice)
|
|
|
|
| 821 |
if ($invoice == null) return false;
|
| 822 |
return $this->isAddessFullyPopulated($invoice->getShipTo());
|
| 823 |
-
|
| 824 |
}
|
| 825 |
}
|
| 4 |
* Date: 4/20/12
|
| 5 |
* Time: 1:12 PM
|
| 6 |
*/
|
|
|
|
|
|
|
| 7 |
|
| 8 |
+
class ZzzzzExactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract
|
| 9 |
+
{
|
| 10 |
+
|
| 11 |
+
const EUC_SHIPPING_COMMON_CARRIER = 'EUC-13010204';
|
| 12 |
+
const EUC_SHIPPING_USPS = 'EUC-13030202';
|
| 13 |
+
const EUC_SHIPPING_AND_HANDLING = 'EUC-13010101';
|
| 14 |
const EUC_HANDLING = 'EUC-13010301';
|
| 15 |
const EUC_NON_TAXABLE = 'EUC-99990101';
|
| 16 |
const EUC_GIFT_CARD = self::EUC_NON_TAXABLE;
|
|
|
|
| 17 |
|
| 18 |
+
const SKU_FOOMAN_SURCHARGE = 'FOOMAN_SURCHARGE';
|
| 19 |
+
|
| 20 |
+
const EUC_STORE_CREDIT = self::EUC_NON_TAXABLE;
|
| 21 |
const MSG_DEFAULT_SHIPPING_NAME = 'Default Shipping';
|
| 22 |
+
const MSG_DEFAULT_FOOMAN_SURCHARGE = 'Fooman Surcharge';
|
| 23 |
const MSG_HANDLING_FEE = 'Handling Fee';
|
| 24 |
const MSG_ADJUSTMENTS = 'Adjustments';
|
| 25 |
const MSG_SHIPPING_DESCRIPTION_PREFIX = 'Shipping Fee: ';
|
| 27 |
const MSG_DISCOUNTED_BY = 'Discounted by $';
|
| 28 |
const MSG_ADJUSTMENTS_REFUND = "Adjustments Refund";
|
| 29 |
const MSG_GIFT_CARD_ITEM = "Gift card(-s)";
|
|
|
|
| 30 |
|
| 31 |
+
const MSG_STORE_CREDIT_ITEM = "Store credit";
|
| 32 |
const LINE_ITEM_ID_SHIPPING = "SHIPPING";
|
| 33 |
const LINE_ITEM_ID_HANDLING = "HANDLING";
|
| 34 |
const LINE_ITEM_ID_ADJUSTMENTS = "ADJUSTMENTS";
|
| 35 |
const LINE_ITEM_ID_GIFT_CARD = "GIFT_CARD";
|
| 36 |
const LINE_ITEM_ID_STORE_CREDIT = "STORE_CREDIT";
|
| 37 |
+
const LINE_ITEM_ID_FOOMAN_SURCHARGE = 'FOOMAN_SURCHARGE';
|
| 38 |
+
|
| 39 |
const INDEXED_LINE_ITEM_ID_PREFIX = '_';
|
| 40 |
|
| 41 |
const ATTRIBUTE_NAME_EXEMPTION = 'taxvat';
|
| 42 |
|
| 43 |
const MAX_SKU_CODE_LENGTH = 32;
|
| 44 |
|
|
|
|
| 45 |
|
| 46 |
+
private $logger;
|
| 47 |
|
| 48 |
const PO_ESTIMATE_TEXT = 'Estimated Tax ';
|
|
|
|
| 49 |
const UNKNOWN_STREET_TEXT = "";
|
| 50 |
const UNKNOWN_STATE_NAME = "UNKNOWN";
|
|
|
|
| 51 |
|
| 52 |
|
| 53 |
+
const UNKNOWN_ZIP_CODE = "00000";
|
| 54 |
const PRICE_TYPE_DYNAMIC = 0;
|
| 55 |
|
| 56 |
/**
|
| 60 |
public function buildExactorItemId($magentoItem)
|
| 61 |
{
|
| 62 |
$itemId = $magentoItem->getId();
|
| 63 |
+
if ((defined('EXACTOR_BUILD_CUSTOM_ITEM_KEY') && constant('EXACTOR_BUILD_CUSTOM_ITEM_KEY')) || empty($itemId)) {
|
| 64 |
$itemId = base64_encode(join(':', array($magentoItem->getSku(), $magentoItem->getProductId(),
|
| 65 |
$magentoItem->getRowTotal(), $magentoItem->getQtyOrdered())));
|
| 66 |
$this->getLogger()->info("Building custom item key: " . $itemId);
|
| 68 |
return self::INDEXED_LINE_ITEM_ID_PREFIX . $itemId;
|
| 69 |
}
|
| 70 |
|
| 71 |
+
private function getLogger()
|
| 72 |
+
{
|
| 73 |
+
if ($this->logger == null)
|
| 74 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 75 |
return $this->logger;
|
| 76 |
}
|
| 86 |
* @param $middleName
|
| 87 |
* @return string
|
| 88 |
*/
|
| 89 |
+
private function buildFullName($firstName, $lastName, $middleName = null)
|
| 90 |
+
{
|
| 91 |
$parts = array($firstName, $middleName, $lastName);
|
| 92 |
return join(' ', $parts);
|
| 93 |
}
|
| 96 |
* @param Mage_Customer_Model_Address_Abstract $address
|
| 97 |
* @return AddressType|null
|
| 98 |
*/
|
| 99 |
+
private function buildExactorAddressForAbstractAddress($address)
|
| 100 |
+
{
|
| 101 |
$exactorAddress = new AddressType();
|
| 102 |
+
if ($address == null) return null;
|
| 103 |
// Set defaults
|
| 104 |
$exactorAddress->setStreet1(self::UNKNOWN_STREET_TEXT);
|
| 105 |
$exactorAddress->setFullName("Unknown Buyer");
|
| 106 |
//
|
| 107 |
+
$fullName = trim($address->getName()); //trim($this->buildFullName($address->getFirstname(), $address->getLastname(), $address->getMiddlename()));
|
| 108 |
+
if (strlen($fullName) > 0)
|
| 109 |
$exactorAddress->setFullName($fullName);
|
| 110 |
if ($address->getStreetFull() != null)
|
| 111 |
$exactorAddress->setStreet1($address->getStreetFull());
|
| 115 |
$exactorAddress->setPostalCode($address->getPostcode());
|
| 116 |
// It is possible that postal code or state will be missing (e.g. the tax estimation form)
|
| 117 |
// In this case we will try to determine region basing on the given Postal Code
|
| 118 |
+
if (strlen(trim($exactorAddress->getStateOrProvince())) == 0 && strlen(trim($exactorAddress->getPostalCode())) != 0) {
|
| 119 |
$exactorAddress->setStateOrProvince(RegionResolver::getInstance()->getStateOrProvinceByCode(trim($exactorAddress->getPostalCode())));
|
| 120 |
}
|
| 121 |
if (!$exactorAddress->hasData()) return null;
|
| 126 |
* @param Mage_Sales_Model_Order_Address $address
|
| 127 |
* @return AddressType|null
|
| 128 |
*/
|
| 129 |
+
public function buildExactorAddressForOrderAddress($address)
|
| 130 |
+
{
|
| 131 |
return $this->buildExactorAddressForAbstractAddress($address);
|
| 132 |
}
|
| 133 |
|
| 135 |
* @param Mage_Sales_Model_Quote_Address $address
|
| 136 |
* @return AddressType|null
|
| 137 |
*/
|
| 138 |
+
public function buildExactorAddressForQuoteAddress($address)
|
| 139 |
+
{
|
| 140 |
return $this->buildExactorAddressForAbstractAddress($address);
|
| 141 |
}
|
| 142 |
|
| 143 |
/**
|
| 144 |
* @param Mage_Sales_Model_Quote_Item_Abstract $magentoItem
|
| 145 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 146 |
* @return string
|
| 147 |
*/
|
| 148 |
+
public function getSKUForItem($magentoItem, $merchantSettings)
|
| 149 |
+
{
|
| 150 |
+
$sku = '';
|
| 151 |
$product = $magentoItem->getProduct();
|
| 152 |
if ($product == null)
|
| 153 |
$product = Mage::getModel('catalog/product')
|
| 154 |
->setStoreId($magentoItem->getStoreId())
|
| 155 |
->load($magentoItem->getProductId());
|
| 156 |
+
switch ($merchantSettings->getSourceOfSKU()) {
|
| 157 |
+
case ZzzzzExactor_Core_Model_MerchantSettings::SKU_SOURCE_NONE:
|
| 158 |
$sku = '';
|
| 159 |
break;
|
| 160 |
+
case ZzzzzExactor_Core_Model_MerchantSettings::SKU_SOURCE_SKU_FIELD:
|
| 161 |
$sku = $magentoItem->getSku();
|
| 162 |
break;
|
| 163 |
+
case ZzzzzExactor_Core_Model_MerchantSettings::SKU_SOURCE_ATTRIBUTE_NAME:
|
| 164 |
$attributeSetName = 'Default';
|
| 165 |
+
try {
|
| 166 |
$attributeSetModel = Mage::getModel("eav/entity_attribute_set");
|
| 167 |
$attributeSetModel->load($product->getAttributeSetId());
|
| 168 |
+
$attributeSetName = $attributeSetModel->getAttributeSetName();
|
| 169 |
+
} catch (Exception $e) {
|
| 170 |
+
}
|
| 171 |
$sku = $attributeSetName;
|
| 172 |
break;
|
| 173 |
+
case ZzzzzExactor_Core_Model_MerchantSettings::SKU_SOURCE_PRODUCT_CATEGORY:
|
| 174 |
$category = $product->getCategory();
|
| 175 |
if ($category != null)
|
| 176 |
$sku = $category->getName();
|
| 177 |
break;
|
| 178 |
+
case ZzzzzExactor_Core_Model_MerchantSettings::SKU_SOURCE_TAX_CLASS:
|
| 179 |
+
/** @var Mage_Tax_Model_Mysql4_Class_Collection $taxClassCollection */
|
| 180 |
$taxClassCollection = Mage::getModel('tax/class')->getCollection();
|
| 181 |
+
/** @var Mage_Tax_Model_Class $taxClass */
|
| 182 |
$taxClass = $taxClassCollection->getItemById($product->getTaxClassId());
|
| 183 |
if ($taxClass == null) $sku = ''; else $sku = $taxClass->getClassName();
|
| 184 |
break;
|
| 186 |
return substr($sku, self::PRICE_TYPE_DYNAMIC, self::MAX_SKU_CODE_LENGTH); // Max length for SKU is 32 characters
|
| 187 |
}
|
| 188 |
|
| 189 |
+
private function isUSPSShipping($methodName)
|
| 190 |
+
{
|
| 191 |
$uspsShippingNames = array('USPS', 'Mail', 'Post', 'USPostal');
|
| 192 |
// Remove all spaces and dots from the original name to simplify search
|
| 193 |
+
$methodName = preg_replace('/[\.\s]/', '', $methodName);
|
| 194 |
+
foreach ($uspsShippingNames as $currName) {
|
| 195 |
if (stristr($methodName, $currName)) return true;
|
| 196 |
}
|
| 197 |
return false;
|
| 199 |
|
| 200 |
/**
|
| 201 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 202 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 203 |
* @return LineItemType|null
|
| 204 |
*/
|
| 205 |
+
public function getShippingLineItemForQuoteAddress($quoteAddress, $merchantSettings)
|
| 206 |
+
{
|
| 207 |
|
| 208 |
if ($quoteAddress->getAddressType() == Mage_Sales_Model_Quote_Address::TYPE_BILLING) return null; // There is no shipping fees there
|
| 209 |
+
if ($quoteAddress->getShippingAmount() == 0) return null;
|
| 210 |
$shippingLineItem = $this->getShippingLineItem($merchantSettings, $quoteAddress->getShippingMethod(),
|
| 211 |
+
$quoteAddress->getShippingDescription(),
|
| 212 |
+
$quoteAddress->getShippingAmount(),
|
| 213 |
+
$quoteAddress->getShippingDiscountAmount());
|
| 214 |
return $shippingLineItem;
|
| 215 |
}
|
| 216 |
|
| 217 |
/**
|
| 218 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 219 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 220 |
* @return LineItemType|null
|
| 221 |
*/
|
| 222 |
+
public function getShippingLineItemForCreditMemo($creditMemo, $merchantSettings)
|
| 223 |
+
{
|
| 224 |
+
if ($creditMemo->getShippingAmount() == 0) return null;
|
| 225 |
$lineItem = $this->getShippingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod(),
|
| 226 |
+
$creditMemo->getOrder()->getShippingDescription(),
|
| 227 |
+
$creditMemo->getShippingAmount());
|
| 228 |
// For refunds we shouldn't subtract handling amount
|
| 229 |
$lineItem->setGrossAmount($creditMemo->getShippingAmount());
|
| 230 |
return $lineItem;
|
| 232 |
|
| 233 |
/**
|
| 234 |
* @param Mage_Sales_Model_Order $order
|
| 235 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 236 |
* @return LineItemType|null
|
| 237 |
*/
|
| 238 |
+
public function getShippingLineItemForOrder($order, $merchantSettings)
|
| 239 |
+
{
|
| 240 |
if ($order->getBaseShippingAmount() == 0) return null;
|
| 241 |
$lineItem = $this->getShippingLineItem($merchantSettings, $order->getShippingMethod(),
|
| 242 |
+
$order->getShippingDescription(),
|
| 243 |
+
$order->getBaseShippingAmount(),
|
| 244 |
+
$order->getBaseShippingDiscountAmount());
|
| 245 |
return $lineItem;
|
| 246 |
}
|
| 247 |
|
| 248 |
/**
|
| 249 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 250 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 251 |
* @return LineItemType|null
|
| 252 |
*/
|
| 253 |
+
public function getShippingLineItemForInvoice($invoice, $merchantSettings)
|
| 254 |
+
{
|
| 255 |
if ($invoice->getBaseShippingAmount() == 0) return null;
|
| 256 |
return $this->getShippingLineItemForOrder($invoice->getOrder(), $merchantSettings);
|
| 257 |
}
|
| 258 |
|
| 259 |
/**
|
| 260 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 261 |
* @param $carrierName
|
| 262 |
* @param $carrierDescription
|
| 263 |
* @param $amount
|
| 264 |
* @param int $discount
|
| 265 |
* @return LineItemType
|
| 266 |
*/
|
| 267 |
+
private function getShippingLineItem($merchantSettings, $carrierName, $carrierDescription, $amount, $discount = 0)
|
| 268 |
+
{
|
| 269 |
+
$discount = Mage::app()->getStore()->roundPrice($discount);
|
| 270 |
$shippingLineItem = new LineItemType();
|
| 271 |
$shippingLineItem->setDescription(self::MSG_SHIPPING_DESCRIPTION_PREFIX . $carrierDescription);
|
| 272 |
+
if (trim($shippingLineItem->getDescription()) == '') {
|
| 273 |
$shippingLineItem->setDescription(self::MSG_DEFAULT_SHIPPING_NAME);
|
| 274 |
}
|
| 275 |
// Get EUC code for shipping
|
| 276 |
$shippingEUC = self::EUC_SHIPPING_COMMON_CARRIER;
|
| 277 |
+
$shippingIncludeHandling = $merchantSettings->isShippingIncludeHandling()
|
| 278 |
+
|| $discount > 0
|
| 279 |
+
|| $this->getHandlingFeeByMethodNameIfPossible($carrierName, $amount) === self::CODE_UNABLE_TO_EXTRACT;
|
| 280 |
+
if ($shippingIncludeHandling) {
|
| 281 |
$shippingEUC = self::EUC_SHIPPING_AND_HANDLING;
|
| 282 |
+
} else if ($this->isUSPSShipping($carrierName)) {
|
| 283 |
$shippingEUC = self::EUC_SHIPPING_USPS;
|
| 284 |
}
|
| 285 |
$shippingLineItem->setSKU($shippingEUC);
|
| 287 |
$shippingLineItem->setId(self::LINE_ITEM_ID_SHIPPING);
|
| 288 |
$shippingLineItem->setQuantity(1);
|
| 289 |
// If shipping doesn't include handling we should subtract handling from the total shipping amount
|
| 290 |
+
if (!$shippingIncludeHandling) {
|
| 291 |
+
$amount -= $this->getHandlingFeeByMethodName($carrierName, $amount);
|
| 292 |
}
|
| 293 |
$shippingLineItem->setGrossAmount($amount);
|
| 294 |
+
$this->applyDiscountToLineItem($shippingLineItem, $discount);
|
| 295 |
return $shippingLineItem;
|
| 296 |
}
|
| 297 |
|
|
|
|
|
|
|
| 298 |
/**
|
| 299 |
* Returns handling feed amount by given name, or 0 if there is no handling
|
| 300 |
* @param $name
|
| 301 |
+
* @return number
|
| 302 |
*/
|
| 303 |
+
private function getHandlingFeeByMethodName($name, $shippingWithHandlingAmount)
|
| 304 |
+
{
|
| 305 |
+
if (strpos($name, "_")) $name = substr($name, self::PRICE_TYPE_DYNAMIC, strpos($name, "_"));
|
| 306 |
+
if ($name == null) $name = "";
|
| 307 |
// Fetch carriers information from Magento config to determine handling amount
|
| 308 |
$carriers = Mage::getStoreConfig('carriers');
|
| 309 |
if (!array_key_exists($name, $carriers)) return self::PRICE_TYPE_DYNAMIC;
|
| 310 |
+
return $this->getHandlingFeeByMethodNameIfPossible($name, $shippingWithHandlingAmount);
|
| 311 |
+
}
|
| 312 |
+
|
| 313 |
+
|
| 314 |
+
private function getHandlingFeeByMethodNameIfPossible($name, $shippingWithHandlingAmount)
|
| 315 |
+
{
|
| 316 |
+
if (strpos($name, "_")) $name = substr($name, self::PRICE_TYPE_DYNAMIC, strpos($name, "_"));
|
| 317 |
+
if ($name == null) $name = "";
|
| 318 |
+
// Fetch carriers information from Magento config to determine handling amount
|
| 319 |
+
$carriers = Mage::getStoreConfig('carriers');
|
| 320 |
+
if (!array_key_exists($name, $carriers)) return self::CODE_UNABLE_TO_EXTRACT;
|
| 321 |
+
$carrier = $carriers[$name];
|
| 322 |
+
if (!array_key_exists('handling_fee', $carrier)) return self::PRICE_TYPE_DYNAMIC;
|
| 323 |
+
if (!$carrier['handling_fee']) return self::PRICE_TYPE_DYNAMIC;
|
| 324 |
+
|
| 325 |
+
return $this->extractHandling($carrier, $shippingWithHandlingAmount);
|
| 326 |
+
}
|
| 327 |
+
|
| 328 |
+
private function extractHandling($carrierMap, $shippingWithHandlingAmount)
|
| 329 |
+
{
|
| 330 |
+
$carrierModel = Mage::getModel($carrierMap['model']);
|
| 331 |
+
$handlingAction = $carrierModel->getConfigData('handling_action');
|
| 332 |
+
if (!$handlingAction) {
|
| 333 |
+
$handlingAction = Mage_Shipping_Model_Carrier_Abstract::HANDLING_ACTION_PERORDER;
|
| 334 |
+
}
|
| 335 |
+
if ($handlingAction != Mage_Shipping_Model_Carrier_Abstract::HANDLING_ACTION_PERORDER) return self::CODE_UNABLE_TO_EXTRACT;
|
| 336 |
+
|
| 337 |
+
$handlingType = $carrierModel->getConfigData('handling_type');
|
| 338 |
+
if (!$handlingType) {
|
| 339 |
+
$handlingType = Mage_Shipping_Model_Carrier_Abstract::HANDLING_TYPE_FIXED;
|
| 340 |
+
}
|
| 341 |
+
|
| 342 |
+
$handlingFee = $carrierMap['handling_fee'];
|
| 343 |
+
|
| 344 |
+
if ($handlingType == Mage_Shipping_Model_Carrier_Abstract::HANDLING_TYPE_PERCENT) {
|
| 345 |
+
$shipping = 100 * $shippingWithHandlingAmount / (100 + $handlingFee);
|
| 346 |
+
return $shipping * $handlingFee / 100;
|
| 347 |
}
|
| 348 |
+
|
| 349 |
+
return $handlingFee;
|
| 350 |
}
|
| 351 |
|
| 352 |
+
const CODE_UNABLE_TO_EXTRACT = 'UNABLE_TO_EXTRACT';
|
| 353 |
+
|
| 354 |
/**
|
| 355 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 356 |
* @param $carrierName
|
| 357 |
* @return LineItemType|null
|
| 358 |
*/
|
| 359 |
+
public function getHandlingLineItem($merchantSettings, $carrierName, $shippingWithHandlingAmount, $shippingDiscount)
|
| 360 |
+
{
|
| 361 |
+
$shippingIncludeHandling = $merchantSettings->isShippingIncludeHandling()
|
| 362 |
+
|| $shippingDiscount > 0
|
| 363 |
+
|| $this->getHandlingFeeByMethodNameIfPossible($carrierName, $shippingWithHandlingAmount) === self::CODE_UNABLE_TO_EXTRACT;
|
| 364 |
+
if ($shippingIncludeHandling) return null; // Handling already included in the shipping
|
| 365 |
$handlingLineItem = new LineItemType();
|
| 366 |
$handlingLineItem->setId(self::LINE_ITEM_ID_HANDLING);
|
| 367 |
$handlingLineItem->setDescription(self::MSG_HANDLING_FEE);
|
| 368 |
$handlingLineItem->setSKU(self::EUC_HANDLING);
|
| 369 |
$handlingLineItem->setQuantity(1);
|
| 370 |
+
$handlingLineItem->setGrossAmount($this->getHandlingFeeByMethodName($carrierName, $shippingWithHandlingAmount));
|
| 371 |
+
if ($handlingLineItem->getGrossAmount() == self::PRICE_TYPE_DYNAMIC) return null;
|
| 372 |
return $handlingLineItem;
|
| 373 |
}
|
| 374 |
|
| 375 |
/**
|
| 376 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 377 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 378 |
* @return LineItemType|null
|
| 379 |
*/
|
| 380 |
+
private function getHandlingLineItemForQuoteAddress($quoteAddress, $merchantSettings)
|
| 381 |
+
{
|
| 382 |
if ($quoteAddress->getAddressType() == Mage_Sales_Model_Quote_Address::TYPE_BILLING) return null; // There is no shipping fees there
|
| 383 |
+
return $this->getHandlingLineItem(
|
| 384 |
+
$merchantSettings,
|
| 385 |
+
$quoteAddress->getShippingMethod(),
|
| 386 |
+
$quoteAddress->getShippingAmount(),
|
| 387 |
+
$quoteAddress->getShippingDiscountAmount());
|
| 388 |
+
}
|
| 389 |
+
|
| 390 |
+
public function getFoomanSurchargeLineItem($entity)
|
| 391 |
+
{
|
| 392 |
+
if (!Mage::helper('core')->isModuleEnabled('Fooman_Surcharge')) return null;
|
| 393 |
+
|
| 394 |
+
$foomanSurchargeAmount = Mage::app()->getStore()->roundPrice($entity->getFoomanSurchargeAmount());
|
| 395 |
+
if (!$foomanSurchargeAmount) return null;
|
| 396 |
+
|
| 397 |
+
$lineItem = new LineItemType();
|
| 398 |
+
$lineItem->setId(self::LINE_ITEM_ID_FOOMAN_SURCHARGE);
|
| 399 |
+
$lineItem->setSKU(self::SKU_FOOMAN_SURCHARGE);
|
| 400 |
+
if ($entity->getOrder() != null) {
|
| 401 |
+
$description = $entity->getOrder()->getFoomanSurchargeDescription();
|
| 402 |
+
} else {
|
| 403 |
+
$description = $entity->getFoomanSurchargeDescription();
|
| 404 |
+
}
|
| 405 |
+
if (!$description) {
|
| 406 |
+
$description = self::MSG_DEFAULT_FOOMAN_SURCHARGE;
|
| 407 |
+
}
|
| 408 |
+
|
| 409 |
+
$lineItem->setDescription($description);
|
| 410 |
+
$lineItem->setGrossAmount($foomanSurchargeAmount);
|
| 411 |
+
return $lineItem;
|
| 412 |
}
|
| 413 |
|
| 414 |
/**
|
| 415 |
* @param \Mage_Sales_Model_Quote_Address_Item|\Mage_Sales_Model_Quote_Item $magentoItem
|
| 416 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 417 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 418 |
* @return LineItemType
|
| 419 |
*/
|
| 420 |
public function buildLineItemForMagentoItem($magentoItem,
|
| 421 |
$quoteAddress,
|
| 422 |
+
$merchantSettings)
|
| 423 |
+
{
|
| 424 |
$lineItem = new LineItemType();
|
| 425 |
$lineItem->setDescription($magentoItem->getName());
|
| 426 |
if ($magentoItem->getBaseRowTotal())
|
| 428 |
else
|
| 429 |
$lineItem->setGrossAmount(0.0);
|
| 430 |
$lineItem->setQuantity($magentoItem->getTotalQty());
|
| 431 |
+
if ($magentoItem instanceof Mage_Sales_Model_Order_Creditmemo_Item) {
|
| 432 |
$lineItem->setSKU($this->getSKUForItem($magentoItem->getOrderItem(), $merchantSettings));
|
| 433 |
+
} else {
|
| 434 |
$lineItem->setSKU($this->getSKUForItem($magentoItem, $merchantSettings));
|
| 435 |
}
|
| 436 |
if (!$this->isDiscountExempt($magentoItem)) {
|
| 445 |
$product = Mage::getModel('catalog/product')
|
| 446 |
->setStoreId($magentoItem->getStoreId())
|
| 447 |
->load($magentoItem->getProductId());
|
| 448 |
+
}
|
| 449 |
if (in_array($product->getTypeId(), array(Mage_Catalog_Model_Product_Type::TYPE_BUNDLE))) {
|
| 450 |
if ($product->getPriceType() == self::PRICE_TYPE_DYNAMIC) {
|
| 451 |
$lineItem->setGrossAmount(0);
|
| 460 |
* @param \Mage_Sales_Model_Quote_Address_Item|\Mage_Sales_Model_Quote_Item $magentoItem
|
| 461 |
* @return void
|
| 462 |
*/
|
| 463 |
+
private function isDiscountExempt($magentoItem)
|
| 464 |
+
{
|
| 465 |
try {
|
| 466 |
$config = ExactorPluginConfig::getInstance();
|
| 467 |
if (!$config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS)) return false;
|
| 468 |
$exempted = $config->get(EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS);
|
| 469 |
if (!isset($exempted)) return false;
|
| 470 |
+
if ($magentoItem->getOrderItem() != null) {
|
| 471 |
$magentoItem = $magentoItem->getOrderItem();
|
| 472 |
}
|
| 473 |
$actual = preg_split('/,/', $magentoItem->getAppliedRuleIds());
|
| 487 |
* @param LineItemType $item
|
| 488 |
* @param int $discountAmount
|
| 489 |
*/
|
| 490 |
+
private function applyDiscountToLineItem($item, $discountAmount = 0)
|
| 491 |
+
{
|
| 492 |
+
if ($discountAmount > 0) {
|
| 493 |
$discountedLine = self::MSG_DISCOUNTED_BY . $discountAmount;
|
| 494 |
$item->setDescription($item->getDescription() . " ($discountedLine)");
|
| 495 |
$item->setGrossAmount($item->getGrossAmount() - $discountAmount);
|
| 498 |
|
| 499 |
/**
|
| 500 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 501 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 502 |
* @return mixed|string
|
| 503 |
*/
|
| 504 |
private function getExemptionIdForQuoteAddress($quoteAddress,
|
| 505 |
+
$merchantSettings)
|
| 506 |
+
{
|
| 507 |
$exemptionId = '';
|
| 508 |
+
if ($merchantSettings->getExemptionsSupported()) {
|
| 509 |
$customerExemptionId = $quoteAddress->getQuote()->getCustomer()->getData(self::ATTRIBUTE_NAME_EXEMPTION);
|
| 510 |
+
if ($customerExemptionId != null) $exemptionId = $customerExemptionId;
|
| 511 |
}
|
| 512 |
return $exemptionId;
|
| 513 |
}
|
| 514 |
|
| 515 |
/**
|
| 516 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 517 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 518 |
* @return string
|
| 519 |
*/
|
| 520 |
private function getExemptionIdForCreditMemo($creditMemo,
|
| 521 |
+
$merchantSettings)
|
| 522 |
+
{
|
| 523 |
$exemptionId = '';
|
| 524 |
+
if ($merchantSettings->getExemptionsSupported()) {
|
| 525 |
$customerExemptionId = $creditMemo->getOrder()->getCustomerTaxvat();
|
| 526 |
+
if ($customerExemptionId != null) $exemptionId = $customerExemptionId;
|
| 527 |
}
|
| 528 |
return $exemptionId;
|
| 529 |
}
|
| 530 |
|
| 531 |
/**
|
| 532 |
* @param Mage_Sales_Model_Order $order
|
| 533 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 534 |
* @return string
|
| 535 |
*/
|
| 536 |
private function getExemptionIdForOrder($order,
|
| 537 |
+
$merchantSettings)
|
| 538 |
+
{
|
| 539 |
$exemptionId = '';
|
| 540 |
+
if ($merchantSettings->getExemptionsSupported()) {
|
| 541 |
$customerExemptionId = $order->getCustomerTaxvat();
|
| 542 |
+
if ($customerExemptionId != null) $exemptionId = $customerExemptionId;
|
| 543 |
}
|
| 544 |
return $exemptionId;
|
| 545 |
}
|
| 548 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 549 |
* @return string
|
| 550 |
*/
|
| 551 |
+
private function getCurrentCurrencyCode($quoteAddress)
|
| 552 |
+
{
|
| 553 |
$store = Mage::app()->getStore();
|
| 554 |
+
if ($quoteAddress->getQuote() != null && $quoteAddress->getQuote()->getStoreId() != null) {
|
| 555 |
$store = $quoteAddress->getQuote()->getStore();
|
| 556 |
}
|
| 557 |
return $this->getCurrencyCodeForStore($store);
|
| 561 |
* @param Mage_Core_Model_Store $store
|
| 562 |
* @return string
|
| 563 |
*/
|
| 564 |
+
private function getCurrencyCodeForStore($store)
|
| 565 |
+
{
|
| 566 |
$currency = 'USD';
|
| 567 |
+
if ($store != null) {
|
| 568 |
+
$currency = $store->getBaseCurrencyCode() != null ? $store->getBaseCurrencyCode() : $currency;
|
| 569 |
}
|
| 570 |
return $currency;
|
| 571 |
}
|
| 572 |
|
| 573 |
+
private function buildGiftCardLineItem($amount)
|
| 574 |
+
{
|
| 575 |
$lineItem = new LineItemType();
|
| 576 |
$lineItem->setGrossAmount($amount);
|
| 577 |
$lineItem->setQuantity(1);
|
| 581 |
return $lineItem;
|
| 582 |
}
|
| 583 |
|
| 584 |
+
private function buildStoreCreditLineItem($amount)
|
| 585 |
+
{
|
| 586 |
$lineItem = new LineItemType();
|
| 587 |
$lineItem->setGrossAmount($amount);
|
| 588 |
$lineItem->setQuantity(1);
|
| 594 |
|
| 595 |
/**
|
| 596 |
* @param Mage_Sales_Model_Quote_Address $quoteAddress
|
| 597 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 598 |
* @param bool $isMultishipping
|
| 599 |
* @param $isEstimation
|
| 600 |
* @return InvoiceRequestType
|
| 601 |
*/
|
| 602 |
public function buildInvoiceRequestForQuoteAddress($quoteAddress,
|
| 603 |
$merchantSettings,
|
| 604 |
+
$isMultishipping, $isEstimation)
|
| 605 |
+
{
|
| 606 |
// Building Invoice Parts
|
| 607 |
$shipToAddress = $this->buildExactorAddressForQuoteAddress($quoteAddress);
|
| 608 |
// Trying to find billing address in the quote
|
| 609 |
$billingAddress = $this->buildExactorAddressForQuoteAddress($quoteAddress->getQuote()->getBillingAddress());
|
| 610 |
|
| 611 |
+
// If shipping info unavailable - fallback to billing information
|
| 612 |
+
if ($shipToAddress == null || !$shipToAddress->hasData()) $shipToAddress = $billingAddress;
|
| 613 |
+
if ($shipToAddress == null || !$shipToAddress->hasData()) $shipToAddress = null;
|
| 614 |
+
if ($shipToAddress == null) return null;
|
| 615 |
// If this is just tax estimation for not logged in user
|
| 616 |
// we just need to use shipping as billing
|
| 617 |
+
if ($isEstimation) {
|
| 618 |
$billingAddress = $shipToAddress;
|
| 619 |
+
$shipToAddress->setFullName(self::MSG_ESTIMATION_REQUEST);
|
| 620 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 621 |
// Composing invoice object
|
| 622 |
$invoiceRequest = new InvoiceRequestType();
|
| 623 |
$invoiceRequest->setSaleDate(new DateTime());
|
| 624 |
+
$invoiceRequest->setPurchaseOrderNumber(self::PO_ESTIMATE_TEXT . $quoteAddress->getId());
|
| 625 |
$invoiceRequest->setShipTo($shipToAddress);
|
| 626 |
$invoiceRequest->setBillTo($billingAddress);
|
| 627 |
$invoiceRequest->setCurrencyCode($this->getCurrentCurrencyCode($quoteAddress));
|
| 639 |
$exactorLineItem->setId($this->buildExactorItemId($magentoItem));
|
| 640 |
// If this is non-multishipping request we should set
|
| 641 |
// ship to address to billing address for VIRTUAL ITEMS
|
| 642 |
+
if (!$isMultishipping) {
|
| 643 |
+
if ($magentoItem->getProduct()->getIsVirtual()) {
|
| 644 |
// Previouse requirements was to set BillTo address for wi as Shipping info for virtual products
|
| 645 |
/*$virtualShipToAddress = $invoiceRequest->getShipTo(); //( $isEstimation ? $invoiceRequest->getShipFrom() : $billingAddress);
|
| 646 |
$exactorLineItem->setShipTo($virtualShipToAddress);
|
| 650 |
$invoiceRequest->addLineItem($exactorLineItem);
|
| 651 |
}
|
| 652 |
// Gift Cards
|
| 653 |
+
if ($quoteAddress->getBaseGiftCardsAmount() != null && $quoteAddress->getBaseGiftCardsAmount() != 0) {
|
| 654 |
$invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $quoteAddress->getBaseGiftCardsAmount()));
|
| 655 |
}
|
| 656 |
// Store Credit
|
| 658 |
if ($storeCreditAmount != null && $storeCreditAmount != 0) {
|
| 659 |
$invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
|
| 660 |
}
|
| 661 |
+
|
| 662 |
// Shipping & Handling
|
| 663 |
+
$shippingLineItem = $this->getShippingLineItemForQuoteAddress($quoteAddress, $merchantSettings);
|
| 664 |
+
$handlingLineItem = null;
|
| 665 |
+
if ($shippingLineItem != null) {
|
| 666 |
+
$handlingLineItem = $this->getHandlingLineItemForQuoteAddress(
|
| 667 |
+
$quoteAddress,
|
| 668 |
+
$merchantSettings,
|
| 669 |
+
$quoteAddress->getShippingAmount());
|
| 670 |
+
}
|
| 671 |
+
$invoiceRequest->addLineItem($shippingLineItem);
|
| 672 |
+
$invoiceRequest->addLineItem($handlingLineItem);
|
| 673 |
+
|
| 674 |
+
$invoiceRequest->addLineItem($this->getFoomanSurchargeLineItem($quoteAddress));
|
| 675 |
+
|
| 676 |
return $invoiceRequest;
|
| 677 |
}
|
| 678 |
|
| 688 |
*/
|
| 689 |
private function calculateProratedShippingAndHandling($orderedShippingAmount, $alreadyProcessedAmount,
|
| 690 |
$targetShippingAmount, $handlingTotalAmount,
|
| 691 |
+
$store)
|
| 692 |
+
{
|
| 693 |
// $orderedShippingAmount = $invoice->getOrder()->getBaseShippingAmount();
|
| 694 |
// $alreadyProcessedAmount = $invoice->getOrder()->getBaseShippingRefunded();
|
| 695 |
// $targetShippingAmount = $invoice->getBaseShippingAmount();
|
| 696 |
// $handlingTotalAmount = $handlingLineItem->getGrossAmount();
|
| 697 |
$delta = $orderedShippingAmount - $alreadyProcessedAmount + $targetShippingAmount;
|
| 698 |
$shippingFactor = $targetShippingAmount / $delta;
|
| 699 |
+
$handlingAmount = $handlingTotalAmount * $shippingFactor;
|
| 700 |
$shippingAmount = $targetShippingAmount - $handlingAmount;
|
| 701 |
return array($store->roundPrice($shippingAmount),
|
| 702 |
+
$store->roundPrice($shippingAmount));
|
| 703 |
}
|
| 704 |
|
| 705 |
/** Return invoice requests by credit memo. In case if credit memo contains adjustments - returns 2 separated invoices
|
| 706 |
* @param Mage_Sales_Model_Order_Creditmemo $creditMemo
|
| 707 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 708 |
* @return array InvoiceRequestType
|
| 709 |
*/
|
| 710 |
+
public function buildInvoiceRequestsForCreditMemo($creditMemo, $merchantSettings)
|
| 711 |
+
{
|
| 712 |
$result = array();
|
| 713 |
$invoiceRequest = new InvoiceRequestType();
|
| 714 |
$invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($creditMemo->getBillingAddress()));
|
| 720 |
$invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
|
| 721 |
// Line items
|
| 722 |
$magentoItems = $creditMemo->getAllItems();
|
| 723 |
+
foreach ($magentoItems as $magentoItem) {
|
| 724 |
$exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
|
| 725 |
+
if ($exactorLineItem != null) {
|
| 726 |
$exactorLineItem->setQuantity($magentoItem->getQty());
|
| 727 |
}
|
| 728 |
$invoiceRequest->addLineItem($exactorLineItem);
|
| 731 |
$shippingLineItem = $this->getShippingLineItemForCreditMemo($creditMemo, $merchantSettings);
|
| 732 |
$handlingLineItem = null;
|
| 733 |
|
| 734 |
+
if ($shippingLineItem != null) {
|
| 735 |
+
$handlingLineItem = $this->getHandlingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod(), $creditMemo->getOrder()->getBaseShippingAmount(), 0);
|
| 736 |
+
if ($handlingLineItem != null) { // TODO: use common method: calculateProratedShippingAndHandling(...)
|
| 737 |
$delta = $creditMemo->getOrder()->getBaseShippingAmount() - $creditMemo->getOrder()->getBaseShippingRefunded() + $creditMemo->getBaseShippingAmount();
|
| 738 |
$shippingFactor = $creditMemo->getBaseShippingAmount() / $delta;
|
| 739 |
+
$handlingAmount = $handlingLineItem->getGrossAmount() * $shippingFactor;
|
| 740 |
$shippingAmount = $creditMemo->getBaseShippingAmount() - $handlingAmount;
|
| 741 |
// Update amounts
|
| 742 |
$shippingLineItem->setGrossAmount($creditMemo->getStore()->roundPrice($shippingAmount));
|
| 746 |
|
| 747 |
$invoiceRequest->addLineItem($shippingLineItem);
|
| 748 |
$invoiceRequest->addLineItem($handlingLineItem);
|
| 749 |
+
$invoiceRequest->addLineItem($this->getFoomanSurchargeLineItem($creditMemo));
|
| 750 |
|
| 751 |
$result[] = $invoiceRequest;
|
| 752 |
// Adjustments
|
| 755 |
$adjustmentsItem->setDescription(self::MSG_ADJUSTMENTS);
|
| 756 |
$adjustmentsItem->setQuantity(1);
|
| 757 |
$adjustmentsItem->setSKU(self::EUC_NON_TAXABLE);
|
| 758 |
+
$adjustmentsItem->setGrossAmount($creditMemo->getAdjustmentPositive() - $creditMemo->getAdjustmentNegative());
|
| 759 |
if ($adjustmentsItem->getGrossAmount() != 0
|
| 760 |
+
|| $creditMemo->getBaseGiftCardsAmount() != null && $creditMemo->getBaseGiftCardsAmount() != 0
|
| 761 |
+
|| $creditMemo->getBaseCustomerBalanceAmount() != null && $creditMemo->getBaseCustomerBalanceAmount() != 0
|
| 762 |
) {
|
| 763 |
$adjustmentInvoice = clone $invoiceRequest;
|
| 764 |
$adjustmentInvoice->setPurchaseOrderNumber(self::MSG_ADJUSTMENTS_REFUND);
|
| 765 |
$adjustmentInvoice->setLineItems(array());
|
| 766 |
+
if ($adjustmentsItem->getGrossAmount() != 0) {
|
| 767 |
$adjustmentInvoice->addLineItem($adjustmentsItem);
|
| 768 |
}
|
| 769 |
// Gift Cards
|
| 770 |
+
if ($creditMemo->getBaseGiftCardsAmount() != null && $creditMemo->getBaseGiftCardsAmount() != 0) {
|
| 771 |
$adjustmentInvoice->addLineItem($this->buildGiftCardLineItem(-1 * $creditMemo->getBaseGiftCardsAmount()));
|
| 772 |
}
|
| 773 |
// Store Credit
|
| 785 |
* @param string $default
|
| 786 |
* @return DateTime
|
| 787 |
*/
|
| 788 |
+
private function getCreatedAtDateForMageOrder($order, $default = 'now')
|
| 789 |
+
{
|
| 790 |
$res = $default;
|
| 791 |
+
try {
|
| 792 |
+
$res = '@' . $order->getCreatedAtDate()->getTimestamp();
|
| 793 |
} catch (Exception $e) {
|
| 794 |
$this->logger->error("Can't get date. Using default value." . $e->getMessage(),
|
| 795 |
+
'getCreatedAtDateForMageInvoice');
|
| 796 |
}
|
| 797 |
return new DateTime($res);
|
| 798 |
}
|
| 799 |
|
| 800 |
/**
|
| 801 |
* @param Mage_Sales_Model_Order_Invoice $invoice
|
| 802 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 803 |
* @return array
|
| 804 |
*/
|
| 805 |
+
public function buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings)
|
| 806 |
+
{
|
| 807 |
$result = array();
|
| 808 |
$invoiceRequest = new InvoiceRequestType();
|
| 809 |
$invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($invoice->getBillingAddress()));
|
| 816 |
//$invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
|
| 817 |
// Line items
|
| 818 |
$magentoItems = $invoice->getAllItems();
|
| 819 |
+
foreach ($magentoItems as $magentoItem) {
|
| 820 |
$exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
|
| 821 |
+
if ($exactorLineItem != null) {
|
| 822 |
$exactorLineItem->setQuantity($magentoItem->getQty());
|
| 823 |
}
|
| 824 |
$invoiceRequest->addLineItem($exactorLineItem);
|
| 826 |
// Shipping & Handling
|
| 827 |
$shippingLineItem = $this->getShippingLineItemForInvoice($invoice, $merchantSettings);
|
| 828 |
$handlingLineItem = null;
|
| 829 |
+
if ($shippingLineItem != null) {
|
| 830 |
+
$handlingLineItem = $this->getHandlingLineItem(
|
| 831 |
+
$merchantSettings,
|
| 832 |
+
$invoice->getOrder()->getShippingMethod(),
|
| 833 |
+
$invoice->getOrder()->getBaseShippingAmount(),
|
| 834 |
+
$invoice->getOrder()->getBaseShippingDiscountAmount());
|
| 835 |
}
|
| 836 |
$invoiceRequest->addLineItem($shippingLineItem);
|
| 837 |
$invoiceRequest->addLineItem($handlingLineItem);
|
| 838 |
// Gift cards
|
| 839 |
+
if ($invoice->getBaseGiftCardsAmount() != null && $invoice->getBaseGiftCardsAmount() != 0) {
|
| 840 |
$invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $invoice->getBaseGiftCardsAmount()));
|
| 841 |
}
|
| 842 |
// Store Credit
|
| 844 |
if ($storeCreditAmount != null && $storeCreditAmount != 0) {
|
| 845 |
$invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
|
| 846 |
}
|
| 847 |
+
$invoiceRequest->addLineItem($this->getFoomanSurchargeLineItem($invoice));
|
| 848 |
+
|
| 849 |
$result[] = $invoiceRequest;
|
| 850 |
return $result;
|
| 851 |
}
|
| 852 |
|
| 853 |
/**
|
| 854 |
* @param Mage_Sales_Model_Order $order
|
| 855 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 856 |
* @return array
|
| 857 |
*/
|
| 858 |
+
public function buildInvoiceRequestForMagentoOrder($order, $merchantSettings)
|
| 859 |
+
{
|
| 860 |
$result = array();
|
| 861 |
$invoiceRequest = new InvoiceRequestType();
|
| 862 |
$invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($order->getBillingAddress()));
|
| 868 |
$invoiceRequest->setExemptionId($this->getExemptionIdForOrder($order, $merchantSettings));
|
| 869 |
// Line items
|
| 870 |
$magentoItems = $order->getAllItems();
|
| 871 |
+
foreach ($magentoItems as $magentoItem) {
|
| 872 |
$exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
|
| 873 |
+
if ($exactorLineItem != null) {
|
| 874 |
$exactorLineItem->setQuantity($magentoItem->getQtyOrdered());
|
| 875 |
$exactorLineItem->setId($this->buildExactorItemId($magentoItem));
|
| 876 |
}
|
| 879 |
// Shipping & Handling
|
| 880 |
$shippingLineItem = $this->getShippingLineItemForOrder($order, $merchantSettings);
|
| 881 |
$handlingLineItem = null;
|
| 882 |
+
if ($shippingLineItem != null) {
|
| 883 |
+
$handlingLineItem = $this->getHandlingLineItem(
|
| 884 |
+
$merchantSettings,
|
| 885 |
+
$order->getShippingMethod(),
|
| 886 |
+
$order->getBaseShippingAmount(),
|
| 887 |
+
$order->getBaseShippingDiscountAmount());
|
| 888 |
}
|
| 889 |
$invoiceRequest->addLineItem($shippingLineItem);
|
| 890 |
$invoiceRequest->addLineItem($handlingLineItem);
|
| 891 |
// Gift cards
|
| 892 |
+
if ($order->getBaseGiftCardsAmount() != null && $order->getBaseGiftCardsAmount() != 0) {
|
| 893 |
$invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $order->getBaseGiftCardsAmount()));
|
| 894 |
}
|
| 895 |
// Store Credit
|
| 897 |
if ($storeCreditAmount != null && $storeCreditAmount != 0) {
|
| 898 |
$invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
|
| 899 |
}
|
| 900 |
+
$invoiceRequest->addLineItem($this->getFoomanSurchargeLineItem($order));
|
| 901 |
+
|
| 902 |
$result[] = $invoiceRequest;
|
| 903 |
return $result;
|
| 904 |
}
|
| 908 |
* @param Mage_Customer_Model_Address_Abstract|AddressType $address
|
| 909 |
* @return bool
|
| 910 |
*/
|
| 911 |
+
public function isAllowedLocation($filter, $address)
|
| 912 |
+
{
|
| 913 |
/* Filter has the following structure:
|
| 914 |
countryName1: array(state1, state2, state3)
|
| 915 |
countryName1: array(state1, state2, state3)
|
| 933 |
* @param AddressType $address
|
| 934 |
* @return bool
|
| 935 |
*/
|
| 936 |
+
private function isAddessFullyPopulated($address)
|
| 937 |
+
{
|
| 938 |
+
if ($address == null || !$address->hasData()) return false;
|
| 939 |
return strlen(trim($address->getStreet1())) > 0
|
| 940 |
&& strlen(trim($address->getFullName())) > 0
|
| 941 |
&& strlen(trim($address->getCity())) > 0;
|
| 949 |
* @param InvoiceRequestType $invoice
|
| 950 |
* @return bool
|
| 951 |
*/
|
| 952 |
+
public function isInvoiceAddressesFullyPopulated($invoice)
|
| 953 |
+
{
|
| 954 |
if ($invoice == null) return false;
|
| 955 |
return $this->isAddessFullyPopulated($invoice->getShipTo());
|
| 956 |
+
//&& $this->isAddessFullyPopulated($invoice->getBillTo());
|
| 957 |
}
|
| 958 |
}
|
app/code/local/{Exactor → ZzzzzExactor}/Tax/Model/Sales/Total/Quote/Nominal/Tax.php
RENAMED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Time: 8:39 AM
|
| 6 |
*/
|
| 7 |
|
| 8 |
-
class
|
| 9 |
{
|
| 10 |
|
| 11 |
public function collect(Mage_Sales_Model_Quote_Address $address)
|
| 5 |
* Time: 8:39 AM
|
| 6 |
*/
|
| 7 |
|
| 8 |
+
class ZzzzzExactor_Tax_Model_Sales_Total_Quote_Nominal_Tax extends Mage_Sales_Model_Quote_Address_Total_Abstract
|
| 9 |
{
|
| 10 |
|
| 11 |
public function collect(Mage_Sales_Model_Quote_Address $address)
|
app/code/local/{Exactor → ZzzzzExactor}/Tax/Model/Sales/Total/Quote/Tax.php
RENAMED
|
@@ -4,9 +4,10 @@
|
|
| 4 |
* This class will be used by Magento Core to collect Tax total per address
|
| 5 |
* In magento 1.3 and earlier Mage_Tax_Model_Sales_Total_Quote_Tax
|
| 6 |
*/
|
| 7 |
-
class
|
|
|
|
| 8 |
|
| 9 |
-
const MODEL_MERCHANT_SETTINGS = "
|
| 10 |
|
| 11 |
const LOG_MESSAGE_TAX_CALC_FAILED = 'Tax calculation failed due to the following reason: ';
|
| 12 |
|
|
@@ -19,7 +20,8 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 19 |
|
| 20 |
/**Show message to the buyer on errors listed below, all other Exactor errors will be displayed as General errors
|
| 21 |
* @see self::MSG_GENERAL_ERROR
|
| 22 |
-
* @var array
|
|
|
|
| 23 |
private $notifyUserErrorCodes;
|
| 24 |
|
| 25 |
/**
|
|
@@ -30,12 +32,12 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 30 |
protected $_helper;
|
| 31 |
|
| 32 |
/**
|
| 33 |
-
* @var
|
| 34 |
*/
|
| 35 |
private $exactorTaxCalculation;
|
| 36 |
|
| 37 |
/**
|
| 38 |
-
* @var
|
| 39 |
*/
|
| 40 |
private $exactorMappingHelper;
|
| 41 |
|
|
@@ -43,7 +45,7 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 43 |
private $session;
|
| 44 |
|
| 45 |
/**
|
| 46 |
-
* @var
|
| 47 |
*/
|
| 48 |
private $exactorSessionCache;
|
| 49 |
/**
|
|
@@ -53,10 +55,11 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 53 |
*/
|
| 54 |
protected $_config;
|
| 55 |
|
| 56 |
-
/** @var \
|
| 57 |
private $exactorSettingsHelper;
|
| 58 |
|
| 59 |
-
private function setupExactorCommonLibrary()
|
|
|
|
| 60 |
$libDir = Mage::getBaseDir("lib") . '/ExactorCommons';
|
| 61 |
require_once($libDir . '/XmlProcessing.php');
|
| 62 |
require_once($libDir . '/ExactorDomainObjects.php');
|
|
@@ -70,28 +73,29 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 70 |
public function __construct()
|
| 71 |
{
|
| 72 |
$this->setCode('tax');
|
| 73 |
-
$this->_helper
|
| 74 |
-
$this->_config
|
| 75 |
$this->setupExactorCommonLibrary();
|
| 76 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 77 |
$this->exactorTaxCalculation = Mage::helper('tax/calculation');
|
| 78 |
$this->exactorMappingHelper = Mage::helper('tax/mapping');
|
| 79 |
-
$this->exactorSessionCache = Mage::helper('
|
| 80 |
$this->exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 81 |
$this->session = Mage::getSingleton('core/session', array('name' => 'frontend'));
|
| 82 |
$this->notifyUserErrorCodes = array(ErrorResponseType::ERROR_MISSING_LINE_ITEMS,
|
| 83 |
-
|
| 84 |
-
|
| 85 |
}
|
| 86 |
|
| 87 |
|
| 88 |
/**
|
| 89 |
* Load merchantSettings from the database
|
| 90 |
* @param Mage_Sales_Model_Quote_Address $address
|
| 91 |
-
* @return
|
| 92 |
*/
|
| 93 |
-
public function loadMerchantSettings($address=null)
|
| 94 |
-
|
|
|
|
| 95 |
return $this->exactorSettingsHelper->loadValidMerchantSettings($storeViewId);
|
| 96 |
}
|
| 97 |
|
|
@@ -99,9 +103,10 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 99 |
* Return True if there is multi-shipping request
|
| 100 |
* @return bool
|
| 101 |
*/
|
| 102 |
-
private function isMultishippingRequest()
|
|
|
|
| 103 |
$controller = Mage::app()->getRequest()->getControllerName();
|
| 104 |
-
return (strstr("multishipping"
|
| 105 |
}
|
| 106 |
|
| 107 |
/**
|
|
@@ -114,7 +119,7 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 114 |
{
|
| 115 |
//parent::collect($address);
|
| 116 |
$this->_setAddress($address);
|
| 117 |
-
if (count($address->getAllItems())<=0) return; // Skip addresses without items
|
| 118 |
if ($address->getId() == null) return; // Skip if there is no address
|
| 119 |
//$this->_setAmount(0);
|
| 120 |
//$this->logger->trace('Called for address #' . $address->getId() . ' (' . $address->getAddressType() . ')','collect');
|
|
@@ -138,8 +143,8 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 138 |
return $internalTaxCalculator->collect($address);
|
| 139 |
}
|
| 140 |
}
|
| 141 |
-
$this->logger->trace('Invoice ' . serialize($invoiceRequest),'collect');
|
| 142 |
-
if ($invoiceRequest != null && $this->checkIfCalculationNeeded($invoiceRequest, $merchantSettings)){
|
| 143 |
if ($config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_DISABLE_ESTIMATES)) {
|
| 144 |
if (!$this->exactorMappingHelper->isInvoiceAddressesFullyPopulated($invoiceRequest)) {
|
| 145 |
$this->logger->info('Skipping tax estimate due to the Exactor plug-in configuration', 'collect');
|
|
@@ -148,23 +153,27 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 148 |
}
|
| 149 |
// Sending to Exactor Tax Calculation Request to Exactor
|
| 150 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService($merchantSettings->getMerchantID(),
|
| 151 |
-
|
| 152 |
$calculatedTax = 0;
|
| 153 |
-
try{
|
| 154 |
$exactorResponse = $exactorProcessingService->calculateTax($invoiceRequest);
|
| 155 |
-
if ($exactorResponse->hasErrors()){ // Exactor unable to calculate tax
|
| 156 |
$msg = self::MSG_GENERAL_ERROR . 'EX' . $exactorResponse->getFirstError()->getErrorCode();
|
| 157 |
if (in_array($exactorResponse->getFirstError()->getErrorCode(), $this->notifyUserErrorCodes))
|
| 158 |
$msg = $exactorResponse->getFirstError()->getErrorDescription();
|
| 159 |
return $this->processTaxCalculationFail($msg);
|
| 160 |
-
}else{
|
| 161 |
$invoiceResponse = $exactorResponse->getFirstInvoice();
|
| 162 |
-
if ($invoiceResponse!=null){
|
| 163 |
$calculatedTax = $invoiceResponse->getTotalTaxAmount();
|
| 164 |
$this->applyTaxForItems($address, $invoiceResponse);
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
}
|
| 166 |
}
|
| 167 |
-
}catch(Exception $e){ // Critical Exactor communication error - Network timeout for instance
|
| 168 |
$this->applyTax(0);
|
| 169 |
$this->resetTaxForItems($address);
|
| 170 |
$this->logger->error(self::LOG_MESSAGE_TAX_CALC_FAILED . $e->getMessage(), 'collect');
|
|
@@ -173,37 +182,12 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 173 |
$this->applyTax($calculatedTax);
|
| 174 |
$address->setTaxAmount($calculatedTax);
|
| 175 |
$address->setBaseTaxAmount($calculatedTax);
|
| 176 |
-
}else{
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
/**
|
| 182 |
-
* @var Mage_Sales_Model_Quote_Item $item
|
| 183 |
-
*/
|
| 184 |
-
$shippingTax = $address->getTaxAmount();
|
| 185 |
-
foreach ($address->getAllItems() as $item) {
|
| 186 |
-
$shippingTax -= $item->getTaxAmount();
|
| 187 |
-
}
|
| 188 |
-
$shippingTax = Mage::app()->getStore()->roundPrice($shippingTax);
|
| 189 |
-
// The following code is workaraund for the bug in Magento 1.6.2 - Tax applied to the QuoteAddress object
|
| 190 |
-
// can be missed by Magento for some reason. This issue can be reproduced in very trickily manner:
|
| 191 |
-
// 1. login
|
| 192 |
-
// 2. add product to the cart
|
| 193 |
-
// 3. logout
|
| 194 |
-
// 4. login again
|
| 195 |
-
// 5. proceed to purchase
|
| 196 |
-
// 6. select FREE SHIPPING
|
| 197 |
-
// 7. tax will be zero in front-end, negative in fact. The reason - $address->getTaxAmount() will return 0,
|
| 198 |
-
// while line items still contains valid tax
|
| 199 |
-
// IMPORTANT: Issue can be reproduced only once per session (first attempt), thus you should clear cookies before login.
|
| 200 |
-
if ($shippingTax < 0){
|
| 201 |
-
$this->applyTax(-1 * $shippingTax);
|
| 202 |
-
$shippingTax = 0;
|
| 203 |
}
|
| 204 |
-
//
|
| 205 |
-
$address->setShippingTaxAmount($shippingTax);
|
| 206 |
-
$address->setBaseShippingTaxAmount($shippingTax);
|
| 207 |
}
|
| 208 |
return $this;
|
| 209 |
}
|
|
@@ -216,7 +200,7 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 216 |
private function isEstimation()
|
| 217 |
{
|
| 218 |
return strpos($this->session->getLastUrl(), "estimatePost") != false
|
| 219 |
-
|
| 220 |
}
|
| 221 |
|
| 222 |
/**
|
|
@@ -225,44 +209,78 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 225 |
* @param InvoiceResponseType $invoice
|
| 226 |
* @return void
|
| 227 |
*/
|
| 228 |
-
private function applyTaxForItems(Mage_Sales_Model_Quote_Address $address, InvoiceResponseType $invoice)
|
|
|
|
| 229 |
$i = 0;
|
| 230 |
/**
|
| 231 |
* @var Mage_Sales_Model_Quote_Item $item
|
| 232 |
*/
|
| 233 |
-
foreach ($address->getAllItems() as $item){
|
| 234 |
$taxResultItem = $invoice->getItemById($this->exactorMappingHelper->buildExactorItemId($item));
|
| 235 |
// If there is no item in response - set tax to 0
|
| 236 |
-
if ($taxResultItem==null){
|
| 237 |
$item->setTaxAmount(0);
|
| 238 |
$item->setBaseTaxAmount(0);
|
| 239 |
-
|
|
|
|
| 240 |
$item->setTaxAmount($taxResultItem->getTotalTaxAmount());
|
| 241 |
$item->setBaseTaxAmount($taxResultItem->getTotalTaxAmount());
|
|
|
|
| 242 |
}
|
| 243 |
}
|
| 244 |
// Set Shipping + handling tax
|
| 245 |
$totalShippingTax = 0;
|
| 246 |
-
$shippingTaxItem = $invoice->getItemById(
|
| 247 |
-
$handlingTaxItem = $invoice->getItemById(
|
| 248 |
-
if ($shippingTaxItem != null) $totalShippingTax
|
| 249 |
-
if ($handlingTaxItem != null) $totalShippingTax
|
| 250 |
$address->setShippingTaxAmount($totalShippingTax);
|
| 251 |
$address->setBaseShippingTaxAmount($totalShippingTax);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 252 |
}
|
| 253 |
|
| 254 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 255 |
/**
|
| 256 |
* @var Mage_Sales_Model_Quote_Item $item
|
| 257 |
*/
|
| 258 |
-
foreach ($address->getAllItems() as $item){
|
| 259 |
$item->setTaxAmount(0);
|
| 260 |
$item->setBaseTaxAmount(0);
|
|
|
|
| 261 |
}
|
| 262 |
$address->setShippingTaxAmount(0);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 263 |
}
|
| 264 |
|
| 265 |
-
private function applyTax($amount)
|
|
|
|
| 266 |
$this->_setBaseAmount($amount);
|
| 267 |
$this->_setAmount($amount);
|
| 268 |
}
|
|
@@ -270,10 +288,11 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 270 |
/**
|
| 271 |
* Return TRUE if tax calculation IS needed, FALSE - otherwise
|
| 272 |
* @param InvoiceRequestType $invoiceRequest
|
| 273 |
-
* @param
|
| 274 |
* @return bool
|
| 275 |
*/
|
| 276 |
-
private function checkIfCalculationNeeded($invoiceRequest, $merchantSettings)
|
|
|
|
| 277 |
// Calculating digital signature for the current request
|
| 278 |
if ($invoiceRequest == null || $invoiceRequest->getLineItems() == null) return false;
|
| 279 |
$taxRequest = ExactorConnectionFactory::getInstance()->buildRequest($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
|
@@ -283,26 +302,28 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 283 |
$signature = $signatureBuilder->buildDigitalSignature();
|
| 284 |
// Loading previous one from the session cache
|
| 285 |
$prviousTrnInfo = $this->exactorSessionCache->getLatestTransactionInfo($invoiceRequest->getPurchaseOrderNumber());
|
| 286 |
-
if ($prviousTrnInfo==null) return true;
|
| 287 |
if ($prviousTrnInfo->getSignature() == $signature) return false;
|
| 288 |
return true;
|
| 289 |
}
|
| 290 |
|
| 291 |
-
private function reportError($msg)
|
|
|
|
| 292 |
$errObj = Mage::getSingleton('core/message')->error($msg);
|
| 293 |
-
foreach ($this->session->getMessages()->getErrors() as $message){
|
| 294 |
if ($message->getCode() == $errObj->getCode())
|
| 295 |
return;
|
| 296 |
}
|
| 297 |
$this->session->addMessage($errObj);
|
| 298 |
}
|
| 299 |
-
|
| 300 |
/**
|
| 301 |
* Do postprocessing after failed tax calculation
|
| 302 |
* @param $reason
|
| 303 |
-
* @return
|
| 304 |
*/
|
| 305 |
-
private function processTaxCalculationFail($reason)
|
|
|
|
| 306 |
$this->applyTax(0);
|
| 307 |
$this->logger->error(self::LOG_MESSAGE_TAX_CALC_FAILED . $reason, 'collect');
|
| 308 |
$this->reportError($reason);
|
|
@@ -321,23 +342,23 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 321 |
|
| 322 |
public function fetch(Mage_Sales_Model_Quote_Address $address)
|
| 323 |
{
|
| 324 |
-
$applied
|
| 325 |
-
$store
|
| 326 |
-
$amount
|
| 327 |
-
$area
|
| 328 |
if ($this->_config->displayCartTaxWithGrandTotal($store) && $address->getGrandTotal()) {
|
| 329 |
-
$area
|
| 330 |
}
|
| 331 |
|
| 332 |
// if (is_array($applied) && (($amount!=0) || ($this->_config->displayCartZeroTax($store)))) {
|
| 333 |
-
|
| 334 |
-
|
| 335 |
-
|
| 336 |
-
|
| 337 |
-
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
|
| 342 |
$store = $address->getQuote()->getStore();
|
| 343 |
/**
|
|
@@ -347,13 +368,13 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 347 |
if ($address->getSubtotalInclTax() > 0) {
|
| 348 |
$subtotalInclTax = $address->getSubtotalInclTax();
|
| 349 |
} else {
|
| 350 |
-
$subtotalInclTax = $address->getSubtotal()
|
| 351 |
}
|
| 352 |
|
| 353 |
$address->addTotal(array(
|
| 354 |
-
'code'
|
| 355 |
-
'title'
|
| 356 |
-
'value'
|
| 357 |
'value_incl_tax' => $subtotalInclTax,
|
| 358 |
'value_excl_tax' => $address->getSubtotal(),
|
| 359 |
));
|
|
@@ -361,4 +382,57 @@ class Exactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Add
|
|
| 361 |
|
| 362 |
return $this;
|
| 363 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 364 |
}
|
| 4 |
* This class will be used by Magento Core to collect Tax total per address
|
| 5 |
* In magento 1.3 and earlier Mage_Tax_Model_Sales_Total_Quote_Tax
|
| 6 |
*/
|
| 7 |
+
class ZzzzzExactor_Tax_Model_Sales_Total_Quote_Tax extends Mage_Sales_Model_Quote_Address_Total_Abstract
|
| 8 |
+
{ //Mage_Tax_Model_Sales_Total_Quote_Tax { //{
|
| 9 |
|
| 10 |
+
const MODEL_MERCHANT_SETTINGS = "ZzzzzExactor_Core_Model_MerchantSettings";
|
| 11 |
|
| 12 |
const LOG_MESSAGE_TAX_CALC_FAILED = 'Tax calculation failed due to the following reason: ';
|
| 13 |
|
| 20 |
|
| 21 |
/**Show message to the buyer on errors listed below, all other Exactor errors will be displayed as General errors
|
| 22 |
* @see self::MSG_GENERAL_ERROR
|
| 23 |
+
* @var array
|
| 24 |
+
*/
|
| 25 |
private $notifyUserErrorCodes;
|
| 26 |
|
| 27 |
/**
|
| 32 |
protected $_helper;
|
| 33 |
|
| 34 |
/**
|
| 35 |
+
* @var ZzzzzExactor_Tax_Helper_Calculation
|
| 36 |
*/
|
| 37 |
private $exactorTaxCalculation;
|
| 38 |
|
| 39 |
/**
|
| 40 |
+
* @var ZzzzzExactor_Tax_Helper_Mapping
|
| 41 |
*/
|
| 42 |
private $exactorMappingHelper;
|
| 43 |
|
| 45 |
private $session;
|
| 46 |
|
| 47 |
/**
|
| 48 |
+
* @var ZzzzzExactor_Core_Helper_SessionCache
|
| 49 |
*/
|
| 50 |
private $exactorSessionCache;
|
| 51 |
/**
|
| 55 |
*/
|
| 56 |
protected $_config;
|
| 57 |
|
| 58 |
+
/** @var \ZzzzzExactor_ExactorSettings_Helper_Data */
|
| 59 |
private $exactorSettingsHelper;
|
| 60 |
|
| 61 |
+
private function setupExactorCommonLibrary()
|
| 62 |
+
{
|
| 63 |
$libDir = Mage::getBaseDir("lib") . '/ExactorCommons';
|
| 64 |
require_once($libDir . '/XmlProcessing.php');
|
| 65 |
require_once($libDir . '/ExactorDomainObjects.php');
|
| 73 |
public function __construct()
|
| 74 |
{
|
| 75 |
$this->setCode('tax');
|
| 76 |
+
$this->_helper = Mage::helper('tax');
|
| 77 |
+
$this->_config = Mage::getSingleton('tax/config');
|
| 78 |
$this->setupExactorCommonLibrary();
|
| 79 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 80 |
$this->exactorTaxCalculation = Mage::helper('tax/calculation');
|
| 81 |
$this->exactorMappingHelper = Mage::helper('tax/mapping');
|
| 82 |
+
$this->exactorSessionCache = Mage::helper('ZzzzzExactor_Core_SessionCache/');
|
| 83 |
$this->exactorSettingsHelper = Mage::helper('ExactorSettings');
|
| 84 |
$this->session = Mage::getSingleton('core/session', array('name' => 'frontend'));
|
| 85 |
$this->notifyUserErrorCodes = array(ErrorResponseType::ERROR_MISSING_LINE_ITEMS,
|
| 86 |
+
ErrorResponseType::ERROR_INVALID_SHIP_TO_ADDRESS,
|
| 87 |
+
ErrorResponseType::ERROR_INVALID_CURRENCY_CODE);
|
| 88 |
}
|
| 89 |
|
| 90 |
|
| 91 |
/**
|
| 92 |
* Load merchantSettings from the database
|
| 93 |
* @param Mage_Sales_Model_Quote_Address $address
|
| 94 |
+
* @return ZzzzzExactor_Core_Model_MerchantSettings
|
| 95 |
*/
|
| 96 |
+
public function loadMerchantSettings($address = null)
|
| 97 |
+
{
|
| 98 |
+
$storeViewId = $address->getQuote()->getStoreId(); //Mage::app()->getStore()->getId();
|
| 99 |
return $this->exactorSettingsHelper->loadValidMerchantSettings($storeViewId);
|
| 100 |
}
|
| 101 |
|
| 103 |
* Return True if there is multi-shipping request
|
| 104 |
* @return bool
|
| 105 |
*/
|
| 106 |
+
private function isMultishippingRequest()
|
| 107 |
+
{
|
| 108 |
$controller = Mage::app()->getRequest()->getControllerName();
|
| 109 |
+
return (strstr("multishipping", $controller) > 0);
|
| 110 |
}
|
| 111 |
|
| 112 |
/**
|
| 119 |
{
|
| 120 |
//parent::collect($address);
|
| 121 |
$this->_setAddress($address);
|
| 122 |
+
if (count($address->getAllItems()) <= 0) return; // Skip addresses without items
|
| 123 |
if ($address->getId() == null) return; // Skip if there is no address
|
| 124 |
//$this->_setAmount(0);
|
| 125 |
//$this->logger->trace('Called for address #' . $address->getId() . ' (' . $address->getAddressType() . ')','collect');
|
| 143 |
return $internalTaxCalculator->collect($address);
|
| 144 |
}
|
| 145 |
}
|
| 146 |
+
$this->logger->trace('Invoice ' . serialize($invoiceRequest), 'collect');
|
| 147 |
+
if ($invoiceRequest != null && $this->checkIfCalculationNeeded($invoiceRequest, $merchantSettings)) {
|
| 148 |
if ($config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_DISABLE_ESTIMATES)) {
|
| 149 |
if (!$this->exactorMappingHelper->isInvoiceAddressesFullyPopulated($invoiceRequest)) {
|
| 150 |
$this->logger->info('Skipping tax estimate due to the Exactor plug-in configuration', 'collect');
|
| 153 |
}
|
| 154 |
// Sending to Exactor Tax Calculation Request to Exactor
|
| 155 |
$exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService($merchantSettings->getMerchantID(),
|
| 156 |
+
$merchantSettings->getUserID());
|
| 157 |
$calculatedTax = 0;
|
| 158 |
+
try {
|
| 159 |
$exactorResponse = $exactorProcessingService->calculateTax($invoiceRequest);
|
| 160 |
+
if ($exactorResponse->hasErrors()) { // Exactor unable to calculate tax
|
| 161 |
$msg = self::MSG_GENERAL_ERROR . 'EX' . $exactorResponse->getFirstError()->getErrorCode();
|
| 162 |
if (in_array($exactorResponse->getFirstError()->getErrorCode(), $this->notifyUserErrorCodes))
|
| 163 |
$msg = $exactorResponse->getFirstError()->getErrorDescription();
|
| 164 |
return $this->processTaxCalculationFail($msg);
|
| 165 |
+
} else {
|
| 166 |
$invoiceResponse = $exactorResponse->getFirstInvoice();
|
| 167 |
+
if ($invoiceResponse != null) {
|
| 168 |
$calculatedTax = $invoiceResponse->getTotalTaxAmount();
|
| 169 |
$this->applyTaxForItems($address, $invoiceResponse);
|
| 170 |
+
|
| 171 |
+
if ($config->get(EXACTOR_CONFIG_ALWAYS_OVERRIDE_TAX) === true) {
|
| 172 |
+
$this->session->setLastInvoiceResponse(serialize($invoiceResponse));
|
| 173 |
+
}
|
| 174 |
}
|
| 175 |
}
|
| 176 |
+
} catch (Exception $e) { // Critical Exactor communication error - Network timeout for instance
|
| 177 |
$this->applyTax(0);
|
| 178 |
$this->resetTaxForItems($address);
|
| 179 |
$this->logger->error(self::LOG_MESSAGE_TAX_CALC_FAILED . $e->getMessage(), 'collect');
|
| 182 |
$this->applyTax($calculatedTax);
|
| 183 |
$address->setTaxAmount($calculatedTax);
|
| 184 |
$address->setBaseTaxAmount($calculatedTax);
|
| 185 |
+
} else {
|
| 186 |
+
if ($config->get(EXACTOR_CONFIG_ALWAYS_OVERRIDE_TAX) === true) {
|
| 187 |
+
$this->processTaxOverridingRequired($address);
|
| 188 |
+
} else {
|
| 189 |
+
$this->processCalculationIsNotRequired($address);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 190 |
}
|
|
|
|
|
|
|
|
|
|
| 191 |
}
|
| 192 |
return $this;
|
| 193 |
}
|
| 200 |
private function isEstimation()
|
| 201 |
{
|
| 202 |
return strpos($this->session->getLastUrl(), "estimatePost") != false
|
| 203 |
+
|| strpos($this->session->getLastUrl(), "estimateUpdatePost") != false;
|
| 204 |
}
|
| 205 |
|
| 206 |
/**
|
| 209 |
* @param InvoiceResponseType $invoice
|
| 210 |
* @return void
|
| 211 |
*/
|
| 212 |
+
private function applyTaxForItems(Mage_Sales_Model_Quote_Address $address, InvoiceResponseType $invoice)
|
| 213 |
+
{
|
| 214 |
$i = 0;
|
| 215 |
/**
|
| 216 |
* @var Mage_Sales_Model_Quote_Item $item
|
| 217 |
*/
|
| 218 |
+
foreach ($address->getAllItems() as $item) {
|
| 219 |
$taxResultItem = $invoice->getItemById($this->exactorMappingHelper->buildExactorItemId($item));
|
| 220 |
// If there is no item in response - set tax to 0
|
| 221 |
+
if ($taxResultItem == null) {
|
| 222 |
$item->setTaxAmount(0);
|
| 223 |
$item->setBaseTaxAmount(0);
|
| 224 |
+
$item->setTaxPercent(0);
|
| 225 |
+
} else { // Else - Apply tax to the item
|
| 226 |
$item->setTaxAmount($taxResultItem->getTotalTaxAmount());
|
| 227 |
$item->setBaseTaxAmount($taxResultItem->getTotalTaxAmount());
|
| 228 |
+
$this->applyTaxPercent($item, $taxResultItem);
|
| 229 |
}
|
| 230 |
}
|
| 231 |
// Set Shipping + handling tax
|
| 232 |
$totalShippingTax = 0;
|
| 233 |
+
$shippingTaxItem = $invoice->getItemById(ZzzzzExactor_Tax_Helper_Mapping::LINE_ITEM_ID_SHIPPING);
|
| 234 |
+
$handlingTaxItem = $invoice->getItemById(ZzzzzExactor_Tax_Helper_Mapping::LINE_ITEM_ID_HANDLING);
|
| 235 |
+
if ($shippingTaxItem != null) $totalShippingTax += $shippingTaxItem->getTotalTaxAmount();
|
| 236 |
+
if ($handlingTaxItem != null) $totalShippingTax += $handlingTaxItem->getTotalTaxAmount();
|
| 237 |
$address->setShippingTaxAmount($totalShippingTax);
|
| 238 |
$address->setBaseShippingTaxAmount($totalShippingTax);
|
| 239 |
+
|
| 240 |
+
if (Mage::helper('core')->isModuleEnabled('Fooman_Surcharge')) {
|
| 241 |
+
$foomanSurchargeTaxItem = $invoice->getItemById(ZzzzzExactor_Tax_Helper_Mapping::LINE_ITEM_ID_FOOMAN_SURCHARGE);
|
| 242 |
+
$foomanSurchargeTax = $foomanSurchargeTaxItem != null ? $foomanSurchargeTaxItem->getTotalTaxAmount() : 0;
|
| 243 |
+
$address->setFoomanSurchargeTaxAmount($foomanSurchargeTax);
|
| 244 |
+
$address->setBaseFoomanSurchargeTaxAmount($foomanSurchargeTax);
|
| 245 |
+
$this->session->setFoomanSurchargeTaxAmount($foomanSurchargeTax);
|
| 246 |
+
}
|
| 247 |
}
|
| 248 |
|
| 249 |
+
/**
|
| 250 |
+
* @param Mage_Sales_Model_Quote_Item $quoteItem
|
| 251 |
+
* @param ResponseLineItem $resultItem
|
| 252 |
+
*/
|
| 253 |
+
private function applyTaxPercent($quoteItem, $resultItem)
|
| 254 |
+
{
|
| 255 |
+
$taxPercent = 0;
|
| 256 |
+
foreach ($resultItem->getTaxInfo() as $taxInfo) {
|
| 257 |
+
$taxPercent += $taxInfo->getTaxRate();
|
| 258 |
+
}
|
| 259 |
+
$taxPercent *= 100;
|
| 260 |
+
$quoteItem->setTaxPercent($taxPercent);
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
private function resetTaxForItems(Mage_Sales_Model_Quote_Address $address)
|
| 264 |
+
{
|
| 265 |
/**
|
| 266 |
* @var Mage_Sales_Model_Quote_Item $item
|
| 267 |
*/
|
| 268 |
+
foreach ($address->getAllItems() as $item) {
|
| 269 |
$item->setTaxAmount(0);
|
| 270 |
$item->setBaseTaxAmount(0);
|
| 271 |
+
$item->setTaxPercent(0);
|
| 272 |
}
|
| 273 |
$address->setShippingTaxAmount(0);
|
| 274 |
+
|
| 275 |
+
if (Mage::helper('core')->isModuleEnabled('Fooman_Surcharge')) {
|
| 276 |
+
$address->setFoomanSurchargeTaxAmount(0);
|
| 277 |
+
$address->setBaseFoomanSurchargeTaxAmount(0);
|
| 278 |
+
$this->session->setFoomanSurchargeTaxAmount(0);
|
| 279 |
+
}
|
| 280 |
}
|
| 281 |
|
| 282 |
+
private function applyTax($amount)
|
| 283 |
+
{
|
| 284 |
$this->_setBaseAmount($amount);
|
| 285 |
$this->_setAmount($amount);
|
| 286 |
}
|
| 288 |
/**
|
| 289 |
* Return TRUE if tax calculation IS needed, FALSE - otherwise
|
| 290 |
* @param InvoiceRequestType $invoiceRequest
|
| 291 |
+
* @param ZzzzzExactor_Core_Model_MerchantSettings $merchantSettings
|
| 292 |
* @return bool
|
| 293 |
*/
|
| 294 |
+
private function checkIfCalculationNeeded($invoiceRequest, $merchantSettings)
|
| 295 |
+
{
|
| 296 |
// Calculating digital signature for the current request
|
| 297 |
if ($invoiceRequest == null || $invoiceRequest->getLineItems() == null) return false;
|
| 298 |
$taxRequest = ExactorConnectionFactory::getInstance()->buildRequest($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
|
| 302 |
$signature = $signatureBuilder->buildDigitalSignature();
|
| 303 |
// Loading previous one from the session cache
|
| 304 |
$prviousTrnInfo = $this->exactorSessionCache->getLatestTransactionInfo($invoiceRequest->getPurchaseOrderNumber());
|
| 305 |
+
if ($prviousTrnInfo == null) return true;
|
| 306 |
if ($prviousTrnInfo->getSignature() == $signature) return false;
|
| 307 |
return true;
|
| 308 |
}
|
| 309 |
|
| 310 |
+
private function reportError($msg)
|
| 311 |
+
{
|
| 312 |
$errObj = Mage::getSingleton('core/message')->error($msg);
|
| 313 |
+
foreach ($this->session->getMessages()->getErrors() as $message) {
|
| 314 |
if ($message->getCode() == $errObj->getCode())
|
| 315 |
return;
|
| 316 |
}
|
| 317 |
$this->session->addMessage($errObj);
|
| 318 |
}
|
| 319 |
+
|
| 320 |
/**
|
| 321 |
* Do postprocessing after failed tax calculation
|
| 322 |
* @param $reason
|
| 323 |
+
* @return ZzzzzExactor_Tax_Model_Sales_Total_Quote_Tax
|
| 324 |
*/
|
| 325 |
+
private function processTaxCalculationFail($reason)
|
| 326 |
+
{
|
| 327 |
$this->applyTax(0);
|
| 328 |
$this->logger->error(self::LOG_MESSAGE_TAX_CALC_FAILED . $reason, 'collect');
|
| 329 |
$this->reportError($reason);
|
| 342 |
|
| 343 |
public function fetch(Mage_Sales_Model_Quote_Address $address)
|
| 344 |
{
|
| 345 |
+
$applied = $address->getAppliedTaxes();
|
| 346 |
+
$store = $address->getQuote()->getStore();
|
| 347 |
+
$amount = $address->getTaxAmount();
|
| 348 |
+
$area = null;
|
| 349 |
if ($this->_config->displayCartTaxWithGrandTotal($store) && $address->getGrandTotal()) {
|
| 350 |
+
$area = 'taxes';
|
| 351 |
}
|
| 352 |
|
| 353 |
// if (is_array($applied) && (($amount!=0) || ($this->_config->displayCartZeroTax($store)))) {
|
| 354 |
+
$address->addTotal(array(
|
| 355 |
+
'code' => $this->getCode(),
|
| 356 |
+
'title' => $this->getLabel(),
|
| 357 |
+
'full_info' => $applied ? $applied : array(),
|
| 358 |
+
'value' => $amount,
|
| 359 |
+
'area' => $area
|
| 360 |
+
));
|
| 361 |
+
// }
|
| 362 |
|
| 363 |
$store = $address->getQuote()->getStore();
|
| 364 |
/**
|
| 368 |
if ($address->getSubtotalInclTax() > 0) {
|
| 369 |
$subtotalInclTax = $address->getSubtotalInclTax();
|
| 370 |
} else {
|
| 371 |
+
$subtotalInclTax = $address->getSubtotal() + $address->getTaxAmount() - $address->getShippingTaxAmount();
|
| 372 |
}
|
| 373 |
|
| 374 |
$address->addTotal(array(
|
| 375 |
+
'code' => 'subtotal',
|
| 376 |
+
'title' => Mage::helper('sales')->__('Subtotal'),
|
| 377 |
+
'value' => $subtotalInclTax,
|
| 378 |
'value_incl_tax' => $subtotalInclTax,
|
| 379 |
'value_excl_tax' => $address->getSubtotal(),
|
| 380 |
));
|
| 382 |
|
| 383 |
return $this;
|
| 384 |
}
|
| 385 |
+
|
| 386 |
+
private function processTaxOverridingRequired(Mage_Sales_Model_Quote_Address $address)
|
| 387 |
+
{
|
| 388 |
+
$invoiceResponse = unserialize($this->session->getLastInvoiceResponse());
|
| 389 |
+
if (!$invoiceResponse) return;
|
| 390 |
+
$calculatedTax = $invoiceResponse->getTotalTaxAmount();
|
| 391 |
+
$this->applyTaxForItems($address, $invoiceResponse);
|
| 392 |
+
$this->applyTax($calculatedTax);
|
| 393 |
+
$address->setTaxAmount($calculatedTax);
|
| 394 |
+
$address->setBaseTaxAmount($calculatedTax);
|
| 395 |
+
}
|
| 396 |
+
|
| 397 |
+
private function processCalculationIsNotRequired(Mage_Sales_Model_Quote_Address $address)
|
| 398 |
+
{
|
| 399 |
+
$this->applyTax($address->getTaxAmount());
|
| 400 |
+
// For some reason shipping tax is 0 on this point
|
| 401 |
+
// We can't fetch it from the anywhere because we don't store any amounts,
|
| 402 |
+
// Thus the only solution for us - to calculate it. It's a little bit hacky way...
|
| 403 |
+
/**
|
| 404 |
+
* @var Mage_Sales_Model_Quote_Item $item
|
| 405 |
+
*/
|
| 406 |
+
$shippingTax = $address->getTaxAmount();
|
| 407 |
+
foreach ($address->getAllItems() as $item) {
|
| 408 |
+
$shippingTax -= $item->getTaxAmount();
|
| 409 |
+
}
|
| 410 |
+
|
| 411 |
+
if (Mage::helper('core')->isModuleEnabled('Fooman_Surcharge')) {
|
| 412 |
+
$foomanSurchargeTax = $this->session->getFoomanSurchargeTaxAmount();
|
| 413 |
+
$address->setFoomanSurchargeTaxAmount($foomanSurchargeTax);
|
| 414 |
+
$address->setBaseFoomanSurchargeTaxAmount($foomanSurchargeTax);
|
| 415 |
+
$shippingTax -= $foomanSurchargeTax;
|
| 416 |
+
}
|
| 417 |
+
|
| 418 |
+
$shippingTax = Mage::app()->getStore()->roundPrice($shippingTax);
|
| 419 |
+
// The following code is workaraund for the bug in Magento 1.6.2 - Tax applied to the QuoteAddress object
|
| 420 |
+
// can be missed by Magento for some reason. This issue can be reproduced in very trickily manner:
|
| 421 |
+
// 1. login
|
| 422 |
+
// 2. add product to the cart
|
| 423 |
+
// 3. logout
|
| 424 |
+
// 4. login again
|
| 425 |
+
// 5. proceed to purchase
|
| 426 |
+
// 6. select FREE SHIPPING
|
| 427 |
+
// 7. tax will be zero in front-end, negative in fact. The reason - $address->getTaxAmount() will return 0,
|
| 428 |
+
// while line items still contains valid tax
|
| 429 |
+
// IMPORTANT: Issue can be reproduced only once per session (first attempt), thus you should clear cookies before login.
|
| 430 |
+
if ($shippingTax < 0) {
|
| 431 |
+
$this->applyTax(-1 * $shippingTax);
|
| 432 |
+
$shippingTax = 0;
|
| 433 |
+
}
|
| 434 |
+
//
|
| 435 |
+
$address->setShippingTaxAmount($shippingTax);
|
| 436 |
+
$address->setBaseShippingTaxAmount($shippingTax);
|
| 437 |
+
}
|
| 438 |
}
|
app/code/local/{Exactor → ZzzzzExactor}/Tax/etc/config.xml
RENAMED
|
@@ -20,38 +20,51 @@
|
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
-
* @package
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
-
<
|
| 31 |
<version>2012.12.05</version>
|
| 32 |
-
</
|
| 33 |
</modules>
|
| 34 |
<global>
|
| 35 |
<models>
|
| 36 |
<exactor_tax>
|
| 37 |
-
<class>
|
| 38 |
</exactor_tax>
|
| 39 |
<tax>
|
| 40 |
<rewrite>
|
| 41 |
-
|
| 42 |
-
<
|
| 43 |
-
<
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
</rewrite>
|
| 45 |
</tax>
|
| 46 |
</models>
|
| 47 |
<helpers>
|
| 48 |
<tax>
|
| 49 |
<rewrite>
|
| 50 |
-
<calculation>
|
| 51 |
-
<mapping>
|
| 52 |
</rewrite>
|
| 53 |
</tax>
|
| 54 |
</helpers>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 55 |
</global>
|
| 56 |
|
| 57 |
</config>
|
| 20 |
* needs please refer to http://www.magentocommerce.com for more information.
|
| 21 |
*
|
| 22 |
* @category Exactor
|
| 23 |
+
* @package ZzzzzExactor_Tax
|
| 24 |
* @copyright Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
|
| 25 |
* @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0)
|
| 26 |
*/
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
+
<ZzzzzExactor_Tax>
|
| 31 |
<version>2012.12.05</version>
|
| 32 |
+
</ZzzzzExactor_Tax>
|
| 33 |
</modules>
|
| 34 |
<global>
|
| 35 |
<models>
|
| 36 |
<exactor_tax>
|
| 37 |
+
<class>ZzzzzExactor_Tax_Model</class>
|
| 38 |
</exactor_tax>
|
| 39 |
<tax>
|
| 40 |
<rewrite>
|
| 41 |
+
<!-- Disable tax calculators -->
|
| 42 |
+
<sales_total_quote_nominal_tax>ZzzzzExactor_Tax_Model_Sales_Total_Quote_Nominal_Tax</sales_total_quote_nominal_tax>
|
| 43 |
+
<sales_total_quote_subtotal>ZzzzzExactor_Tax_Model_Sales_Total_Quote_Nominal_Tax</sales_total_quote_subtotal>
|
| 44 |
+
|
| 45 |
+
<!--Apply Exactor tax calculator-->
|
| 46 |
+
<sales_total_quote_tax>ZzzzzExactor_Tax_Model_Sales_Total_Quote_Tax</sales_total_quote_tax>
|
| 47 |
+
<sales_quote_address_total_tax>ZzzzzExactor_Tax_Model_Sales_Total_Quote_Tax</sales_quote_address_total_tax>
|
| 48 |
</rewrite>
|
| 49 |
</tax>
|
| 50 |
</models>
|
| 51 |
<helpers>
|
| 52 |
<tax>
|
| 53 |
<rewrite>
|
| 54 |
+
<calculation>ZzzzzExactor_Tax_Helper_Calculation</calculation>
|
| 55 |
+
<mapping>ZzzzzExactor_Tax_Helper_Mapping</mapping>
|
| 56 |
</rewrite>
|
| 57 |
</tax>
|
| 58 |
</helpers>
|
| 59 |
+
<sales>
|
| 60 |
+
<quote>
|
| 61 |
+
<totals>
|
| 62 |
+
<tax>
|
| 63 |
+
<after>subtotal,shipping,discount,fooman_surcharge</after>
|
| 64 |
+
</tax>
|
| 65 |
+
</totals>
|
| 66 |
+
</quote>
|
| 67 |
+
</sales>
|
| 68 |
</global>
|
| 69 |
|
| 70 |
</config>
|
app/design/adminhtml/default/default/layout/exactorsettings.xml
CHANGED
|
@@ -29,7 +29,7 @@
|
|
| 29 |
<layout>
|
| 30 |
<exactorsettings_adminhtml_form_index>
|
| 31 |
<reference name="content">
|
| 32 |
-
<block type="
|
| 33 |
</reference>
|
| 34 |
</exactorsettings_adminhtml_form_index>
|
| 35 |
</layout>
|
| 29 |
<layout>
|
| 30 |
<exactorsettings_adminhtml_form_index>
|
| 31 |
<reference name="content">
|
| 32 |
+
<block type="ZzzzzExactor_ExactorSettings_Block_Form" name="ExactorSettingsForm" template="ExactorSettings/settingsform.phtml" />
|
| 33 |
</reference>
|
| 34 |
</exactorsettings_adminhtml_form_index>
|
| 35 |
</layout>
|
app/etc/modules/{Exactor.xml → ZzzzzExactor.xml}
RENAMED
|
@@ -27,21 +27,21 @@
|
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
-
<
|
| 31 |
<codePool>local</codePool>
|
| 32 |
<active>true</active>
|
| 33 |
-
</
|
| 34 |
-
<
|
| 35 |
<codePool>local</codePool>
|
| 36 |
<active>true</active>
|
| 37 |
-
</
|
| 38 |
-
<
|
| 39 |
<codePool>local</codePool>
|
| 40 |
<active>true</active>
|
| 41 |
-
</
|
| 42 |
-
<
|
| 43 |
<codePool>local</codePool>
|
| 44 |
<active>true</active>
|
| 45 |
-
</
|
| 46 |
</modules>
|
| 47 |
</config>
|
| 27 |
-->
|
| 28 |
<config>
|
| 29 |
<modules>
|
| 30 |
+
<ZzzzzExactor_Tax>
|
| 31 |
<codePool>local</codePool>
|
| 32 |
<active>true</active>
|
| 33 |
+
</ZzzzzExactor_Tax>
|
| 34 |
+
<ZzzzzExactor_Core>
|
| 35 |
<codePool>local</codePool>
|
| 36 |
<active>true</active>
|
| 37 |
+
</ZzzzzExactor_Core>
|
| 38 |
+
<ZzzzzExactor_ExactorSettings>
|
| 39 |
<codePool>local</codePool>
|
| 40 |
<active>true</active>
|
| 41 |
+
</ZzzzzExactor_ExactorSettings>
|
| 42 |
+
<ZzzzzExactor_Sales>
|
| 43 |
<codePool>local</codePool>
|
| 44 |
<active>true</active>
|
| 45 |
+
</ZzzzzExactor_Sales>
|
| 46 |
</modules>
|
| 47 |
</config>
|
lib/ExactorCommons/ExactorCommons.php
CHANGED
|
@@ -534,7 +534,14 @@ class ExactorDigitalSignatureBuilder{
|
|
| 534 |
$this->appendAddressFields($invoice->getShipFrom());
|
| 535 |
if ($invoice->getLineItems() == null) return;
|
| 536 |
foreach ($invoice->getLineItems() as $lineItem){
|
|
|
|
|
|
|
|
|
|
|
|
|
| 537 |
$this->appendValue($lineItem->getGrossAmount());
|
|
|
|
|
|
|
|
|
|
| 538 |
}
|
| 539 |
}
|
| 540 |
|
| 534 |
$this->appendAddressFields($invoice->getShipFrom());
|
| 535 |
if ($invoice->getLineItems() == null) return;
|
| 536 |
foreach ($invoice->getLineItems() as $lineItem){
|
| 537 |
+
$this->appendValue($lineItem->getId());
|
| 538 |
+
$this->appendValue($lineItem->getSKU());
|
| 539 |
+
$this->appendValue($lineItem->getDescription());
|
| 540 |
+
$this->appendValue($lineItem->getQuantity());
|
| 541 |
$this->appendValue($lineItem->getGrossAmount());
|
| 542 |
+
$this->appendAddressFields($lineItem->getShipFrom());
|
| 543 |
+
$this->appendAddressFields($lineItem->getBillTo());
|
| 544 |
+
$this->appendAddressFields($lineItem->getShipTo());
|
| 545 |
}
|
| 546 |
}
|
| 547 |
|
lib/ExactorCommons/ExactorDomainObjects.php
CHANGED
|
@@ -600,6 +600,86 @@ class DeleteRequestType extends XmlSerializationSupport {
|
|
| 600 |
|
| 601 |
/* ========================= Response Types ========================== */
|
| 602 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 603 |
class ResponseLineItem extends XmlSerializationSupport{
|
| 604 |
public $GrossAmount;
|
| 605 |
public $TaxDirection;
|
|
@@ -610,7 +690,7 @@ class ResponseLineItem extends XmlSerializationSupport{
|
|
| 610 |
protected function defineBindingRules()
|
| 611 |
{
|
| 612 |
$this->setBindingRulesFor('id')->xmlName('id')->toXmlAttribute();
|
| 613 |
-
|
| 614 |
|
| 615 |
public function setGrossAmount($GrossAmount)
|
| 616 |
{
|
|
@@ -637,6 +717,9 @@ class ResponseLineItem extends XmlSerializationSupport{
|
|
| 637 |
$this->TaxInfo = $TaxInfo;
|
| 638 |
}
|
| 639 |
|
|
|
|
|
|
|
|
|
|
| 640 |
public function getTaxInfo()
|
| 641 |
{
|
| 642 |
return $this->TaxInfo;
|
| 600 |
|
| 601 |
/* ========================= Response Types ========================== */
|
| 602 |
|
| 603 |
+
class TaxInfo extends XmlSerializationSupport {
|
| 604 |
+
public $AuthorityLevel;
|
| 605 |
+
public $AuthorityName;
|
| 606 |
+
public $CityOrCountyOrDistrict;
|
| 607 |
+
public $StateOrProvince;
|
| 608 |
+
public $Country;
|
| 609 |
+
public $TaxAmount;
|
| 610 |
+
public $TaxRate;
|
| 611 |
+
|
| 612 |
+
public function setAuthorityLevel($AuthorityLevel)
|
| 613 |
+
{
|
| 614 |
+
$this->AuthorityLevel = $AuthorityLevel;
|
| 615 |
+
}
|
| 616 |
+
|
| 617 |
+
public function getAuthorityLevel()
|
| 618 |
+
{
|
| 619 |
+
return $this->AuthorityLevel;
|
| 620 |
+
}
|
| 621 |
+
|
| 622 |
+
public function setAuthorityName($AuthorityName)
|
| 623 |
+
{
|
| 624 |
+
$this->AuthorityName = $AuthorityName;
|
| 625 |
+
}
|
| 626 |
+
|
| 627 |
+
public function getAuthorityName()
|
| 628 |
+
{
|
| 629 |
+
return $this->AuthorityName;
|
| 630 |
+
}
|
| 631 |
+
|
| 632 |
+
public function setCityOrCountyOrDistrict($CityOrCountyOrDistrict)
|
| 633 |
+
{
|
| 634 |
+
$this->CityOrCountyOrDistrict = $CityOrCountyOrDistrict;
|
| 635 |
+
}
|
| 636 |
+
|
| 637 |
+
public function getCityOrCountyOrDistrict()
|
| 638 |
+
{
|
| 639 |
+
return $this->CityOrCountyOrDistrict;
|
| 640 |
+
}
|
| 641 |
+
|
| 642 |
+
public function setCountry($Country)
|
| 643 |
+
{
|
| 644 |
+
$this->Country = $Country;
|
| 645 |
+
}
|
| 646 |
+
|
| 647 |
+
public function getCountry()
|
| 648 |
+
{
|
| 649 |
+
return $this->Country;
|
| 650 |
+
}
|
| 651 |
+
|
| 652 |
+
public function setStateOrProvince($StateOrProvince)
|
| 653 |
+
{
|
| 654 |
+
$this->StateOrProvince = $StateOrProvince;
|
| 655 |
+
}
|
| 656 |
+
|
| 657 |
+
public function getStateOrProvince()
|
| 658 |
+
{
|
| 659 |
+
return $this->StateOrProvince;
|
| 660 |
+
}
|
| 661 |
+
|
| 662 |
+
public function setTaxAmount($TaxAmount)
|
| 663 |
+
{
|
| 664 |
+
$this->TaxAmount = $TaxAmount;
|
| 665 |
+
}
|
| 666 |
+
|
| 667 |
+
public function getTaxAmount()
|
| 668 |
+
{
|
| 669 |
+
return $this->TaxAmount;
|
| 670 |
+
}
|
| 671 |
+
|
| 672 |
+
public function setTaxRate($TaxRate)
|
| 673 |
+
{
|
| 674 |
+
$this->TaxRate = $TaxRate;
|
| 675 |
+
}
|
| 676 |
+
|
| 677 |
+
public function getTaxRate()
|
| 678 |
+
{
|
| 679 |
+
return $this->TaxRate;
|
| 680 |
+
}
|
| 681 |
+
}
|
| 682 |
+
|
| 683 |
class ResponseLineItem extends XmlSerializationSupport{
|
| 684 |
public $GrossAmount;
|
| 685 |
public $TaxDirection;
|
| 690 |
protected function defineBindingRules()
|
| 691 |
{
|
| 692 |
$this->setBindingRulesFor('id')->xmlName('id')->toXmlAttribute();
|
| 693 |
+
$this->setBindingRulesFor('TaxInfo')->objectType('array TaxInfo')->xmlName('TaxInfo');}
|
| 694 |
|
| 695 |
public function setGrossAmount($GrossAmount)
|
| 696 |
{
|
| 717 |
$this->TaxInfo = $TaxInfo;
|
| 718 |
}
|
| 719 |
|
| 720 |
+
/**
|
| 721 |
+
* @return TaxInfo[]
|
| 722 |
+
*/
|
| 723 |
public function getTaxInfo()
|
| 724 |
{
|
| 725 |
return $this->TaxInfo;
|
lib/ExactorCommons/Magento.php
CHANGED
|
@@ -16,13 +16,13 @@ class MagentoExactorCallback extends IExactorPluginCallback{
|
|
| 16 |
|
| 17 |
private $logger;
|
| 18 |
/**
|
| 19 |
-
* @var
|
| 20 |
*/
|
| 21 |
private $sessionCache;
|
| 22 |
|
| 23 |
public function __construct(){
|
| 24 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 25 |
-
$this->sessionCache = Mage::helper('
|
| 26 |
}
|
| 27 |
|
| 28 |
/**
|
|
@@ -34,8 +34,8 @@ class MagentoExactorCallback extends IExactorPluginCallback{
|
|
| 34 |
function loadTransactionInfo($shoppingCartTrnId)
|
| 35 |
{
|
| 36 |
$this->logger->trace('called', 'loadTransactionInfo');
|
| 37 |
-
/** @var
|
| 38 |
-
$exatorTransaction = Mage::getModel('
|
| 39 |
$exatorTransaction = $exatorTransaction->getCollection()->addFilter("OrderID",$shoppingCartTrnId)->getFirstItem();
|
| 40 |
if (!$exatorTransaction->hasData()) return null;
|
| 41 |
// Populating common object with DB dat
|
|
@@ -61,11 +61,11 @@ class MagentoExactorCallback extends IExactorPluginCallback{
|
|
| 61 |
function saveTransactionInfo(ExactorTransactionInfo $transactionInfo, $requestKey)
|
| 62 |
{
|
| 63 |
$this->logger->trace('called', 'saveTransactionInfo');
|
| 64 |
-
/** @var
|
| 65 |
-
$exatorTransaction = Mage::getModel('
|
| 66 |
$exatorTransaction = $exatorTransaction->getCollection()
|
| 67 |
->addFilter("OrderID",$transactionInfo->getShoppingCartTrnId())->getFirstItem();
|
| 68 |
-
if (!$exatorTransaction->hasData()) $exatorTransaction = Mage::getModel('
|
| 69 |
|
| 70 |
$transactionInfo->setSignature($requestKey);
|
| 71 |
$exatorTransaction->setCommited($transactionInfo->getIsCommited());
|
| 16 |
|
| 17 |
private $logger;
|
| 18 |
/**
|
| 19 |
+
* @var ZzzzzExactor_Core_Helper_SessionCache
|
| 20 |
*/
|
| 21 |
private $sessionCache;
|
| 22 |
|
| 23 |
public function __construct(){
|
| 24 |
$this->logger = ExactorLoggingFactory::getInstance()->getLogger($this);
|
| 25 |
+
$this->sessionCache = Mage::helper('ZzzzzExactor_Core_SessionCache/');
|
| 26 |
}
|
| 27 |
|
| 28 |
/**
|
| 34 |
function loadTransactionInfo($shoppingCartTrnId)
|
| 35 |
{
|
| 36 |
$this->logger->trace('called', 'loadTransactionInfo');
|
| 37 |
+
/** @var ZzzzzExactor_Core_Model_ExactorTransaction $exatorTransaction */
|
| 38 |
+
$exatorTransaction = Mage::getModel('ZzzzzExactor_Core_Model_ExactorTransaction');
|
| 39 |
$exatorTransaction = $exatorTransaction->getCollection()->addFilter("OrderID",$shoppingCartTrnId)->getFirstItem();
|
| 40 |
if (!$exatorTransaction->hasData()) return null;
|
| 41 |
// Populating common object with DB dat
|
| 61 |
function saveTransactionInfo(ExactorTransactionInfo $transactionInfo, $requestKey)
|
| 62 |
{
|
| 63 |
$this->logger->trace('called', 'saveTransactionInfo');
|
| 64 |
+
/** @var ZzzzzExactor_Core_Model_ExactorTransaction $exatorTransaction */
|
| 65 |
+
$exatorTransaction = Mage::getModel('ZzzzzExactor_Core_Model_ExactorTransaction');
|
| 66 |
$exatorTransaction = $exatorTransaction->getCollection()
|
| 67 |
->addFilter("OrderID",$transactionInfo->getShoppingCartTrnId())->getFirstItem();
|
| 68 |
+
if (!$exatorTransaction->hasData()) $exatorTransaction = Mage::getModel('ZzzzzExactor_Core_Model_ExactorTransaction');
|
| 69 |
|
| 70 |
$transactionInfo->setSignature($requestKey);
|
| 71 |
$exatorTransaction->setCommited($transactionInfo->getIsCommited());
|
lib/ExactorCommons/config.php
CHANGED
|
@@ -14,9 +14,16 @@ define('EXACTOR_CONFIG_FEATURE_TRN_FILTER', 'trn-filter');
|
|
| 14 |
|
| 15 |
define('EXACTOR_CONFIG_FEATURE_DISABLE_ESTIMATES', 'disable-estimates');
|
| 16 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
/* Initializing factories */
|
| 18 |
ExactorLoggingFactory::getInstance()->setup('MagentoLogger', IExactorLogger::DEBUG);
|
| 19 |
-
ExactorConnectionFactory::getInstance()->setup('Magento','
|
| 20 |
ExactorProcessingServiceFactory::getInstance()->setup(new MagentoExactorCallback());
|
| 21 |
|
| 22 |
/* Initializing configuration object */
|
|
@@ -24,4 +31,5 @@ $config = ExactorPluginConfig::getInstance();
|
|
| 24 |
$config->pushFeatureConfigString('');
|
| 25 |
|
| 26 |
/* Pushing parameters */
|
| 27 |
-
$config->set(EXACTOR_CONFIG_EXEMPT_DISCOUNTS, array());
|
|
|
| 14 |
|
| 15 |
define('EXACTOR_CONFIG_FEATURE_DISABLE_ESTIMATES', 'disable-estimates');
|
| 16 |
|
| 17 |
+
/*
|
| 18 |
+
* Enable this option to always override tax in quotes instead of overriding only if quote checksum changes.
|
| 19 |
+
* Is useful in case if user installed other plug-ins overriding tax.
|
| 20 |
+
* WARNING: this option increases RAM memory consuming.
|
| 21 |
+
* */
|
| 22 |
+
define('EXACTOR_CONFIG_ALWAYS_OVERRIDE_TAX', 'always-override-tax');
|
| 23 |
+
|
| 24 |
/* Initializing factories */
|
| 25 |
ExactorLoggingFactory::getInstance()->setup('MagentoLogger', IExactorLogger::DEBUG);
|
| 26 |
+
ExactorConnectionFactory::getInstance()->setup('Magento','20140905');
|
| 27 |
ExactorProcessingServiceFactory::getInstance()->setup(new MagentoExactorCallback());
|
| 28 |
|
| 29 |
/* Initializing configuration object */
|
| 31 |
$config->pushFeatureConfigString('');
|
| 32 |
|
| 33 |
/* Pushing parameters */
|
| 34 |
+
$config->set(EXACTOR_CONFIG_EXEMPT_DISCOUNTS, array());
|
| 35 |
+
//$config->set(EXACTOR_CONFIG_ALWAYS_OVERRIDE_TAX, true);
|
package.xml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>Mage_Exactor_Tax</name>
|
| 4 |
-
<version>2014.
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license uri="http://www.opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
|
| 7 |
<channel>community</channel>
|
|
@@ -12,9 +12,9 @@ Once installed, neither the merchant, nor the customer, need to perform any addi
|
|
| 12 |
For additional information, please refer to the Exactor Magento User Guide that is attached to the plug-in, or which you can download directly from the Exactor control panel (navigate to Account Management Integration Points & PlugIns).</description>
|
| 13 |
<notes>Supported Magento 1.5.0.0 - 1.7.x, Magento Enterprise 1.8-1.12.x</notes>
|
| 14 |
<authors><author><name>Exactor, Inc.</name><user>exactor</user><email>support@exactor.com</email></author></authors>
|
| 15 |
-
<date>2014-
|
| 16 |
-
<time>
|
| 17 |
-
<contents><target name="magelocal"><dir name="
|
| 18 |
<compatible/>
|
| 19 |
<dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
|
| 20 |
</package>
|
| 1 |
<?xml version="1.0"?>
|
| 2 |
<package>
|
| 3 |
<name>Mage_Exactor_Tax</name>
|
| 4 |
+
<version>2014.09.05</version>
|
| 5 |
<stability>stable</stability>
|
| 6 |
<license uri="http://www.opensource.org/licenses/osl-3.0.php">OSL v3.0</license>
|
| 7 |
<channel>community</channel>
|
| 12 |
For additional information, please refer to the Exactor Magento User Guide that is attached to the plug-in, or which you can download directly from the Exactor control panel (navigate to Account Management Integration Points & PlugIns).</description>
|
| 13 |
<notes>Supported Magento 1.5.0.0 - 1.7.x, Magento Enterprise 1.8-1.12.x</notes>
|
| 14 |
<authors><author><name>Exactor, Inc.</name><user>exactor</user><email>support@exactor.com</email></author></authors>
|
| 15 |
+
<date>2014-09-05</date>
|
| 16 |
+
<time>07:54:52</time>
|
| 17 |
+
<contents><target name="magelocal"><dir name="ZzzzzExactor"><dir name="Core"><dir name="Helper"><file name="SessionCache.php" hash="4a48ea63099201bc04581febe21b7237"/></dir><dir name="Model"><file name="ExactorTransaction.php" hash="aee2205ef1e8b58fe8fead7385af2fdd"/><file name="MerchantSettings.php" hash="b58bcf01d15af966358aa1e0f27b9fbe"/><dir name="Mysql4"><dir name="ExactorTransaction"><file name="Collection.php" hash="5078855300f1b8895c5429fb10f37854"/></dir><file name="ExactorTransaction.php" hash="4b8f45cc739ac05b71be3f38c0138109"/><dir name="MerchantSettings"><file name="Collection.php" hash="4c7e905444d9f02c1e82033cd147afc5"/></dir><file name="MerchantSettings.php" hash="fd98ded15c7dde7bcc1746a40c24aa85"/></dir><dir name="Type"><file name="Onepage.php" hash="8c9c744d769f4064dcc344d4d474dd2a"/></dir></dir><dir name="etc"><file name="config.xml" hash="654bd7d22e5a308722d8769a1233ad80"/></dir></dir><dir name="ExactorSettings"><dir name="Block"><file name="Form.php" hash="3189371ce1fca8f2ff72b165da762e2e"/></dir><dir name="Helper"><file name="Data.php" hash="08ff0be3da068e35731d5cbcb5ca031d"/><file name="VersionResolver.php" hash="e05646123b776551295cdc1050eb80a0"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="FormController.php" hash="83e0faaffe8a93e4fbccf9e0c0b4914f"/></dir><file name="AjaxController.php" hash="e0a9122472eebdf2ba9d703b35e528e6"/><file name="IndexController.php" hash="064275cda39bf28a23f0e30cda85d546"/></dir><dir name="etc"><file name="config.xml" hash="63ed7c63ac663fa72b1a645275499c34"/></dir><dir name="sql"><dir name="ExactorSettings_setup"><file name="mysql4-install-14.04.2012.php" hash="171dcba8395c21dccd336c86cd92db5d"/><file name="upgrade-2012.06.14-2012.09.25.php" hash="217c13f3fecf41decff7f0cbc908f0f8"/></dir></dir></dir><dir name="Sales"><dir name="Model"><file name="Observer.php" hash="2107eccfd9c3525d36c6949d98b5a959"/></dir><dir name="etc"><file name="config.xml" hash="20483c2cc3730e5ea279023ef47c3d14"/></dir></dir><dir name="Tax"><dir name="Helper"><file name="Calculation.php" hash="30378738db4beea10d7caeb256018be6"/><file name="Mapping.php" hash="11e80ef7e4fb3ae7d6964c3b887a5a11"/></dir><dir name="Model"><dir name="Sales"><dir name="Total"><dir name="Quote"><dir name="Nominal"><file name="Tax.php" hash="26eb88861c5f47c410ec837059e28bee"/></dir><file name="Tax.php" hash="f124f0ddcbdb3514fe7b0d4164dc6267"/></dir></dir></dir></dir><dir name="etc"><file name="config.xml" hash="1c3235fa291ec1d81855a5015376cf51"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="exactorsettings.xml" hash="c6411fb02004382e2bde340e2eea8ba1"/><file name="exactoronestepcheckout.xml" hash="9fdfa1db5e4e60b4eec8f348c10aab07"/></dir><dir name="template"><dir name="ExactorSettings"><file name="settingsform.phtml" hash="c423218861b708c3d572ac77623c6280"/></dir></dir></dir></dir></dir><dir name="frontend"><dir name="base"><dir name="default"><dir name="layout"><file name="exactoronestepcheckout.xml" hash="9fdfa1db5e4e60b4eec8f348c10aab07"/></dir></dir></dir></dir></target><target name="mageetc"><dir name="modules"><file name="ZzzzzExactor.xml" hash="d5d93cb5e6608f3cf87f5a57ed1448c7"/></dir></target><target name="mageweb"><dir name="js"><dir name="exactor"><file name="exactor.js" hash="5c23e40f4034e50a6e0df5b1c708b7e1"/></dir></dir></target><target name="magelib"><dir name="ExactorCommons"><file name="ExactorCommons.php" hash="03b83a20edc9a129a16230b5033f94ce"/><file name="ExactorDomainObjects.php" hash="c708118429f6bea5c5c3a9c4caf28e99"/><file name="Magento.php" hash="07fe9cf20e5368ac6c6dee45c26a07f8"/><file name="RegionResolver.php" hash="2537638a7895a169cee4b1df786d22fb"/><file name="XmlProcessing.php" hash="1fe961d5c14d507b2bb82fd3dd94237c"/><file name="config.php" hash="113b33abb70575f2f924759126dd6552"/></dir></target></contents>
|
| 18 |
<compatible/>
|
| 19 |
<dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
|
| 20 |
</package>
|
