Mage_Exactor_Tax - Version 2012.10.19

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 2012.10.19
Comparing to
See all releases


Code changes from version 2012.09.20 to 2012.10.19

app/code/local/Exactor/Core/Model/MerchantSettings.php CHANGED
@@ -216,6 +216,14 @@ class Exactor_Core_Model_MerchantSettings extends Mage_Core_Model_Abstract
216
  return $this->getData("CommitOption");
217
  }
218
 
 
 
 
 
 
 
 
 
219
 
220
  function setCommitOption($CommitOption)
221
  {
@@ -260,6 +268,12 @@ class Exactor_Core_Model_MerchantSettings extends Mage_Core_Model_Abstract
260
  return $default;
261
  }
262
 
 
 
 
 
 
 
263
  public function populateFromArray($array){
264
  $this->setCity($this->valueOrDefaultFromArray($array, 'City'));
265
  $this->setCommitOption($this->valueOrDefaultFromArray($array, 'CommitOption'));
@@ -275,5 +289,6 @@ class Exactor_Core_Model_MerchantSettings extends Mage_Core_Model_Abstract
275
  $this->setStoreViewID($this->valueOrDefaultFromArray($array, 'StoreViewID'));
276
  $this->setStreet1($this->valueOrDefaultFromArray($array, 'Street1'));
277
  $this->setStreet2($this->valueOrDefaultFromArray($array, 'Street2'));
 
278
  }
279
  }
216
  return $this->getData("CommitOption");
217
  }
218
 
219
+ function getEffectiveDate() {
220
+ return $this->getData("EffectiveDate");
221
+ }
222
+
223
+ function setEffectiveDate($EffectiveDate){
224
+ $this->setData("EffectiveDate", $EffectiveDate);
225
+ }
226
+
227
 
228
  function setCommitOption($CommitOption)
229
  {
268
  return $default;
269
  }
270
 
271
+ public function getDefaultEffectiveDate() {
272
+ $date_array = getdate();
273
+ $timestamp = mktime(0,0,0,$date_array['mon'],1,$date_array['year']);
274
+ return date("Y-m-d", $timestamp);
275
+ }
276
+
277
  public function populateFromArray($array){
278
  $this->setCity($this->valueOrDefaultFromArray($array, 'City'));
279
  $this->setCommitOption($this->valueOrDefaultFromArray($array, 'CommitOption'));
289
  $this->setStoreViewID($this->valueOrDefaultFromArray($array, 'StoreViewID'));
290
  $this->setStreet1($this->valueOrDefaultFromArray($array, 'Street1'));
291
  $this->setStreet2($this->valueOrDefaultFromArray($array, 'Street2'));
292
+ $this->setEffectiveDate($this->valueOrDefaultFromArray($array, 'EffectiveDate'));
293
  }
294
  }
app/code/local/Exactor/ExactorSettings/Block/Form.php CHANGED
@@ -54,13 +54,23 @@ class Exactor_ExactorSettings_Block_Form extends Mage_Core_Block_Template {
54
  ));
55
  }
56
 
 
 
 
 
 
57
  /**
58
  * Load settings object for template
59
  * This method always will return MerchantSettings object even if there are no any settings in DB
60
  * @return void
61
  */
62
  protected function loadMerchantSettings(){
63
- return $this->exactorSettingsHelper->loadMerchantSettingsOrEmptyObject($this->getStoreViewId());
 
 
 
 
 
64
  }
65
 
66
  public function setStoreViewId($storeViewId)
54
  ));
55
  }
56
 
57
+ private function dateForView($dateStr){
58
+ $timestamp = strtotime($dateStr);
59
+ return date("m/d/Y", $timestamp);
60
+ }
61
+
62
  /**
63
  * Load settings object for template
64
  * This method always will return MerchantSettings object even if there are no any settings in DB
65
  * @return void
66
  */
67
  protected function loadMerchantSettings(){
68
+ $settings = $this->exactorSettingsHelper->loadMerchantSettingsOrEmptyObject($this->getStoreViewId());
69
+ if (trim($settings->getEffectiveDate())==""){
70
+ $settings->setEffectiveDate($settings->getDefaultEffectiveDate());
71
+ }
72
+ $settings->setEffectiveDate($this->dateForView($settings->getEffectiveDate()));
73
+ return $settings;
74
  }
75
 
76
  public function setStoreViewId($storeViewId)
app/code/local/Exactor/ExactorSettings/controllers/Adminhtml/FormController.php CHANGED
@@ -81,10 +81,23 @@ class Exactor_ExactorSettings_Adminhtml_FormController extends Mage_Adminhtml_Co
81
  protected function preprocessInput(&$merchantSettings){
82
  foreach($merchantSettings->getData() as $key => $value){
83
  if (is_string($value))
84
- $merchantSettings->setData($key, trim($value));
85
  }
 
 
 
 
 
 
 
 
 
 
 
86
  }
87
 
 
 
88
  private function sendRequestBack(){
89
  $storeviewId = $this->getRequest()->getParam('storeview',null);
90
  $postData = $this->getRequest()->getPost(self::FORM_PARAM_CONTAINER);
@@ -140,7 +153,7 @@ class Exactor_ExactorSettings_Adminhtml_FormController extends Mage_Adminhtml_Co
140
  // Do validation
141
  $isInputValid = $this->validate($merchantSettings);
142
  // if valid - Save to DB
143
- if ($isInputValid){
144
  $merchantSettings->save();
145
  return $this->sendSuccess(self::MSG_SETTINGS_SAVED);
146
  }else{ // else - notify error
81
  protected function preprocessInput(&$merchantSettings){
82
  foreach($merchantSettings->getData() as $key => $value){
83
  if (is_string($value))
84
+ $merchantSettings->setData($key, trim($value));
85
  }
86
+ // Convert effective date from string or set default value
87
+ if ($merchantSettings->getEffectiveDate()==""){
88
+ $merchantSettings->setEffectiveDate($merchantSettings->getDefaultEffectiveDate());
89
+ } else {
90
+ $merchantSettings->setEffectiveDate($this->dateForDb($merchantSettings->getEffectiveDate()));
91
+ }
92
+ }
93
+
94
+ private function dateForDb($dateStr){
95
+ $timestamp = strtotime($dateStr);
96
+ return date("Y-m-d", $timestamp);
97
  }
98
 
99
+
100
+
101
  private function sendRequestBack(){
102
  $storeviewId = $this->getRequest()->getParam('storeview',null);
103
  $postData = $this->getRequest()->getPost(self::FORM_PARAM_CONTAINER);
153
  // Do validation
154
  $isInputValid = $this->validate($merchantSettings);
155
  // if valid - Save to DB
156
+ if ($isInputValid) {
157
  $merchantSettings->save();
158
  return $this->sendSuccess(self::MSG_SETTINGS_SAVED);
159
  }else{ // else - notify error
app/code/local/Exactor/ExactorSettings/etc/config.xml CHANGED
@@ -28,7 +28,7 @@
28
  <config>
29
  <modules>
30
  <Exactor_ExactorSettings>
31
- <version>2012.06.14</version>
32
  </Exactor_ExactorSettings>
33
  </modules>
34
 
@@ -77,7 +77,7 @@
77
  </admin>
78
 
79
  <adminhtml>
80
- <translate>
81
  <modules>
82
  <Exactor_adminhtml>
83
  <files>
@@ -85,7 +85,7 @@
85
  </files>
86
  </Exactor_adminhtml>
87
  </modules>
88
- </translate>
89
 
90
  <menu>
91
  <system>
28
  <config>
29
  <modules>
30
  <Exactor_ExactorSettings>
31
+ <version>2012.09.25</version>
32
  </Exactor_ExactorSettings>
33
  </modules>
34
 
77
  </admin>
78
 
79
  <adminhtml>
80
+ <!--<translate>
81
  <modules>
82
  <Exactor_adminhtml>
83
  <files>
85
  </files>
86
  </Exactor_adminhtml>
87
  </modules>
88
+ </translate>-->
89
 
90
  <menu>
91
  <system>
app/code/local/Exactor/ExactorSettings/sql/ExactorSettings_setup/mysql4-install-14.04.2012.php CHANGED
@@ -48,6 +48,7 @@
48
  `AttributeName` varchar(50) DEFAULT NULL,
49
  `CommitOption` varchar(2) DEFAULT NULL,
50
  `EntityExemptions` varchar(2) DEFAULT NULL,
 
51
  PRIMARY KEY (`ID`)
52
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
53
 
48
  `AttributeName` varchar(50) DEFAULT NULL,
49
  `CommitOption` varchar(2) DEFAULT NULL,
50
  `EntityExemptions` varchar(2) DEFAULT NULL,
51
+ `EffectiveDate` date DEFAULT NULL,
52
  PRIMARY KEY (`ID`)
53
  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
54
 
app/code/local/Exactor/ExactorSettings/sql/ExactorSettings_setup/upgrade-2012.06.14-2012.09.25.php ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /* @var $installer Mage_Core_Model_Resource_Setup */
28
+ $installer = $this;
29
+
30
+ $installer->startSetup();
31
+
32
+ $installer->run("
33
+ ALTER TABLE `exactor_account`
34
+ ADD COLUMN `EffectiveDate` date NULL;
35
+ ");
36
+
37
+ $installer->endSetup();
app/code/local/Exactor/Sales/Model/Observer.php CHANGED
@@ -62,19 +62,70 @@ class Exactor_Sales_Model_Observer {
62
  return $merchantSettings;
63
  }
64
 
65
- private function commitTransactionForOrder($orderId){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  try{
67
- $this->exactorProcessingService->commitExistingInvoiceForOrder($orderId);
68
- }catch (Exception $e){
69
- $this->logger->error("Can't commit transaction. See details above.", 'commitTransactionForOrder');
 
 
70
  }
71
  }
72
 
73
- private function refundTransactionForOrder($orderId){
74
  try{
75
- $this->exactorProcessingService->refundTransactionForOrder($orderId);
 
 
76
  }catch (Exception $e){
77
- $this->logger->error("Can't commit transaction. See details above.", 'commitTransactionForOrder');
78
  }
79
  }
80
 
@@ -88,9 +139,11 @@ class Exactor_Sales_Model_Observer {
88
  private function processFinishedOrder($order){
89
  $merchantSettings = $this->loadMerchantSettings($order);
90
  if ($merchantSettings==null) false;
91
- $transactionInfo = $this->sessionCache->popTransactionInfo($order);
 
 
92
  if ($transactionInfo == null){
93
- $this->logger->error('Nothing to process. There is no transaction in the session cache', 'handleAllOrdersCompleted');
94
  return false;
95
  }
96
  // Update transaction info with order information
@@ -101,12 +154,55 @@ class Exactor_Sales_Model_Observer {
101
  // if CommitOption is set up to commit on sales order - do commit the
102
  // latest transaction from the session storage
103
  if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_SALES_ORDER){
104
- $this->logger->info("Commiting transaction for order $orderId - " . $transactionInfo->getExactorTrnId(), 'handleAllOrdersCompleted');
105
- $this->exactorProcessingService->commitExistingInvoiceForOrder($orderId);
 
 
 
 
 
 
 
 
 
 
106
  }
107
  return true;
108
  }
109
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
110
  public function handleAllOrdersCompleted(Varien_Event_Observer $observer){
111
  $this->logger->trace('called', 'handleAllOrdersCompleted');
112
  if (is_array($observer->getOrders()))
@@ -121,22 +217,24 @@ class Exactor_Sales_Model_Observer {
121
  }
122
 
123
  private function partialRefund(Mage_Sales_Model_Order_Creditmemo $creditMemo){
124
- $transactionInfo = $this->exactorProcessingService->loadTransactionInfoByOrderId($creditMemo->getOrder()->getIncrementId());
125
- if ($transactionInfo==null || !$transactionInfo->getIsCommited()){
126
- $this->logger->info("Exactor transaction for order " .
127
- $creditMemo->getOrder()->getIncrementId() . "doesn't exists or wasn't commited", 'partialRefund' );
128
- return;
129
- }
130
  $merchantSettings = $this->loadMerchantSettings($creditMemo->getOrder());
131
  if ($merchantSettings==null) return;
 
 
 
 
132
  $invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestsForCreditMemo($creditMemo, $merchantSettings);
133
  $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService($merchantSettings->getMerchantID(),
134
  $merchantSettings->getUserID());
135
  foreach ($invoiceRequests as $invoice) {
136
- $exactorProcessingService->partialRefund($invoice, new DateTime(), $creditMemo->getOrder()->getIncrementId());
137
  }
138
  }
139
 
 
 
 
 
140
  /**
141
  * Event will be fired once new order has been created
142
  * @param Varien_Event_Observer $observer
@@ -169,15 +267,37 @@ class Exactor_Sales_Model_Observer {
169
  $this->logger->trace('called', 'handleNewCreditMemo');
170
  $merchantSettings = $this->loadMerchantSettings($observer->getCreditmemo()->getOrder());
171
  if ($merchantSettings==null) return;
172
- $this->partialRefund($observer->getCreditmemo());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  }
174
 
175
  public function handleCancelOrder(Varien_Event_Observer $observer){
176
  $this->logger->trace('called', 'handleCancelOrder');
177
  $merchantSettings = $this->loadMerchantSettings($observer->getPayment()->getOrder());
178
  if ($merchantSettings==null) return;
179
- $orderId = $observer->getPayment()->getOrder()->getIncrementId();
180
- $this->refundTransactionForOrder($orderId);
 
 
 
 
181
  }
182
 
183
  public function handleNewShipment(Varien_Event_Observer $observer){
@@ -185,8 +305,16 @@ class Exactor_Sales_Model_Observer {
185
  $merchantSettings = $this->loadMerchantSettings($observer->getShipment()->getOrder());
186
  if ($merchantSettings==null) return;
187
  if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_SHIPMENT){
188
- $orderId = $observer->getShipment()->getOrder()->getIncrementId();
189
- $this->commitTransactionForOrder($orderId);
 
 
 
 
 
 
 
 
190
  }
191
  }
192
 
@@ -194,11 +322,26 @@ class Exactor_Sales_Model_Observer {
194
  $this->logger->trace('called', 'handleNewInvoice');
195
  $merchantSettings = $this->loadMerchantSettings($observer->getInvoice()->getOrder());
196
  if ($merchantSettings==null) return;
 
197
  if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE){
198
- $orderId = $observer->getInvoice()->getOrder()->getIncrementId();
199
- $this->commitTransactionForOrder($orderId);
200
  }
 
201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
202
  }
203
 
204
  /**
62
  return $merchantSettings;
63
  }
64
 
65
+ private function getInvoiceIncrementId(Mage_Sales_Model_Order_Invoice &$invoice) {
66
+ if ($invoice->getIncrementId() == null) {
67
+ try{
68
+ $entityType = Mage::getModel('eav/entity_type')->loadByCode("invoice");
69
+ $invoice->setIncrementId($entityType->fetchNewIncrementId($invoice->getStoreId()));
70
+ } catch (Exception $e) {
71
+ $this->logger->error("Failed to get increment id ", 'getInvoiceIncrementId');
72
+ return null;
73
+ }
74
+ }
75
+ return $invoice->getIncrementId();
76
+ }
77
+
78
+ private function commitTransactionForInvoice(Mage_Sales_Model_Order_Invoice $invoice, Exactor_Core_Model_MerchantSettings $merchantSettings) {
79
+ try {
80
+ if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $invoice->getOrder()->getCreatedAt())){
81
+ $this->logger->info("Order " . $invoice->getOrder()->getIncrementId() ." is not under effective date. Skipping.", "commitTransactionForInvoice");
82
+ return;
83
+ }
84
+ $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
85
+ ->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
86
+ $invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings);
87
+ foreach ($invoiceRequests as $invoiceRequest) {
88
+ $exactorProcessingService->partialPayment($invoiceRequest, new DateTime(), $this->getInvoiceIncrementId($invoice));
89
+ }
90
+ } catch (Exception $e) {
91
+ $this->logger->error("Can't commit transaction. See details above.", 'commitTransactionForInvoice');
92
+ }
93
+ }
94
+
95
+ private function refundTransactionForInvoice(Mage_Sales_Model_Order_Invoice $invoice, Exactor_Core_Model_MerchantSettings $merchantSettings) {
96
+ try {
97
+ $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
98
+ ->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
99
+ if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $invoice->getOrder()->getCreatedAt())){
100
+ $this->logger->info("Order " . $invoice->getOrder()->getIncrementId() ." is not under effective date. Skipping.", "refundTransactionForInvoice");
101
+ return;
102
+ }
103
+ $invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoInvoice($invoice, $merchantSettings);
104
+ foreach ($invoiceRequests as $invoiceRequest) {
105
+ $exactorProcessingService->partialRefund($invoiceRequest, new DateTime(), $invoice->getIncrementId());
106
+ }
107
+ } catch (Exception $e) {
108
+ $this->logger->error("Can't commit transaction. See details above.", 'refundTransactionForInvoice');
109
+ }
110
+ }
111
+
112
+ private function refundAllInvoicesForOrder(Mage_Sales_Model_Order $order, Exactor_Core_Model_MerchantSettings $merchantSettings) {
113
  try{
114
+ foreach ($order->getInvoiceCollection() as $invoice){
115
+ $this->refundTransactionForInvoice($invoice, $merchantSettings);
116
+ }
117
+ } catch (Exception $e) {
118
+ $this->logger->error("Can't commit transaction. See details above.", 'refundAllInvoicesForOrder');
119
  }
120
  }
121
 
122
+ private function refundTransactionForOrder($order, $merchantSettings){
123
  try{
124
+ $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
125
+ ->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
126
+ $exactorProcessingService->refundTransactionForOrder($order->getIncrementId());
127
  }catch (Exception $e){
128
+ $this->logger->error("Can't commit transaction. See details above.", 'refundTransactionForOrder');
129
  }
130
  }
131
 
139
  private function processFinishedOrder($order){
140
  $merchantSettings = $this->loadMerchantSettings($order);
141
  if ($merchantSettings==null) false;
142
+ $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
143
+ ->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
144
+ $transactionInfo = $this->sessionCache->popTransactionInfo();
145
  if ($transactionInfo == null){
146
+ $this->logger->error('Nothing to process. There is no transaction in the session cache', 'processFinishedOrder');
147
  return false;
148
  }
149
  // Update transaction info with order information
154
  // if CommitOption is set up to commit on sales order - do commit the
155
  // latest transaction from the session storage
156
  if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_SALES_ORDER){
157
+ $this->logger->info("Commiting transaction for order $orderId - " . $transactionInfo->getExactorTrnId(), 'processFinishedOrder');
158
+ try {
159
+ if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $order->getCreatedAt())){
160
+ $this->logger->info("Order " . $order->getIncrementId() ." is not under effective date. Skipping.",
161
+ "commitTransactionForOrder");
162
+ }
163
+ $invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoOrder($order, $merchantSettings);
164
+ $taxResponse = $this->commitTransactionForOrder($order, $merchantSettings);
165
+ }catch (Exception $e){
166
+ $this->logger->error("Can't commit transaction. See details above.", 'processFinishedOrder');
167
+ }
168
+ //$this->exactorProcessingService->commitExistingInvoiceForOrder($orderId);
169
  }
170
  return true;
171
  }
172
 
173
+ /**
174
+ * Returns TaxResponse on success, and null - otherwise.
175
+ *
176
+ * @param \Mage_Sales_Model_Order $order
177
+ * @param \Exactor_Core_Model_MerchantSettings $merchantSettings
178
+ * @return TaxResponseType
179
+ */
180
+ public function commitTransactionForOrder(Mage_Sales_Model_Order $order, Exactor_Core_Model_MerchantSettings $merchantSettings) {
181
+ $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
182
+ ->buildExactorProcessingService($merchantSettings->getMerchantID(), $merchantSettings->getUserID());
183
+ try {
184
+ if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $order->getCreatedAt())){
185
+ $this->logger->info("Order " . $order->getIncrementId() ." is not under effective date. Skipping.",
186
+ "commitTransactionForOrder");
187
+ }
188
+ $exactorTransaction = $exactorProcessingService->loadTransactionInfoByOrderId($order->getIncrementId());
189
+ $invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoOrder($order, $merchantSettings);
190
+ if (count($invoiceRequests) == 1 && $exactorTransaction != null && !$exactorTransaction->getIsCommited()) {
191
+ $taxResponse = $exactorProcessingService->partialPayment($invoiceRequests[0], new DateTime(), "");
192
+ $exactorTransaction->setIsCommited(true);
193
+ $exactorTransaction->setExactorTrnId($taxResponse->getFirstCommit()->getTransactionId());
194
+ $exactorProcessingService->getPluginCallback()
195
+ ->saveTransactionInfo($exactorTransaction, $exactorTransaction->getSignature());
196
+ return $taxResponse;
197
+ } else {
198
+ $this->logger->error("New order should be represented by the single exactor transaction. Is", 'processFinishedOrder');
199
+ }
200
+ }catch (Exception $e){
201
+ $this->logger->error("Can't commit transaction. See details above.", 'processFinishedOrder');
202
+ }
203
+ return null;
204
+ }
205
+
206
  public function handleAllOrdersCompleted(Varien_Event_Observer $observer){
207
  $this->logger->trace('called', 'handleAllOrdersCompleted');
208
  if (is_array($observer->getOrders()))
217
  }
218
 
219
  private function partialRefund(Mage_Sales_Model_Order_Creditmemo $creditMemo){
 
 
 
 
 
 
220
  $merchantSettings = $this->loadMerchantSettings($creditMemo->getOrder());
221
  if ($merchantSettings==null) return;
222
+ if (!$this->underEffectiveDate($merchantSettings->getEffectiveDate(), $creditMemo->getOrder()->getCreatedAt())){
223
+ $this->logger->info("Order " . $creditMemo->getOrder()->getIncrementId() ." is not under effective date. Skipping.", "partialRefund");
224
+ return;
225
+ }
226
  $invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestsForCreditMemo($creditMemo, $merchantSettings);
227
  $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()->buildExactorProcessingService($merchantSettings->getMerchantID(),
228
  $merchantSettings->getUserID());
229
  foreach ($invoiceRequests as $invoice) {
230
+ $exactorProcessingService->partialRefund($invoice, new DateTime(), "");
231
  }
232
  }
233
 
234
+ // ====================================================================================================================
235
+ // =================================== EVENT HANDLERS =================================================================
236
+ // ====================================================================================================================
237
+
238
  /**
239
  * Event will be fired once new order has been created
240
  * @param Varien_Event_Observer $observer
267
  $this->logger->trace('called', 'handleNewCreditMemo');
268
  $merchantSettings = $this->loadMerchantSettings($observer->getCreditmemo()->getOrder());
269
  if ($merchantSettings==null) return;
270
+ // TODO: What about COMMIT on shipment
271
+ if ($merchantSettings->getCommitOption() != Exactor_Core_Model_MerchantSettings::COMMIT_NEVER) {
272
+ if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_SHIPMENT) {
273
+ $exactorTrnInfo = $this->exactorProcessingService->loadTransactionInfoByOrderId(
274
+ $observer->getCreditmemo()->getOrder()->getIncrementId());
275
+ if ($exactorTrnInfo != null && $exactorTrnInfo->getIsCommited()){
276
+ try{
277
+ $this->refundTransactionForOrder($observer->getCreditmemo()->getOrder(), $merchantSettings);
278
+ $exactorTrnInfo->setIsCommited(false);
279
+ $this->exactorProcessingService->getPluginCallback()
280
+ ->saveTransactionInfo($exactorTrnInfo, $exactorTrnInfo->getSignature());
281
+ } catch (Exception $e) {
282
+ $this->logger->error("Can't refund credit memo", 'handleNewCreditMemo');
283
+ }
284
+ }
285
+ } else {
286
+ $this->partialRefund($observer->getCreditmemo());
287
+ }
288
+ }
289
  }
290
 
291
  public function handleCancelOrder(Varien_Event_Observer $observer){
292
  $this->logger->trace('called', 'handleCancelOrder');
293
  $merchantSettings = $this->loadMerchantSettings($observer->getPayment()->getOrder());
294
  if ($merchantSettings==null) return;
295
+ if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE) {
296
+ // Just do nothing
297
+ //$this->refundAllInvoicesForOrder($observer->getPayment()->getOrder(), $merchantSettings);
298
+ } else {
299
+ $this->refundTransactionForOrder($observer->getPayment()->getOrder(), $merchantSettings);
300
+ }
301
  }
302
 
303
  public function handleNewShipment(Varien_Event_Observer $observer){
305
  $merchantSettings = $this->loadMerchantSettings($observer->getShipment()->getOrder());
306
  if ($merchantSettings==null) return;
307
  if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_SHIPMENT){
308
+ $this->commitTransactionForOrder($observer->getShipment()->getOrder(), $merchantSettings);
309
+ }
310
+ }
311
+
312
+ public function handleCancelInvoice(Varien_Event_Observer $observer){
313
+ $this->logger->trace('called', 'handleNewInvoice');
314
+ $merchantSettings = $this->loadMerchantSettings($observer->getInvoice()->getOrder());
315
+ if ($merchantSettings==null) return;
316
+ if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE){
317
+ $this->refundTransactionForInvoice($observer->getInvoice(), $merchantSettings);
318
  }
319
  }
320
 
322
  $this->logger->trace('called', 'handleNewInvoice');
323
  $merchantSettings = $this->loadMerchantSettings($observer->getInvoice()->getOrder());
324
  if ($merchantSettings==null) return;
325
+
326
  if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE){
327
+ $this->commitTransactionForInvoice($observer->getInvoice(), $merchantSettings);
 
328
  }
329
+ }
330
 
331
+ /**
332
+ * Checks if target date is under effective date, false - otherwise.
333
+ *
334
+ * @param $effectiveDate - Effective date
335
+ * @param $targetDate - Date to check
336
+ * @return boolean
337
+ */
338
+ private function underEffectiveDate($effectiveDate, $targetDate){
339
+ $effectiveTimestamp = strtotime($effectiveDate);
340
+ $targetTimestamp = strtotime('now');
341
+ if ($targetDate != null) {
342
+ $targetTimestamp = strtotime($targetDate);
343
+ }
344
+ return $targetTimestamp >= $effectiveTimestamp;
345
  }
346
 
347
  /**
app/code/local/Exactor/Sales/etc/config.xml CHANGED
@@ -28,7 +28,7 @@
28
  <config>
29
  <modules>
30
  <Exactor_Sales>
31
- <version>2012.08.28</version>
32
  </Exactor_Sales>
33
  </modules>
34
  <global>
@@ -78,7 +78,7 @@
78
  </exactor_sales_observer>
79
  </observers>
80
  </sales_order_shipment_save_after>
81
- <sales_order_invoice_pay>
82
  <observers>
83
  <exactor_sales_observer>
84
  <type>singleton</type>
@@ -86,7 +86,16 @@
86
  <method>handleNewInvoice</method>
87
  </exactor_sales_observer>
88
  </observers>
89
- </sales_order_invoice_pay>
 
 
 
 
 
 
 
 
 
90
  </events>
91
  <models>
92
  <tax>
28
  <config>
29
  <modules>
30
  <Exactor_Sales>
31
+ <version>2012.10.19</version>
32
  </Exactor_Sales>
33
  </modules>
34
  <global>
78
  </exactor_sales_observer>
79
  </observers>
80
  </sales_order_shipment_save_after>
81
+ <sales_order_invoice_register>
82
  <observers>
83
  <exactor_sales_observer>
84
  <type>singleton</type>
86
  <method>handleNewInvoice</method>
87
  </exactor_sales_observer>
88
  </observers>
89
+ </sales_order_invoice_register>
90
+ <sales_order_invoice_cancel>
91
+ <observers>
92
+ <exactor_sales_observer>
93
+ <type>singleton</type>
94
+ <class>Exactor_Sales_Model_Observer</class>
95
+ <method>handleCancelInvoice</method>
96
+ </exactor_sales_observer>
97
+ </observers>
98
+ </sales_order_invoice_cancel>
99
  </events>
100
  <models>
101
  <tax>
app/code/local/Exactor/Tax/Helper/Mapping.php CHANGED
@@ -13,6 +13,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
13
  const EUC_HANDLING = 'EUC-13010301';
14
  const EUC_NON_TAXABLE = 'EUC-99990101';
15
  const EUC_GIFT_CARD = self::EUC_NON_TAXABLE;
 
16
 
17
  const MSG_DEFAULT_SHIPPING_NAME = 'Default Shipping';
18
  const MSG_HANDLING_FEE = 'Handling Fee';
@@ -22,10 +23,13 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
22
  const MSG_DISCOUNTED_BY = 'Discounted by $';
23
  const MSG_ADJUSTMENTS_REFUND = "Adjustments Refund";
24
  const MSG_GIFT_CARD_ITEM = "Gift card(-s)";
 
25
 
26
  const LINE_ITEM_ID_SHIPPING = "SHIPPING";
27
  const LINE_ITEM_ID_HANDLING = "HANDLING";
28
  const LINE_ITEM_ID_ADJUSTMENTS = "ADJUSTMENTS";
 
 
29
  const INDEXED_LINE_ITEM_ID_PREFIX = '_';
30
 
31
  const ATTRIBUTE_NAME_EXEMPTION = 'taxvat';
@@ -152,7 +156,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
152
  Exactor_Core_Model_MerchantSettings $merchantSettings){
153
 
154
  if ($quoteAddress->getAddressType() == Mage_Sales_Model_Quote_Address::TYPE_BILLING) return null; // There is no shipping fees there
155
- if ($quoteAddress->getShippingAmount()== self::PRICE_TYPE_DYNAMIC) return null;
156
  $shippingLineItem = $this->getShippingLineItem($merchantSettings, $quoteAddress->getShippingMethod(),
157
  $quoteAddress->getShippingDescription(),
158
  $quoteAddress->getShippingAmount(),
@@ -161,7 +165,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
161
  }
162
 
163
  public function getShippingLineItemForCreditMemo(Mage_Sales_Model_Order_Creditmemo $creditMemo, Exactor_Core_Model_MerchantSettings $merchantSettings){
164
- if ($creditMemo->getShippingAmount()== self::PRICE_TYPE_DYNAMIC) return null;
165
  $lineItem = $this->getShippingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod(),
166
  $creditMemo->getOrder()->getShippingDescription(),
167
  $creditMemo->getShippingAmount());
@@ -170,6 +174,19 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
170
  return $lineItem;
171
  }
172
 
 
 
 
 
 
 
 
 
 
 
 
 
 
173
  private function getShippingLineItem(Exactor_Core_Model_MerchantSettings $merchantSettings,
174
  $carrierName, $carrierDescription, $amount, $discount=0){
175
  $shippingLineItem = new LineItemType();
@@ -300,6 +317,16 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
300
  return $exemptionId;
301
  }
302
 
 
 
 
 
 
 
 
 
 
 
303
  private function getCurrentCurrencyCode(Mage_Sales_Model_Quote_Address $quoteAddress){
304
  $store = Mage::app()->getStore();
305
  if ($quoteAddress->getQuote() != null && $quoteAddress->getQuote()->getStoreId() != null){
@@ -321,10 +348,21 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
321
  $lineItem->setGrossAmount($amount);
322
  $lineItem->setQuantity(1);
323
  $lineItem->setSKU(self::EUC_GIFT_CARD);
 
324
  $lineItem->setDescription(self::MSG_GIFT_CARD_ITEM);
325
  return $lineItem;
326
  }
327
 
 
 
 
 
 
 
 
 
 
 
328
  /**
329
  * @param Mage_Sales_Model_Quote_Address $quoteAddress
330
  * @param Exactor_Core_Model_MerchantSettings $merchantSettings
@@ -365,11 +403,11 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
365
  $invoiceRequest->setExemptionId($this->getExemptionIdForQuoteAddress($quoteAddress, $merchantSettings));
366
  // Line items list
367
  $magentoItems = $quoteAddress->getAllItems();
368
- $itemNum = self::PRICE_TYPE_DYNAMIC;
369
  /**
370
  * @var $magentoItem Mage_Sales_Model_Quote_Item
371
  */
372
- foreach ($magentoItems as $magentoItem){
373
  $exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, $quoteAddress, $merchantSettings);
374
  if ($exactorLineItem == null) continue;
375
  $exactorLineItem->setId(self::INDEXED_LINE_ITEM_ID_PREFIX . $magentoItem->getId());
@@ -386,18 +424,46 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
386
  $invoiceRequest->addLineItem($exactorLineItem);
387
  }
388
  // Gift Cards
389
- if ($quoteAddress->getBaseGiftCardsAmount() != null && $quoteAddress->getBaseGiftCardsAmount() != self::PRICE_TYPE_DYNAMIC){
390
  $invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $quoteAddress->getBaseGiftCardsAmount()));
391
  }
 
 
 
 
 
392
  // Shipping & Handling
393
  $invoiceRequest->addLineItem($this->getShippingLineItemForQuoteAddress($quoteAddress, $merchantSettings));
394
  $invoiceRequest->addLineItem($this->getHandlingLineItemForQuoteAddress($quoteAddress, $merchantSettings));
395
  return $invoiceRequest;
396
  }
397
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
398
 
399
-
400
- /**Return invoice requests by credit memo. In case if credit memo contains adjustments - returns 2 separated invoices
401
  * @param Mage_Sales_Model_Order_Creditmemo $creditMemo
402
  * @param Exactor_Core_Model_MerchantSettings $merchantSettings
403
  * @return array InvoiceRequestType
@@ -409,7 +475,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
409
  $invoiceRequest->setShipTo($this->buildExactorAddressForOrderAddress($creditMemo->getShippingAddress()));
410
  $invoiceRequest->setShipFrom($merchantSettings->getExactorShippingAddress());
411
  $invoiceRequest->setCurrencyCode($creditMemo->getOrder()->getOrderCurrencyCode());
412
- $invoiceRequest->setPurchaseOrderNumber("Refund");
413
  $invoiceRequest->setSaleDate(new DateTime("@".$creditMemo->getOrder()->getCreatedAtDate()->getTimestamp()));
414
  $invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
415
  // Line items
@@ -427,7 +493,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
427
 
428
  if ($shippingLineItem!=null) {
429
  $handlingLineItem = $this->getHandlingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod());
430
- if ($handlingLineItem!=null){
431
  $delta = $creditMemo->getOrder()->getBaseShippingAmount() - $creditMemo->getOrder()->getBaseShippingRefunded() + $creditMemo->getBaseShippingAmount();
432
  $shippingFactor = $creditMemo->getBaseShippingAmount() / $delta;
433
  $handlingAmount = $handlingLineItem->getGrossAmount()*$shippingFactor;
@@ -449,28 +515,108 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
449
  $adjustmentsItem->setQuantity(1);
450
  $adjustmentsItem->setSKU(self::EUC_NON_TAXABLE);
451
  $adjustmentsItem->setGrossAmount($creditMemo->getAdjustmentPositive()-$creditMemo->getAdjustmentNegative());
452
- if ($adjustmentsItem->getGrossAmount() != self::PRICE_TYPE_DYNAMIC ||
453
- $creditMemo->getBaseGiftCardsAmount() != null && $creditMemo->getBaseGiftCardsAmount() != self::PRICE_TYPE_DYNAMIC
454
- ){
 
455
  $adjustmentInvoice = clone $invoiceRequest;
456
  $adjustmentInvoice->setPurchaseOrderNumber(self::MSG_ADJUSTMENTS_REFUND);
457
  $adjustmentInvoice->setLineItems(array());
458
- if ($adjustmentsItem->getGrossAmount() != self::PRICE_TYPE_DYNAMIC){
459
  $adjustmentInvoice->addLineItem($adjustmentsItem);
460
  }
461
  // Gift Cards
462
- if ($creditMemo->getBaseGiftCardsAmount() != null && $creditMemo->getBaseGiftCardsAmount() != self::PRICE_TYPE_DYNAMIC){
463
  $adjustmentInvoice->addLineItem($this->buildGiftCardLineItem(-1 * $creditMemo->getBaseGiftCardsAmount()));
464
  }
 
 
 
 
 
465
  $result[] = $adjustmentInvoice;
466
  }
467
  return $result;
468
  }
469
 
470
- public function buildInvoiceRequestForMagentoInvoice(){
 
471
  $invoiceRequest = new InvoiceRequestType();
472
-
473
- return $invoiceRequest;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
474
  }
475
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
476
  }
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';
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';
156
  Exactor_Core_Model_MerchantSettings $merchantSettings){
157
 
158
  if ($quoteAddress->getAddressType() == Mage_Sales_Model_Quote_Address::TYPE_BILLING) return null; // There is no shipping fees there
159
+ if ($quoteAddress->getShippingAmount()==0) return null;
160
  $shippingLineItem = $this->getShippingLineItem($merchantSettings, $quoteAddress->getShippingMethod(),
161
  $quoteAddress->getShippingDescription(),
162
  $quoteAddress->getShippingAmount(),
165
  }
166
 
167
  public function getShippingLineItemForCreditMemo(Mage_Sales_Model_Order_Creditmemo $creditMemo, Exactor_Core_Model_MerchantSettings $merchantSettings){
168
+ if ($creditMemo->getShippingAmount()==0) return null;
169
  $lineItem = $this->getShippingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod(),
170
  $creditMemo->getOrder()->getShippingDescription(),
171
  $creditMemo->getShippingAmount());
174
  return $lineItem;
175
  }
176
 
177
+ public function getShippingLineItemForOrder(Mage_Sales_Model_Order $order, Exactor_Core_Model_MerchantSettings $merchantSettings) {
178
+ if ($order->getBaseShippingAmount() == 0) return null;
179
+ $lineItem = $this->getShippingLineItem($merchantSettings, $order->getShippingMethod(),
180
+ $order->getShippingDescription(),
181
+ $order->getBaseShippingAmount());
182
+ return $lineItem;
183
+ }
184
+
185
+ public function getShippingLineItemForInvoice(Mage_Sales_Model_Order_Invoice $invoice, Exactor_Core_Model_MerchantSettings $merchantSettings) {
186
+ if ($invoice->getBaseShippingAmount() == 0) return null;
187
+ return $this->getShippingLineItemForOrder($invoice->getOrder(), $merchantSettings);
188
+ }
189
+
190
  private function getShippingLineItem(Exactor_Core_Model_MerchantSettings $merchantSettings,
191
  $carrierName, $carrierDescription, $amount, $discount=0){
192
  $shippingLineItem = new LineItemType();
317
  return $exemptionId;
318
  }
319
 
320
+ private function getExemptionIdForOrder(Mage_Sales_Model_Order $order,
321
+ Exactor_Core_Model_MerchantSettings $merchantSettings){
322
+ $exemptionId = '';
323
+ if ($merchantSettings->getExemptionsSupported()){
324
+ $customerExemptionId = $order->getCustomerTaxvat();
325
+ if ($customerExemptionId!=null) $exemptionId=$customerExemptionId;
326
+ }
327
+ return $exemptionId;
328
+ }
329
+
330
  private function getCurrentCurrencyCode(Mage_Sales_Model_Quote_Address $quoteAddress){
331
  $store = Mage::app()->getStore();
332
  if ($quoteAddress->getQuote() != null && $quoteAddress->getQuote()->getStoreId() != null){
348
  $lineItem->setGrossAmount($amount);
349
  $lineItem->setQuantity(1);
350
  $lineItem->setSKU(self::EUC_GIFT_CARD);
351
+ $lineItem->setId(self::LINE_ITEM_ID_GIFT_CARD);
352
  $lineItem->setDescription(self::MSG_GIFT_CARD_ITEM);
353
  return $lineItem;
354
  }
355
 
356
+ private function buildStoreCreditLineItem($amount){
357
+ $lineItem = new LineItemType();
358
+ $lineItem->setGrossAmount($amount);
359
+ $lineItem->setQuantity(1);
360
+ $lineItem->setSKU(self::EUC_STORE_CREDIT);
361
+ $lineItem->setId(self::LINE_ITEM_ID_STORE_CREDIT);
362
+ $lineItem->setDescription(self::MSG_STORE_CREDIT_ITEM);
363
+ return $lineItem;
364
+ }
365
+
366
  /**
367
  * @param Mage_Sales_Model_Quote_Address $quoteAddress
368
  * @param Exactor_Core_Model_MerchantSettings $merchantSettings
403
  $invoiceRequest->setExemptionId($this->getExemptionIdForQuoteAddress($quoteAddress, $merchantSettings));
404
  // Line items list
405
  $magentoItems = $quoteAddress->getAllItems();
406
+ $itemNum = 0;
407
  /**
408
  * @var $magentoItem Mage_Sales_Model_Quote_Item
409
  */
410
+ foreach ($magentoItems as $magentoItem) {
411
  $exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, $quoteAddress, $merchantSettings);
412
  if ($exactorLineItem == null) continue;
413
  $exactorLineItem->setId(self::INDEXED_LINE_ITEM_ID_PREFIX . $magentoItem->getId());
424
  $invoiceRequest->addLineItem($exactorLineItem);
425
  }
426
  // Gift Cards
427
+ if ($quoteAddress->getBaseGiftCardsAmount() != null && $quoteAddress->getBaseGiftCardsAmount() != 0){
428
  $invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $quoteAddress->getBaseGiftCardsAmount()));
429
  }
430
+ // Store Credit
431
+ $storeCreditAmount = $quoteAddress->getBaseCustomerBalanceAmount();
432
+ if ($storeCreditAmount != null && $storeCreditAmount != 0) {
433
+ $invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
434
+ }
435
  // Shipping & Handling
436
  $invoiceRequest->addLineItem($this->getShippingLineItemForQuoteAddress($quoteAddress, $merchantSettings));
437
  $invoiceRequest->addLineItem($this->getHandlingLineItemForQuoteAddress($quoteAddress, $merchantSettings));
438
  return $invoiceRequest;
439
  }
440
 
441
+ /**
442
+ * Calculates prorated shipping and handling amounts for partial payments \ refunds.
443
+ *
444
+ * @param $orderedShippingAmount - total shipping amount from the order. Typically getOrder()->getBaseShippingAmount()
445
+ * @param $alreadyProcessedAmount - a part of shipping amount that was already processed, for instance $creditMemo->getOrder()->getBaseShippingRefunded()
446
+ * @param $targetShippingAmount - shipping amount to process, e.g. $invoice->getBaseShippingAmount()
447
+ * @param $handlingTotalAmount - total handling amount
448
+ * @param Mage_Core_Model_Store $store
449
+ * @return array (shipping amount, handling amount)
450
+ */
451
+ private function calculateProratedShippingAndHandling($orderedShippingAmount, $alreadyProcessedAmount,
452
+ $targetShippingAmount, $handlingTotalAmount,
453
+ Mage_Core_Model_Store $store) {
454
+ // $orderedShippingAmount = $invoice->getOrder()->getBaseShippingAmount();
455
+ // $alreadyProcessedAmount = $invoice->getOrder()->getBaseShippingRefunded();
456
+ // $targetShippingAmount = $invoice->getBaseShippingAmount();
457
+ // $handlingTotalAmount = $handlingLineItem->getGrossAmount();
458
+ $delta = $orderedShippingAmount - $alreadyProcessedAmount + $targetShippingAmount;
459
+ $shippingFactor = $targetShippingAmount / $delta;
460
+ $handlingAmount = $handlingTotalAmount*$shippingFactor;
461
+ $shippingAmount = $targetShippingAmount - $handlingAmount;
462
+ return array($store->roundPrice($shippingAmount),
463
+ $store->roundPrice($shippingAmount));
464
+ }
465
 
466
+ /** Return invoice requests by credit memo. In case if credit memo contains adjustments - returns 2 separated invoices
 
467
  * @param Mage_Sales_Model_Order_Creditmemo $creditMemo
468
  * @param Exactor_Core_Model_MerchantSettings $merchantSettings
469
  * @return array InvoiceRequestType
475
  $invoiceRequest->setShipTo($this->buildExactorAddressForOrderAddress($creditMemo->getShippingAddress()));
476
  $invoiceRequest->setShipFrom($merchantSettings->getExactorShippingAddress());
477
  $invoiceRequest->setCurrencyCode($creditMemo->getOrder()->getOrderCurrencyCode());
478
+ $invoiceRequest->setPurchaseOrderNumber($creditMemo->getOrder()->getIncrementId());
479
  $invoiceRequest->setSaleDate(new DateTime("@".$creditMemo->getOrder()->getCreatedAtDate()->getTimestamp()));
480
  $invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
481
  // Line items
493
 
494
  if ($shippingLineItem!=null) {
495
  $handlingLineItem = $this->getHandlingLineItem($merchantSettings, $creditMemo->getOrder()->getShippingMethod());
496
+ if ($handlingLineItem!=null){ // TODO: use common method: calculateProratedShippingAndHandling(...)
497
  $delta = $creditMemo->getOrder()->getBaseShippingAmount() - $creditMemo->getOrder()->getBaseShippingRefunded() + $creditMemo->getBaseShippingAmount();
498
  $shippingFactor = $creditMemo->getBaseShippingAmount() / $delta;
499
  $handlingAmount = $handlingLineItem->getGrossAmount()*$shippingFactor;
515
  $adjustmentsItem->setQuantity(1);
516
  $adjustmentsItem->setSKU(self::EUC_NON_TAXABLE);
517
  $adjustmentsItem->setGrossAmount($creditMemo->getAdjustmentPositive()-$creditMemo->getAdjustmentNegative());
518
+ if ($adjustmentsItem->getGrossAmount() != 0
519
+ || $creditMemo->getBaseGiftCardsAmount() != null && $creditMemo->getBaseGiftCardsAmount() != 0
520
+ || $creditMemo->getBaseCustomerBalanceAmount() != null && $creditMemo->getBaseCustomerBalanceAmount() != 0
521
+ ) {
522
  $adjustmentInvoice = clone $invoiceRequest;
523
  $adjustmentInvoice->setPurchaseOrderNumber(self::MSG_ADJUSTMENTS_REFUND);
524
  $adjustmentInvoice->setLineItems(array());
525
+ if ($adjustmentsItem->getGrossAmount() != 0){
526
  $adjustmentInvoice->addLineItem($adjustmentsItem);
527
  }
528
  // Gift Cards
529
+ if ($creditMemo->getBaseGiftCardsAmount() != null && $creditMemo->getBaseGiftCardsAmount() != 0){
530
  $adjustmentInvoice->addLineItem($this->buildGiftCardLineItem(-1 * $creditMemo->getBaseGiftCardsAmount()));
531
  }
532
+ // Store Credit
533
+ $storeCreditAmount = $creditMemo->getBaseCustomerBalanceAmount();
534
+ if ($storeCreditAmount != null && $storeCreditAmount != 0) {
535
+ $adjustmentInvoice->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
536
+ }
537
  $result[] = $adjustmentInvoice;
538
  }
539
  return $result;
540
  }
541
 
542
+ public function buildInvoiceRequestForMagentoInvoice(Mage_Sales_Model_Order_Invoice $invoice, Exactor_Core_Model_MerchantSettings $merchantSettings){
543
+ $result = array();
544
  $invoiceRequest = new InvoiceRequestType();
545
+ $invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($invoice->getBillingAddress()));
546
+ $invoiceRequest->setShipTo($this->buildExactorAddressForOrderAddress($invoice->getShippingAddress()));
547
+ $invoiceRequest->setShipFrom($merchantSettings->getExactorShippingAddress());
548
+ $invoiceRequest->setCurrencyCode($invoice->getOrder()->getOrderCurrencyCode());
549
+ $invoiceRequest->setPurchaseOrderNumber($invoice->getOrder()->getIncrementId());
550
+ $invoiceRequest->setSaleDate(new DateTime("@".$invoice->getOrder()->getCreatedAtDate()->getTimestamp()));
551
+ $invoiceRequest->setExemptionId($this->getExemptionIdForOrder($invoice->getOrder(), $merchantSettings));
552
+ //$invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
553
+ // Line items
554
+ $magentoItems = $invoice->getAllItems();
555
+ foreach ($magentoItems as $magentoItem){
556
+ $exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
557
+ if ($exactorLineItem != null){
558
+ $exactorLineItem->setQuantity($magentoItem->getQty());
559
+ }
560
+ $invoiceRequest->addLineItem($exactorLineItem);
561
+ }
562
+ // Shipping & Handling
563
+ $shippingLineItem = $this->getShippingLineItemForInvoice($invoice, $merchantSettings);
564
+ $handlingLineItem = null;
565
+ if ($shippingLineItem!=null) {
566
+ $handlingLineItem = $this->getHandlingLineItem($merchantSettings, $invoice->getOrder()->getShippingMethod());
567
+ }
568
+ $invoiceRequest->addLineItem($shippingLineItem);
569
+ $invoiceRequest->addLineItem($handlingLineItem);
570
+ // Gift cards
571
+ if ($invoice->getBaseGiftCardsAmount() != null && $invoice->getBaseGiftCardsAmount() != 0){
572
+ $invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $invoice->getBaseGiftCardsAmount()));
573
+ }
574
+ // Store Credit
575
+ $storeCreditAmount = $invoice->getBaseCustomerBalanceAmount();
576
+ if ($storeCreditAmount != null && $storeCreditAmount != 0) {
577
+ $invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
578
+ }
579
+ $result[] = $invoiceRequest;
580
+ return $result;
581
  }
582
 
583
+ public function buildInvoiceRequestForMagentoOrder(Mage_Sales_Model_Order $order, Exactor_Core_Model_MerchantSettings $merchantSettings){
584
+ $result = array();
585
+ $invoiceRequest = new InvoiceRequestType();
586
+ $invoiceRequest->setBillTo($this->buildExactorAddressForOrderAddress($order->getBillingAddress()));
587
+ $invoiceRequest->setShipTo($this->buildExactorAddressForOrderAddress($order->getShippingAddress()));
588
+ $invoiceRequest->setShipFrom($merchantSettings->getExactorShippingAddress());
589
+ $invoiceRequest->setCurrencyCode($order->getOrderCurrencyCode());
590
+ $invoiceRequest->setPurchaseOrderNumber($order->getIncrementId());
591
+ $invoiceRequest->setSaleDate(new DateTime("@".$order->getCreatedAtDate()->getTimestamp()));
592
+ $invoiceRequest->setExemptionId($this->getExemptionIdForOrder($order, $merchantSettings));
593
+ // Line items
594
+ $magentoItems = $order->getAllItems();
595
+ foreach ($magentoItems as $magentoItem){
596
+ $exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
597
+ if ($exactorLineItem != null){
598
+ $exactorLineItem->setQuantity($magentoItem->getQtyOrdered());
599
+ }
600
+ $invoiceRequest->addLineItem($exactorLineItem);
601
+ }
602
+ // Shipping & Handling
603
+ $shippingLineItem = $this->getShippingLineItemForOrder($order, $merchantSettings);
604
+ $handlingLineItem = null;
605
+ if ($shippingLineItem!=null) {
606
+ $handlingLineItem = $this->getHandlingLineItem($merchantSettings, $order->getShippingMethod());
607
+ }
608
+ $invoiceRequest->addLineItem($shippingLineItem);
609
+ $invoiceRequest->addLineItem($handlingLineItem);
610
+ // Gift cards
611
+ if ($order->getBaseGiftCardsAmount() != null && $order->getBaseGiftCardsAmount() != 0){
612
+ $invoiceRequest->addLineItem($this->buildGiftCardLineItem(-1 * $order->getBaseGiftCardsAmount()));
613
+ }
614
+ // Store Credit
615
+ $storeCreditAmount = $order->getBaseCustomerBalanceAmount();
616
+ if ($storeCreditAmount != null && $storeCreditAmount != 0) {
617
+ $invoiceRequest->addLineItem($this->buildStoreCreditLineItem(-1 * $storeCreditAmount));
618
+ }
619
+ $result[] = $invoiceRequest;
620
+ return $result;
621
+ }
622
  }
app/code/local/Exactor/Tax/etc/config.xml CHANGED
@@ -28,7 +28,7 @@
28
  <config>
29
  <modules>
30
  <Exactor_Tax>
31
- <version>2012.09.20</version>
32
  </Exactor_Tax>
33
  </modules>
34
  <global>
28
  <config>
29
  <modules>
30
  <Exactor_Tax>
31
+ <version>2012.10.19</version>
32
  </Exactor_Tax>
33
  </modules>
34
  <global>
app/design/adminhtml/default/default/template/ExactorSettings/settingsform.phtml CHANGED
@@ -153,6 +153,30 @@
153
  <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__('Plugin Settings')?></h4>
154
  <fieldset>
155
  <table cellspacing="0" class="form-list" width="100%">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
  <tr>
157
  <td class="label" style="width: 280px"><?php echo $this->__('Do shipping charges include handling fees')?> <span class="required">*</span></td>
158
  <td class="input-ele">
153
  <h4 class="icon-head head-edit-form fieldset-legend"><?php echo $this->__('Plugin Settings')?></h4>
154
  <fieldset>
155
  <table cellspacing="0" class="form-list" width="100%">
156
+ <tr>
157
+ <td class="label" style="width: 280px"><?php echo $this->__('Effective Date')?> <span class="required">*</span></td>
158
+ <td class="input-ele">
159
+ <input id="EffectiveDate" class="required-entry input-text validate-date"
160
+ value="<?php echo $accountSettings->getEffectiveDate(); ?>"
161
+ name="exactordetailsform[EffectiveDate]" STYLE="width: 135px" />
162
+ <script type="text/javascript">
163
+ Calendar.setup({
164
+ inputField: "EffectiveDate",
165
+ ifFormat: "%m/%e/%y",
166
+ showsTime: false,
167
+ align: "Bl",
168
+ singleClick : true
169
+ });
170
+ </script>
171
+ </td>
172
+ </tr>
173
+ <tr>
174
+ <td colspan="2">
175
+ <div style="margin-left: 5px; display: inline;">
176
+ <strong>Note:</strong> Changing options below will not affect any existing orders.
177
+ </div>
178
+ </td>
179
+ </tr>
180
  <tr>
181
  <td class="label" style="width: 280px"><?php echo $this->__('Do shipping charges include handling fees')?> <span class="required">*</span></td>
182
  <td class="input-ele">
lib/ExactorCommons/ExactorCommons.php CHANGED
@@ -657,21 +657,18 @@ class ExactorProcessingService{
657
  }
658
 
659
  /**
660
- * Performs partial refund basing on the InvoiceRequest information.
661
- * Basically it just negate all amounts in the given invoice transaction and commits it.
 
662
  * @param InvoiceRequestType $invoiceRequest
663
  * @param DateTime $date
664
  * @param string $invoiceNumber
665
  * @return TaxResponseType
666
  */
667
- public function partialRefund(InvoiceRequestType $invoiceRequest, DateTime $date, $invoiceNumber="unknown"){
668
  $commitRequest = new CommitRequestType();
669
  $commitRequest->setCommitDate($date);
670
  $commitRequest->setInvoiceNumber($invoiceNumber);
671
- // Negate all item amounts
672
- foreach ($invoiceRequest->getLineItems() as $lineItem){
673
- $lineItem->setGrossAmount(-1 * $lineItem->getGrossAmount());
674
- }
675
  $commitRequest->setInvoiceRequest($invoiceRequest);
676
  $request = ExactorConnectionFactory::getInstance()->buildRequest($this->merchantId, $this->userId, $this->partnerId);
677
  $request->addCommitRequest($commitRequest);
@@ -690,12 +687,41 @@ class ExactorProcessingService{
690
  $this->pluginCallback->onCommitFail($signature, $response->getFirstError(), $commitRequest);
691
  }
692
  }else{
693
- $commitResponses = $response->getCommitResponses();
694
  $this->pluginCallback->onCommitSuccess($signature, $commitResponses[0], $commitRequest, null);
695
  }
696
  return $response;
697
  }
698
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
699
  /**
700
  * Fetch information about transaction from the internal database by given internal id
701
  * and send refund request.
657
  }
658
 
659
  /**
660
+ * Just creates CommitRequestType and sends commit request to Exactor.
661
+ * If failed due to the invalid date - tries to use current one.
662
+ *
663
  * @param InvoiceRequestType $invoiceRequest
664
  * @param DateTime $date
665
  * @param string $invoiceNumber
666
  * @return TaxResponseType
667
  */
668
+ private function commitNewInvoiceRequestObject(InvoiceRequestType $invoiceRequest, DateTime $date, $invoiceNumber="unknown") {
669
  $commitRequest = new CommitRequestType();
670
  $commitRequest->setCommitDate($date);
671
  $commitRequest->setInvoiceNumber($invoiceNumber);
 
 
 
 
672
  $commitRequest->setInvoiceRequest($invoiceRequest);
673
  $request = ExactorConnectionFactory::getInstance()->buildRequest($this->merchantId, $this->userId, $this->partnerId);
674
  $request->addCommitRequest($commitRequest);
687
  $this->pluginCallback->onCommitFail($signature, $response->getFirstError(), $commitRequest);
688
  }
689
  }else{
690
+ $commitResponses = $response->getCommitResponses();
691
  $this->pluginCallback->onCommitSuccess($signature, $commitResponses[0], $commitRequest, null);
692
  }
693
  return $response;
694
  }
695
 
696
+ /**
697
+ * Performs commit of the given invoice object is useful for partial payments.
698
+ * Basically just convenient method for committing transactions.
699
+ *
700
+ * @param InvoiceRequestType $invoiceRequest
701
+ * @param DateTime $date
702
+ * @param string $invoiceNumber
703
+ * @return TaxResponseType
704
+ */
705
+ public function partialPayment(InvoiceRequestType $invoiceRequest, DateTime $date, $invoiceNumber="unknown") {
706
+ return $this->commitNewInvoiceRequestObject($invoiceRequest, $date, $invoiceNumber);
707
+ }
708
+
709
+ /**
710
+ * Performs partial refund basing on the InvoiceRequest information.
711
+ * Basically it just negate all amounts in the given invoice transaction and commits it.
712
+ * @param InvoiceRequestType $invoiceRequest
713
+ * @param DateTime $date
714
+ * @param string $invoiceNumber
715
+ * @return TaxResponseType
716
+ */
717
+ public function partialRefund(InvoiceRequestType $invoiceRequest, DateTime $date, $invoiceNumber="unknown"){
718
+ // Negate all item amounts
719
+ foreach ($invoiceRequest->getLineItems() as $lineItem){
720
+ $lineItem->setGrossAmount(-1 * $lineItem->getGrossAmount());
721
+ }
722
+ return $this->partialPayment($invoiceRequest, $date, $invoiceNumber);
723
+ }
724
+
725
  /**
726
  * Fetch information about transaction from the internal database by given internal id
727
  * and send refund request.
lib/ExactorCommons/ExactorDomainObjects.php CHANGED
@@ -1366,12 +1366,21 @@ class TaxResponseType extends XmlSerializationSupport{
1366
  /** Returns first InvoiceResponseType from the list or null if there are no any invoice responses
1367
  * @return InvoiceResponseType|null
1368
  */
1369
- public function getFirstInvoice(){
1370
  if (!count($this->getInvoiceResponses())) return null;
1371
  $invoices = $this->getInvoiceResponses();
1372
  return $invoices[0];
1373
  }
1374
 
 
 
 
 
 
 
 
 
 
1375
  /* ******** GETTERS AND SETTERS *********** */
1376
 
1377
  /**
1366
  /** Returns first InvoiceResponseType from the list or null if there are no any invoice responses
1367
  * @return InvoiceResponseType|null
1368
  */
1369
+ public function getFirstInvoice() {
1370
  if (!count($this->getInvoiceResponses())) return null;
1371
  $invoices = $this->getInvoiceResponses();
1372
  return $invoices[0];
1373
  }
1374
 
1375
+ /** Returns first InvoiceResponseType from the list or null if there are no any invoice responses
1376
+ * @return InvoiceResponseType|null
1377
+ */
1378
+ public function getFirstCommit() {
1379
+ if (!count($this->getCommitResponses())) return null;
1380
+ $commits = $this->getCommitResponses();
1381
+ return $commits[0];
1382
+ }
1383
+
1384
  /* ******** GETTERS AND SETTERS *********** */
1385
 
1386
  /**
lib/ExactorCommons/config.php CHANGED
@@ -5,7 +5,7 @@
5
  * Time: 10:36 AM
6
  */
7
 
8
- ExactorLoggingFactory::getInstance()->setup('MagentoLogger', IExactorLogger::TRACE);
9
- ExactorConnectionFactory::getInstance()->setup('Magento','v20120920');
10
  ExactorProcessingServiceFactory::getInstance()->setup(new MagentoExactorCallback());
11
 
5
  * Time: 10:36 AM
6
  */
7
 
8
+ ExactorLoggingFactory::getInstance()->setup('MagentoLogger', IExactorLogger::DEBUG);
9
+ ExactorConnectionFactory::getInstance()->setup('Magento','v20121019');
10
  ExactorProcessingServiceFactory::getInstance()->setup(new MagentoExactorCallback());
11
 
lib/ExactorCommons/config.php~ DELETED
@@ -1,11 +0,0 @@
1
- <?php
2
- /**
3
- * User: LOGICIFY\corvis
4
- * Date: 4/20/12
5
- * Time: 10:36 AM
6
- */
7
-
8
- ExactorLoggingFactory::getInstance()->setup('MagentoLogger', IExactorLogger::TRACE);
9
- ExactorConnectionFactory::getInstance()->setup('Magento','v20120614');
10
- ExactorProcessingServiceFactory::getInstance()->setup(new MagentoExactorCallback());
11
-
 
 
 
 
 
 
 
 
 
 
 
package.xml CHANGED
@@ -1,7 +1,7 @@
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Mage_Exactor_Tax</name>
4
- <version>2012.09.20</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,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 &amp; 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>2012-09-21</date>
16
- <time>16:32:09</time>
17
- <contents><target name="magelocal"><dir name="Exactor"><dir name="Core"><dir name="Helper"><file name="SessionCache.php" hash="72692a33574f8ba2f1858e2e93aa4edf"/></dir><dir name="Model"><file name="ExactorTransaction.php" hash="852aa20f6e3b7aa0001439d4bffe9724"/><file name="MerchantSettings.php" hash="b4c2acde5dfa929e89ea7ec9fe0f1b2f"/><dir name="Mysql4"><dir name="ExactorTransaction"><file name="Collection.php" hash="c7b890b4d3ab35e65a3856ae0e2fdf72"/></dir><file name="ExactorTransaction.php" hash="c91aebaae767613acf1c439a8b513c3b"/><dir name="MerchantSettings"><file name="Collection.php" hash="c1593f52e582e601409c4651c37495af"/><file name="Collection.php~" hash="d360e202eb30432ac41dc023ce13ffc0"/></dir><file name="MerchantSettings.php" hash="8f22b76bb64cdc7b1deb6f0e38889905"/></dir><dir name="Type"><file name="Onepage.php" hash="2441fb08bbeb579831cea4d3fbd31104"/></dir></dir><dir name="etc"><file name="config.xml" hash="98ecc82a5f7b74ac0bfc0f7ab512afdb"/></dir></dir><dir name="ExactorSettings"><dir name="Block"><file name="Form.php" hash="7dcfb00922cfe305d8ae08cb20ca5e87"/></dir><dir name="Helper"><file name="Data.php" hash="a23bb9c251f0dbb77c107d01dde39e86"/><file name="VersionResolver.php" hash="14dce068dfe2a7d3364c4bd29e6f8431"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="FormController.php" hash="bebd9e556ff2266f5208c950da3ade14"/></dir><file name="AjaxController.php" hash="c07aeeca00e1408e52945fc027569793"/><file name="IndexController.php" hash="f47cbc274dd68c57c30b60bbee69259e"/></dir><dir name="etc"><file name="config.xml" hash="6c2f28c302b359abd12565264fa23bc5"/></dir><dir name="sql"><dir name="ExactorSettings_setup"><file name="mysql4-install-14.04.2012.php" hash="f35af1e12921b57479cb4b5677937a0c"/></dir></dir></dir><dir name="Sales"><dir name="Model"><file name="Observer.php" hash="3bf71b114fd042f9da4cafd0e2f60712"/></dir><dir name="etc"><file name="config.xml" hash="621a49d9f295a607fadb1cd92a96cbe0"/></dir></dir><dir name="Tax"><dir name="Helper"><file name="Calculation.php" hash="29c5252bdd48b173c90588f449114024"/><file name="Mapping.php" hash="6246788c22bfbf4f26a38940fa392f92"/></dir><dir name="Model"><dir name="Sales"><dir name="Total"><dir name="Quote"><dir name="Nominal"><file name="Tax.php" hash="156eff380df5b16db55449759f193490"/></dir><file name="Tax.php" hash="2177508f9375ba7c250ae165a798de72"/></dir></dir></dir></dir><dir name="etc"><file name="config.xml" hash="d4bc1466549b6a860cdc6793103ebfb5"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="exactorsettings.xml" hash="3707eac08d2393c8796eebf1cf7a0bd9"/><file name="exactoronestepcheckout.xml" hash="9fdfa1db5e4e60b4eec8f348c10aab07"/></dir><dir name="template"><dir name="ExactorSettings"><file name="settingsform.phtml" hash="40d421317cee3a5a8df1dde2b223f7d9"/></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="Exactor.xml" hash="e8997e8e36a265141b37790caaef39d6"/></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="8c1fb7bc67a16e47d99c957c5d19b4be"/><file name="ExactorDomainObjects.php" hash="28be782abfd7cf4bd4d23228ae97acc8"/><file name="Magento.php" hash="76da7333fe0692053a47f8564c7b513a"/><file name="RegionResolver.php" hash="2537638a7895a169cee4b1df786d22fb"/><file name="XmlProcessing.php" hash="383fd21839889d720e2094e83ccc7a2a"/><file name="config.php" hash="2d433e23d3b6588cc71806e5a2c1b6c7"/><file name="config.php~" hash="f12c65295b05793efd89dd64748282d1"/></dir></target></contents>
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>2012.10.19</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 &amp; 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>2012-10-23</date>
16
+ <time>10:27:34</time>
17
+ <contents><target name="magelocal"><dir name="Exactor"><dir name="Core"><dir name="Helper"><file name="SessionCache.php" hash="72692a33574f8ba2f1858e2e93aa4edf"/></dir><dir name="Model"><file name="ExactorTransaction.php" hash="852aa20f6e3b7aa0001439d4bffe9724"/><file name="MerchantSettings.php" hash="71a7c2308f6f0eda102ae84dd90df751"/><dir name="Mysql4"><dir name="ExactorTransaction"><file name="Collection.php" hash="c7b890b4d3ab35e65a3856ae0e2fdf72"/></dir><file name="ExactorTransaction.php" hash="c91aebaae767613acf1c439a8b513c3b"/><dir name="MerchantSettings"><file name="Collection.php" hash="c1593f52e582e601409c4651c37495af"/><file name="Collection.php~" hash="d360e202eb30432ac41dc023ce13ffc0"/></dir><file name="MerchantSettings.php" hash="8f22b76bb64cdc7b1deb6f0e38889905"/></dir><dir name="Type"><file name="Onepage.php" hash="2441fb08bbeb579831cea4d3fbd31104"/></dir></dir><dir name="etc"><file name="config.xml" hash="98ecc82a5f7b74ac0bfc0f7ab512afdb"/></dir></dir><dir name="ExactorSettings"><dir name="Block"><file name="Form.php" hash="5ea1d72197306072fe5fad9b97d109e8"/></dir><dir name="Helper"><file name="Data.php" hash="a23bb9c251f0dbb77c107d01dde39e86"/><file name="VersionResolver.php" hash="14dce068dfe2a7d3364c4bd29e6f8431"/></dir><dir name="controllers"><dir name="Adminhtml"><file name="FormController.php" hash="c0985258b110e0314e6b6ea091ae8c19"/></dir><file name="AjaxController.php" hash="c07aeeca00e1408e52945fc027569793"/><file name="IndexController.php" hash="f47cbc274dd68c57c30b60bbee69259e"/></dir><dir name="etc"><file name="config.xml" hash="674c326bfc901d0becf7c94ddcdd1452"/></dir><dir name="sql"><dir name="ExactorSettings_setup"><file name="mysql4-install-14.04.2012.php" hash="2f70daa04ec8cd640acc11af9dad1f44"/><file name="upgrade-2012.06.14-2012.09.25.php" hash="485f1a8cb461239da40d2e7ff8d1a4e5"/></dir></dir></dir><dir name="Sales"><dir name="Model"><file name="Observer.php" hash="90bcb73580a5092953878c330412529e"/></dir><dir name="etc"><file name="config.xml" hash="ba31618f5165dda20010c40e7ef8dad1"/></dir></dir><dir name="Tax"><dir name="Helper"><file name="Calculation.php" hash="29c5252bdd48b173c90588f449114024"/><file name="Mapping.php" hash="3d81378fe483ca9179b9bd6719c656ec"/></dir><dir name="Model"><dir name="Sales"><dir name="Total"><dir name="Quote"><dir name="Nominal"><file name="Tax.php" hash="156eff380df5b16db55449759f193490"/></dir><file name="Tax.php" hash="2177508f9375ba7c250ae165a798de72"/></dir></dir></dir></dir><dir name="etc"><file name="config.xml" hash="5988daba7efbc46db74e581f1079cadf"/></dir></dir></dir></target><target name="magedesign"><dir name="adminhtml"><dir name="default"><dir name="default"><dir name="layout"><file name="exactorsettings.xml" hash="3707eac08d2393c8796eebf1cf7a0bd9"/><file name="exactoronestepcheckout.xml" hash="9fdfa1db5e4e60b4eec8f348c10aab07"/></dir><dir name="template"><dir name="ExactorSettings"><file name="settingsform.phtml" hash="3f6e14533076ab97dbb0c98ba770bf87"/></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="Exactor.xml" hash="e8997e8e36a265141b37790caaef39d6"/></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="9300c2344a6c8a4683a411614767f757"/><file name="ExactorDomainObjects.php" hash="ae42cff2f17d21922685e46dd47d93ac"/><file name="Magento.php" hash="76da7333fe0692053a47f8564c7b513a"/><file name="RegionResolver.php" hash="2537638a7895a169cee4b1df786d22fb"/><file name="XmlProcessing.php" hash="383fd21839889d720e2094e83ccc7a2a"/><file name="config.php" hash="f08b57de24b410d569ac2e87cf2d1dcc"/></dir></target></contents>
18
  <compatible/>
19
  <dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
20
  </package>