Mage_Exactor_Tax - Version 2012.11.12

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


Code changes from version 2012.10.19 to 2012.11.12

app/code/local/Exactor/ExactorSettings/sql/ExactorSettings_setup/mysql4-install-14.04.2012.php CHANGED
@@ -48,7 +48,6 @@
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
 
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
 
app/code/local/Exactor/ExactorSettings/sql/ExactorSettings_setup/upgrade-2012.06.14-2012.09.25.php CHANGED
@@ -24,14 +24,18 @@
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();
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
+ try {
33
+ $installer->run("
34
  ALTER TABLE `exactor_account`
35
  ADD COLUMN `EffectiveDate` date NULL;
36
  ");
37
+ } catch (Exception $e) {
38
+ Mage::log("Error during performing update script" . $e->getMessage());
39
+ }
40
 
41
  $installer->endSetup();
app/code/local/Exactor/Sales/Model/Observer.php CHANGED
@@ -21,6 +21,18 @@ class Exactor_Sales_Model_Observer {
21
  /** @var IExactorLogger */
22
  private $logger;
23
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  private function setupExactorCommonLibrary(){
25
  $libDir = Mage::getBaseDir("lib") . '/ExactorCommons';
26
  require_once($libDir . '/XmlProcessing.php');
@@ -88,7 +100,7 @@ class Exactor_Sales_Model_Observer {
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
 
@@ -136,7 +148,7 @@ class Exactor_Sales_Model_Observer {
136
  * @param $order
137
  * @return bool
138
  */
139
- private function processFinishedOrder($order){
140
  $merchantSettings = $this->loadMerchantSettings($order);
141
  if ($merchantSettings==null) false;
142
  $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
@@ -153,20 +165,30 @@ class Exactor_Sales_Model_Observer {
153
  $this->exactorProcessingService->getPluginCallback()->saveTransactionInfo($transactionInfo,$transactionInfo->getSignature());
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
 
@@ -197,7 +219,7 @@ class Exactor_Sales_Model_Observer {
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;
@@ -322,9 +344,12 @@ class Exactor_Sales_Model_Observer {
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
 
21
  /** @var IExactorLogger */
22
  private $logger;
23
 
24
+ /**
25
+ * TODO: REMOVE THIS COMMENTED CODE
26
+ * This object indicates whether invoice has been already handeled in compatibility mode or not.
27
+ * It is needed to prevent double handling of the same invoice for Magento versions which OnCreatedInvoice
28
+ * request in multi-shipping mode.
29
+ * Once invoice created, order increment id associated with this invoice will be pushed in this list.
30
+ * If list contains order ID this means that we already created commited transaction for it (at list
31
+ * in the current request cycle).
32
+ * @var bool
33
+ */
34
+ private $invoiceProcessingCompatibilityList = array();
35
+
36
  private function setupExactorCommonLibrary(){
37
  $libDir = Mage::getBaseDir("lib") . '/ExactorCommons';
38
  require_once($libDir . '/XmlProcessing.php');
100
  $exactorProcessingService->partialPayment($invoiceRequest, new DateTime(), $this->getInvoiceIncrementId($invoice));
101
  }
102
  } catch (Exception $e) {
103
+ $this->logger->error("Can't commit transaction. See details above. :" . $e->getMessage() . $e->getTraceAsString(), 'commitTransactionForInvoice');
104
  }
105
  }
106
 
148
  * @param $order
149
  * @return bool
150
  */
151
+ private function processFinishedOrder(Mage_Sales_Model_Order $order){
152
  $merchantSettings = $this->loadMerchantSettings($order);
153
  if ($merchantSettings==null) false;
154
  $exactorProcessingService = ExactorProcessingServiceFactory::getInstance()
165
  $this->exactorProcessingService->getPluginCallback()->saveTransactionInfo($transactionInfo,$transactionInfo->getSignature());
166
  // if CommitOption is set up to commit on sales order - do commit the
167
  // latest transaction from the session storage
168
+ if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_SALES_ORDER)
169
+ {
170
  $this->logger->info("Commiting transaction for order $orderId - " . $transactionInfo->getExactorTrnId(), 'processFinishedOrder');
171
  try {
 
 
 
 
172
  $invoiceRequests = $this->exactorMappingHelper->buildInvoiceRequestForMagentoOrder($order, $merchantSettings);
173
  $taxResponse = $this->commitTransactionForOrder($order, $merchantSettings);
174
+ } catch (Exception $e) {
175
  $this->logger->error("Can't commit transaction. See details above.", 'processFinishedOrder');
176
  }
177
  //$this->exactorProcessingService->commitExistingInvoiceForOrder($orderId);
178
  }
179
+ // TODO: REMOVE THIS COMMENTED CODE
180
+ /*else {
181
+ // Else we should check if there is invoice attached and we have commit option set in "On Invoice"
182
+ $incrementOrderId = $order->getIncrementId();
183
+ if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE
184
+ && count($order->getInvoiceCollection()) && !in_array($incrementOrderId, $this->invoiceProcessingCompatibilityList)) {
185
+ foreach ($order->getInvoiceCollection() as $invoice) {
186
+ $this->logger->info("Commiting transaction for order $orderId, Commit On Invoice. Compatibility logic", 'processFinishedOrder');
187
+ $this->commitTransactionForInvoice($invoice, $merchantSettings);
188
+ $this->invoiceProcessingCompatibilityList[] = $incrementOrderId;
189
+ }
190
+ }
191
+ }*/
192
  return true;
193
  }
194
 
219
  } else {
220
  $this->logger->error("New order should be represented by the single exactor transaction. Is", 'processFinishedOrder');
221
  }
222
+ } catch (Exception $e) {
223
  $this->logger->error("Can't commit transaction. See details above.", 'processFinishedOrder');
224
  }
225
  return null;
344
  $this->logger->trace('called', 'handleNewInvoice');
345
  $merchantSettings = $this->loadMerchantSettings($observer->getInvoice()->getOrder());
346
  if ($merchantSettings==null) return;
347
+ // TODO: REMOVE THIS COMMENTED CODE
348
+ //$incrementOrderId = $observer->getInvoice()->getOrder()->getIncrementId();
349
+ if ($merchantSettings->getCommitOption() == Exactor_Core_Model_MerchantSettings::COMMIT_ON_INVOICE
350
+ /* && !in_array($incrementOrderId, $this->invoiceProcessingCompatibilityList)*/ ){ // If flag is set this means that invoice has been handled already in compatibility mode.
351
  $this->commitTransactionForInvoice($observer->getInvoice(), $merchantSettings);
352
+ /*$this->invoiceProcessingCompatibilityList[]= $incrementOrderId;*/
353
  }
354
  }
355
 
app/code/local/Exactor/Tax/Helper/Mapping.php CHANGED
@@ -153,7 +153,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
153
  }
154
 
155
  public function getShippingLineItemForQuoteAddress(Mage_Sales_Model_Quote_Address $quoteAddress,
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;
@@ -277,11 +277,17 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
277
  }else{
278
  $lineItem->setSKU($this->getSKUForItem($magentoItem, $merchantSettings));
279
  }
280
- $this->applyDiscountToLineItem($lineItem, $magentoItem->getDiscountAmount());
 
 
281
  // Check if it is bundle or groped product
282
- if (in_array($magentoItem->getProductType(), array(Mage_Catalog_Model_Product_Type::TYPE_BUNDLE))) {
283
- if ($magentoItem->getProduct()->getPriceType() == self::PRICE_TYPE_DYNAMIC) {
284
- $lineItem->setGrossAmount(self::PRICE_TYPE_DYNAMIC);
 
 
 
 
285
  $lineItem->setDescription($lineItem->getDescription() . " :: Dynamic Price");
286
  return null; // Doesn't show it in the Exactor transaction.
287
  }
@@ -289,8 +295,33 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
289
  return $lineItem;
290
  }
291
 
292
- public function applyDiscountToLineItem(LineItemType &$item, $discountAmount=0){
293
- if ($discountAmount> self::PRICE_TYPE_DYNAMIC){
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
294
  $discountedLine = self::MSG_DISCOUNTED_BY . $discountAmount;
295
  $item->setDescription($item->getDescription() . " ($discountedLine)");
296
  $item->setGrossAmount($item->getGrossAmount() - $discountAmount);
@@ -384,7 +415,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
384
  if ($isEstimation){
385
  // It is possible that postal code or state will be missing on the tax estimation form
386
  // In this case we will try to determine region basing on the given Postal Code
387
- if (strlen(trim($shipToAddress->getStateOrProvince()))== self::PRICE_TYPE_DYNAMIC && strlen(trim($shipToAddress->getPostalCode()))!= self::PRICE_TYPE_DYNAMIC){
388
  $shipToAddress->setStateOrProvince(RegionResolver::getInstance()->getStateOrProvinceByCode(trim($shipToAddress->getPostalCode())));
389
  }
390
  $billingAddress = $shipToAddress;
@@ -476,7 +507,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
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
482
  $magentoItems = $creditMemo->getAllItems();
@@ -539,6 +570,17 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
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();
@@ -547,7 +589,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
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
@@ -588,7 +630,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
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();
@@ -596,6 +638,7 @@ class Exactor_Tax_Helper_Mapping extends Mage_Core_Helper_Abstract {
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
  }
153
  }
154
 
155
  public function getShippingLineItemForQuoteAddress(Mage_Sales_Model_Quote_Address $quoteAddress,
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;
277
  }else{
278
  $lineItem->setSKU($this->getSKUForItem($magentoItem, $merchantSettings));
279
  }
280
+ if (!$this->isDiscountExempt($magentoItem)) {
281
+ $this->applyDiscountToLineItem($lineItem, $magentoItem->getDiscountAmount());
282
+ }
283
  // Check if it is bundle or groped product
284
+ $product = $magentoItem->getProduct();
285
+ if ($product==null) {
286
+ $product = $magentoItem->getOrderItem()->getProduct();
287
+ }
288
+ if (in_array($product->getTypeId(), array(Mage_Catalog_Model_Product_Type::TYPE_BUNDLE))) {
289
+ if ($product->getPriceType() == self::PRICE_TYPE_DYNAMIC) {
290
+ $lineItem->setGrossAmount(0);
291
  $lineItem->setDescription($lineItem->getDescription() . " :: Dynamic Price");
292
  return null; // Doesn't show it in the Exactor transaction.
293
  }
295
  return $lineItem;
296
  }
297
 
298
+ /**
299
+ * @param \Mage_Sales_Model_Quote_Address_Item|\Mage_Sales_Model_Quote_Item $magentoItem
300
+ * @return void
301
+ */
302
+ private function isDiscountExempt($magentoItem){
303
+ try {
304
+ $config = ExactorPluginConfig::getInstance();
305
+ if (!$config->getFeatureConfig()->isFeatureEnabled(EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS)) return false;
306
+ $exempted = $config->get(EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS);
307
+ if ($magentoItem->getOrderItem() != null){
308
+ $magentoItem = $magentoItem->getOrderItem();
309
+ }
310
+ $actual = preg_split('/,/', $magentoItem->getAppliedRuleIds());
311
+ foreach ($actual as $actualId) {
312
+ if (in_array((int)$actualId, $exempted)) {
313
+ return true;
314
+ }
315
+ }
316
+ } catch (Exception $e) {
317
+ // Nothing to do. just log
318
+ $this->logger->error("Error while determining if discount is exempt:", $e->getMessage(), 'isDiscountExempt');
319
+ }
320
+ return false;
321
+ }
322
+
323
+ private function applyDiscountToLineItem(LineItemType &$item, $discountAmount=0){
324
+ if ($discountAmount > 0){
325
  $discountedLine = self::MSG_DISCOUNTED_BY . $discountAmount;
326
  $item->setDescription($item->getDescription() . " ($discountedLine)");
327
  $item->setGrossAmount($item->getGrossAmount() - $discountAmount);
415
  if ($isEstimation){
416
  // It is possible that postal code or state will be missing on the tax estimation form
417
  // In this case we will try to determine region basing on the given Postal Code
418
+ if (strlen(trim($shipToAddress->getStateOrProvince()))==0 && strlen(trim($shipToAddress->getPostalCode()))!=0){
419
  $shipToAddress->setStateOrProvince(RegionResolver::getInstance()->getStateOrProvinceByCode(trim($shipToAddress->getPostalCode())));
420
  }
421
  $billingAddress = $shipToAddress;
507
  $invoiceRequest->setShipFrom($merchantSettings->getExactorShippingAddress());
508
  $invoiceRequest->setCurrencyCode($creditMemo->getOrder()->getOrderCurrencyCode());
509
  $invoiceRequest->setPurchaseOrderNumber($creditMemo->getOrder()->getIncrementId());
510
+ $invoiceRequest->setSaleDate($this->getCreatedAtDateForMageOrder($creditMemo->getOrder()));
511
  $invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
512
  // Line items
513
  $magentoItems = $creditMemo->getAllItems();
570
  return $result;
571
  }
572
 
573
+ private function getCreatedAtDateForMageOrder(Mage_Sales_Model_Order $order, $default='now') {
574
+ $res = $default;
575
+ try{
576
+ $res= '@'.$order->getCreatedAtDate()->getTimestamp();
577
+ } catch (Exception $e) {
578
+ $this->logger->error("Can't get date. Using default value." . $e->getMessage(),
579
+ 'getCreatedAtDateForMageInvoice');
580
+ }
581
+ return new DateTime($res);
582
+ }
583
+
584
  public function buildInvoiceRequestForMagentoInvoice(Mage_Sales_Model_Order_Invoice $invoice, Exactor_Core_Model_MerchantSettings $merchantSettings){
585
  $result = array();
586
  $invoiceRequest = new InvoiceRequestType();
589
  $invoiceRequest->setShipFrom($merchantSettings->getExactorShippingAddress());
590
  $invoiceRequest->setCurrencyCode($invoice->getOrder()->getOrderCurrencyCode());
591
  $invoiceRequest->setPurchaseOrderNumber($invoice->getOrder()->getIncrementId());
592
+ $invoiceRequest->setSaleDate($this->getCreatedAtDateForMageOrder($invoice->getOrder()));
593
  $invoiceRequest->setExemptionId($this->getExemptionIdForOrder($invoice->getOrder(), $merchantSettings));
594
  //$invoiceRequest->setExemptionId($this->getExemptionIdForCreditMemo($creditMemo, $merchantSettings));
595
  // Line items
630
  $invoiceRequest->setShipFrom($merchantSettings->getExactorShippingAddress());
631
  $invoiceRequest->setCurrencyCode($order->getOrderCurrencyCode());
632
  $invoiceRequest->setPurchaseOrderNumber($order->getIncrementId());
633
+ $invoiceRequest->setSaleDate($this->getCreatedAtDateForMageOrder($order));
634
  $invoiceRequest->setExemptionId($this->getExemptionIdForOrder($order, $merchantSettings));
635
  // Line items
636
  $magentoItems = $order->getAllItems();
638
  $exactorLineItem = $this->buildLineItemForMagentoItem($magentoItem, new Mage_Sales_Model_Quote_Address(), $merchantSettings);
639
  if ($exactorLineItem != null){
640
  $exactorLineItem->setQuantity($magentoItem->getQtyOrdered());
641
+ $exactorLineItem->setId(self::INDEXED_LINE_ITEM_ID_PREFIX . $magentoItem->getId());
642
  }
643
  $invoiceRequest->addLineItem($exactorLineItem);
644
  }
app/code/local/Exactor/Tax/etc/config.xml CHANGED
@@ -28,7 +28,7 @@
28
  <config>
29
  <modules>
30
  <Exactor_Tax>
31
- <version>2012.10.19</version>
32
  </Exactor_Tax>
33
  </modules>
34
  <global>
28
  <config>
29
  <modules>
30
  <Exactor_Tax>
31
+ <version>2012.11.02</version>
32
  </Exactor_Tax>
33
  </modules>
34
  <global>
lib/ExactorCommons/ExactorCommons.php CHANGED
@@ -145,13 +145,117 @@ class ExactorLoggingFactory{
145
  {
146
  return $this->logLevel;
147
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
149
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
150
  }
151
 
152
  /* ******************** EXACTOR CONNECTOR ***************************/
153
 
154
- class ExactorConnector{
155
 
156
  private $endpointUrl='';
157
 
145
  {
146
  return $this->logLevel;
147
  }
148
+ }
149
+
150
+ /* ******************************************************************/
151
+
152
+ class ConfigHolder {
153
+ protected $_config;
154
+ public function __construct() {
155
+ $this->_config = array();
156
+ }
157
+
158
+ public function get($property, $default=null){
159
+ if (array_key_exists($property, $this->_config)){
160
+ return $this->_config[$property];
161
+ }
162
+ }
163
+
164
+ public function __sleep()
165
+ {
166
+ return array('_config');
167
+ }
168
+
169
+ public function set($property, $value){
170
+ $this->_config[$property]=$value;
171
+ }
172
+ }
173
+
174
+ class FeatureConfigHolder extends ConfigHolder {
175
+ public function __construct(){
176
+ parent::__construct();
177
+ }
178
+
179
+ public function enableFeature($featureName) {
180
+ $this->set('enable-' . $featureName, "true");
181
+ }
182
+
183
+ public function disableFeature($featureName) {
184
+ $this->set('enable-' . $featureName, "false");
185
+ }
186
+
187
+ public function isFeatureEnabled($featureName) {
188
+ return $this->get('enable-' . $featureName) == "true";
189
+ }
190
+ }
191
+
192
+
193
+ class FeatureConfigManager {
194
+ private $encriptionKey='';
195
 
196
+ /**
197
+ * Decodes config string and returns an object.
198
+ *
199
+ * @param $configString
200
+ * @return FeatureConfigHolder
201
+ */
202
+ public function readConfigFromString($configString) {
203
+ $obj = unserialize(base64_decode(preg_replace("/[\\s\\n]+/","",$configString)));
204
+ if ($obj == false)
205
+ return new FeatureConfigHolder();
206
+ else
207
+ return $obj;
208
+ }
209
+
210
+ /**
211
+ * Returns config encoded as string
212
+ *
213
+ * @param FeatureConfigHolder $config
214
+ * @return string
215
+ */
216
+ public function encodeConfig(FeatureConfigHolder $config){
217
+ $serialized = serialize($config);
218
+ return base64_encode($serialized);
219
+ }
220
+ }
221
+
222
+ class ExactorPluginConfig extends ConfigHolder {
223
+ private static $_instance;
224
+ private $featureConfig;
225
+
226
+ /**
227
+ * @static
228
+ * @return ExactorMagentoConfig
229
+ */
230
+ public static function getInstance(){
231
+ if (!isset(self::$_instance)) {
232
+ $className = __CLASS__;
233
+ self::$_instance = new $className;
234
+ }
235
+ return self::$_instance;
236
+ }
237
 
238
+ public function __construct() {
239
+ $this->config = array();
240
+ $this->featureConfig = new FeatureConfigHolder();
241
+ }
242
+
243
+ public function getFeatureConfig() {
244
+ return $this->featureConfig;
245
+ }
246
+
247
+ public function pushFeatureConfigString($configString) {
248
+ $configManager = new FeatureConfigManager();
249
+ $config = $configManager->readConfigFromString($configString);
250
+ if ($config) {
251
+ $this->featureConfig = $config;
252
+ }
253
+ }
254
  }
255
 
256
  /* ******************** EXACTOR CONNECTOR ***************************/
257
 
258
+ class ExactorConnector {
259
 
260
  private $endpointUrl='';
261
 
lib/ExactorCommons/config.php CHANGED
@@ -4,8 +4,18 @@
4
  * Date: 4/20/12
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
 
 
 
 
 
 
 
4
  * Date: 4/20/12
5
  * Time: 10:36 AM
6
  */
7
+ /* Available config options */
8
+ define('EXACTOR_CONFIG_EXEMPT_DISCOUNTS', 'exempt-descounts');
9
+ define('EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS', 'discount-exemptions');
10
 
11
+ /* Initializing factories */
12
+ ExactorLoggingFactory::getInstance()->setup('MagentoLogger', IExactorLogger::TRACE);
13
+ ExactorConnectionFactory::getInstance()->setup('Magento','v20121112');
14
  ExactorProcessingServiceFactory::getInstance()->setup(new MagentoExactorCallback());
15
 
16
+ /* Initializing configuration object */
17
+ $config = ExactorPluginConfig::getInstance();
18
+ $config->pushFeatureConfigString("TzoxOToiRmVhdHVyZUNvbmZpZ0hvbGRlciI6MTp7czoxMDoiACoAX2NvbmZpZyI7YToxOntzOjI2OiJlbmFibGUtZGlzY291bnQtZXhlbXB0aW9ucyI7czo0OiJ0cnVlIjt9fQ==");
19
+
20
+ /* Pushing parameters */
21
+ $config->set(EXACTOR_CONFIG_FEATURE_EXEMPT_DISCOUNTS, array(1, 2, 3));
package.xml CHANGED
@@ -1,7 +1,7 @@
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,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-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>
1
  <?xml version="1.0"?>
2
  <package>
3
  <name>Mage_Exactor_Tax</name>
4
+ <version>2012.11.12</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-11-12</date>
16
+ <time>17:40:52</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="f35af1e12921b57479cb4b5677937a0c"/><file name="upgrade-2012.06.14-2012.09.25.php" hash="174fda5224bc23cdf147fb059d079478"/></dir></dir></dir><dir name="Sales"><dir name="Model"><file name="Observer.php" hash="f3a499093151b8a29123b7e005bdabea"/></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="89d9e6c612bd51629e63e0537a34bf2c"/></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="6fe61bee324add44f51c36cb5027c29b"/></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="b25d68bc8e7b2dc5f427a4681ff4472c"/><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="f404f3dd010f4247455442f168f9e18b"/></dir></target></contents>
18
  <compatible/>
19
  <dependencies><required><php><min>5.0.0</min><max>6.0.0</max></php></required></dependencies>
20
  </package>