/**
  * Test scenario for issue #13712: Multiprice datatype shows wrong price after multiple calls in template
  *
  * Test Outline
  * ------------
  * 1. Create a euro currency
  * 2. Create a VAT type of 10 %
  * 3. Create a content class with an attribute of the datatype ezmultiprice
  * 4. Create a content object of this content class and set a custom price ex. VAT with the VAT type of 10% that we created
  * 5. Subsequently retrieve the attribute 'inc_vat_price_list'
  *
  * @result: the returned eZMultiPriceData instances differ on each call, their values are increased each time with VAT
  * @expected: the returned eZMultiPriceData instances are equal
  * @link http://issues.ez.no/13712
  * @group issue_13712
  */
 public function testMultipleCallsToCalculatedPrice()
 {
     $currencyCode = 'EUR';
     // create currency
     $currencyParams = array('code' => $currencyCode, 'symbol' => false, 'locale' => 'eng-GB', 'custom_rate_value' => 0, 'rate_factor' => 1);
     $currency = eZCurrencyData::create($currencyCode, '€', 'eng-GB', 0, 0, 1);
     $currency->store();
     $currencyID = $currency->attribute('id');
     $this->assertInternalType('integer', $currencyID);
     // create VAT type
     $row = array('name' => 'Test', 'percentage' => 10.0);
     $vatType = new eZVatType($row);
     $vatType->store();
     $vatTypeID = $vatType->attribute('id');
     $this->assertInternalType('integer', $vatTypeID);
     $class = eZContentClass::create(false, array('name' => 'eZMultiPrice::testMultipleCallsToCalculatedPrice', 'identifier' => 'ezmultiprice_test'));
     $class->store();
     $classID = $class->attribute('id');
     $this->assertInternalType('integer', $classID);
     $attributes = $class->fetchAttributes();
     // add class attributes
     $newAttribute = eZContentClassAttribute::create($classID, 'ezmultiprice', array('name' => 'Test', 'identifier' => 'test'));
     $dataType = $newAttribute->dataType();
     $dataType->initializeClassAttribute($newAttribute);
     $newAttribute->setAttribute(eZMultiPriceType::DEFAULT_CURRENCY_CODE_FIELD, $currencyCode);
     $newAttribute->setAttribute(eZMultiPriceType::VAT_ID_FIELD, $vatTypeID);
     $newAttribute->store();
     $attributes[] = $newAttribute;
     $class->storeDefined($attributes);
     $contentObject = $class->instantiate();
     $version = $contentObject->currentVersion();
     $dataMap = $version->dataMap();
     $multiPrice = $dataMap['test']->content();
     $multiPrice->setAttribute('selected_vat_type', $vatTypeID);
     $multiPrice->setAttribute('is_vat_included', eZMultiPriceType::EXCLUDED_VAT);
     $multiPrice->setCustomPrice($currencyCode, 100);
     $multiPrice->updateAutoPriceList();
     $dataMap['test']->setContent($multiPrice);
     $dataMap['test']->setAttribute('data_text', $vatTypeID . ',' . eZMultiPriceType::EXCLUDED_VAT);
     $dataMap['test']->store();
     // test values
     $firstIncVatPriceList = $multiPrice->attribute('inc_vat_price_list');
     $this->assertArrayHasKey('EUR', $firstIncVatPriceList);
     $firstCallValue = $firstIncVatPriceList['EUR']->attribute('value');
     $secondIncVatPriceList = $multiPrice->attribute('inc_vat_price_list');
     $this->assertArrayHasKey('EUR', $secondIncVatPriceList);
     $secondCallValue = $secondIncVatPriceList['EUR']->attribute('value');
     $this->assertEquals($firstCallValue, $secondCallValue);
     $thirdIncVatPriceList = $multiPrice->attribute('inc_vat_price_list');
     $this->assertArrayHasKey('EUR', $thirdIncVatPriceList);
     $thirdCallValue = $thirdIncVatPriceList['EUR']->attribute('value');
     $this->assertEquals($firstCallValue, $thirdCallValue);
 }
Example #2
0
 static function updateAutoRates()
 {
     $error = array('code' => eZExchangeRatesUpdateHandler::OK, 'description' => '');
     $handler = eZExchangeRatesUpdateHandler::create();
     if ($handler) {
         $error = $handler->requestRates();
         if ($error['code'] === eZExchangeRatesUpdateHandler::OK) {
             $rateList = $handler->rateList();
             if (is_array($rateList) && count($rateList) > 0) {
                 $handlerBaseCurrency = $handler->baseCurrency();
                 if ($handlerBaseCurrency) {
                     $shopBaseCurrency = false;
                     $shopINI = eZINI::instance('shop.ini');
                     if ($shopINI->hasVariable('ExchangeRatesSettings', 'BaseCurrency')) {
                         $shopBaseCurrency = $shopINI->variable('ExchangeRatesSettings', 'BaseCurrency');
                     }
                     if (!$shopBaseCurrency) {
                         $shopBaseCurrency = $handlerBaseCurrency;
                     }
                     // update rates for existing currencies
                     //$baseCurrencyCode = $handler->baseCurrency();
                     if (isset($rateList[$shopBaseCurrency]) || $shopBaseCurrency === $handlerBaseCurrency) {
                         // to avoid unnecessary multiplication set $crossBaseRate to 'false';
                         $crossBaseRate = false;
                         if ($shopBaseCurrency !== $handlerBaseCurrency) {
                             $crossBaseRate = 1.0 / (double) $rateList[$shopBaseCurrency];
                             $rateList[$handlerBaseCurrency] = '1.0000';
                         }
                         $currencyList = eZCurrencyData::fetchList();
                         if (is_array($currencyList) && count($currencyList) > 0) {
                             foreach ($currencyList as $currency) {
                                 $rateValue = false;
                                 $currencyCode = $currency->attribute('code');
                                 if (isset($rateList[$currencyCode])) {
                                     $rateValue = $rateList[$currencyCode];
                                     if ($crossBaseRate !== false) {
                                         $rateValue *= $crossBaseRate;
                                     }
                                 } else {
                                     if ($currencyCode === $shopBaseCurrency) {
                                         $rateValue = '1.0000';
                                     }
                                 }
                                 $currency->setAttribute('auto_rate_value', $rateValue);
                                 $currency->sync();
                             }
                         }
                         $error['code'] = eZExchangeRatesUpdateHandler::OK;
                         $error['description'] = ezpI18n::tr('kernel/shop', "'Auto' rates were updated successfully.");
                     } else {
                         $error['code'] = eZExchangeRatesUpdateHandler::INVALID_BASE_CROSS_RATE;
                         $error['description'] = ezpI18n::tr('kernel/shop', "Unable to calculate cross-rate for currency-pair '%1'/'%2'", null, array($handlerBaseCurrency, $shopBaseCurrency));
                     }
                 } else {
                     $error['code'] = eZExchangeRatesUpdateHandler::UNKNOWN_BASE_CURRENCY;
                     $error['description'] = ezpI18n::tr('kernel/shop', 'Unable to determine currency for retrieved rates.');
                 }
             } else {
                 $error['code'] = eZExchangeRatesUpdateHandler::EMPTY_RATE_LIST;
                 $error['description'] = ezpI18n::tr('kernel/shop', 'Retrieved empty list of rates.');
             }
         }
     } else {
         $error['code'] = eZExchangeRatesUpdateHandler::CANT_CREATE_HANDLER;
         $error['description'] = ezpI18n::tr('kernel/shop', 'Unable to create handler to update auto rates.');
     }
     if ($error['code'] !== eZExchangeRatesUpdateHandler::OK) {
         eZDebug::writeError($error['description'], __METHOD__);
     }
     return $error;
 }
    function currencyList()
    {
        if ( !isset( $this->CurrencyList ) )
        {
            $this->CurrencyList = eZCurrencyData::fetchList();
        }

        return $this->CurrencyList;
    }
    function fetchCurrency( $code )
    {
        $currency = eZCurrencyData::fetch( $code );
        if ( is_object( $currency ) )
            $result = array( 'result' => $currency );
        else
            $result = array( 'result' => false );

        return $result;
    }
 function setStatus($status)
 {
     $statusNumeric = eZCurrencyData::statusStringToNumeric($status);
     if ($statusNumeric !== false) {
         $this->setAttribute('status', $statusNumeric);
     } else {
         eZDebug::writeError("Unknow currency's status '{$status}'", __METHOD__);
     }
 }
Example #6
0
    if ($error['code'] != 0) {
        $error['style'] = 'message-error';
    } else {
        $error['style'] = 'message-feedback';
    }
}
switch (eZPreferences::value('currencies_list_limit')) {
    case '2':
        $limit = 25;
        break;
    case '3':
        $limit = 50;
        break;
    default:
        $limit = 10;
        break;
}
// fetch currencies
$currencyList = eZCurrencyData::fetchList(null, true, $offset, $limit);
$currencyCount = eZCurrencyData::fetchListCount();
$viewParameters = array('offset' => $offset);
$tpl = eZTemplate::factory();
$tpl->setVariable('currency_list', $currencyList);
$tpl->setVariable('currency_list_count', $currencyCount);
$tpl->setVariable('limit', $limit);
$tpl->setVariable('view_parameters', $viewParameters);
$tpl->setVariable('show_error_message', $error !== false);
$tpl->setVariable('error', $error);
$Result = array();
$Result['path'] = array(array('text' => ezpI18n::tr('kernel/shop', 'Available currency list'), 'url' => false));
$Result['content'] = $tpl->fetch("design:shop/currencylist.tpl");
 function checkCurrency($orderID)
 {
     $returnStatus = array('status' => eZModuleOperationInfo::STATUS_CONTINUE);
     $order = eZOrder::fetch($orderID);
     $productCollection = $order->attribute('productcollection');
     $currencyCode = $productCollection->attribute('currency_code');
     $currencyCode = trim($currencyCode);
     if ($currencyCode == '') {
         $returnStatus = array('status' => eZModuleOperationInfo::STATUS_CANCELLED);
     }
     $locale = eZLocale::instance();
     $localeCurrencyCode = $locale->currencyShortName();
     // Reverse logic to avoid calling eZCurrencyData::currencyExists() if the first expression is true.
     if (!($currencyCode == $localeCurrencyCode or eZCurrencyData::currencyExists($currencyCode))) {
         $returnStatus = array('status' => eZModuleOperationInfo::STATUS_CANCELLED);
     }
     return $returnStatus;
 }
                    }
                }
            } else {
                $error = eZCurrencyData::errorMessage($errCode);
            }
        }
    }
}
$pathText = '';
if (strlen($originalCurrencyCode) > 0) {
    // going to edit existing currency
    $pathText = ezpI18n::tr('kernel/shop', 'Edit currency');
    if ($currencyParams['code'] === false) {
        // first time in 'edit' mode? => initialize template variables
        // with existing data.
        $currency = eZCurrencyData::fetch($originalCurrencyCode);
        if (is_object($currency)) {
            $currencyParams['code'] = $currency->attribute('code');
            $currencyParams['symbol'] = $currency->attribute('symbol');
            $currencyParams['locale'] = $currency->attribute('locale');
            $currencyParams['custom_rate_value'] = $currency->attribute('custom_rate_value');
            $currencyParams['rate_factor'] = $currency->attribute('rate_factor');
        } else {
            $error = "'{$originalCurrencyCode}' currency  doesn't exist.";
            $canEdit = false;
        }
    }
} else {
    // going to create new currency
    $pathText = ezpI18n::tr('kernel/shop', 'Create new currency');
}
function currencyForLocale($localeString = false)
{
    global $cli;
    global $currencyList;
    $currency = false;
    if ($currencyList === false) {
        $currencyList = eZCurrencyData::fetchList();
    }
    $locale = eZLocale::instance($localeString);
    if (is_object($locale)) {
        // get currency
        if ($currencyCode = $locale->currencyShortName()) {
            if (!isset($currencyList[$currencyCode])) {
                $cli->warning("Currency '{$currencyCode}' doesn't exist");
                $cli->notice("Creating currency '{$currencyCode}'... ", false);
                $currencySymbol = $locale->currencySymbol();
                $localeCode = $locale->localeFullCode();
                if ($currency = eZCurrencyData::create($currencyCode, $currencySymbol, $localeCode, '0.00000', '1.00000', '0.00000')) {
                    $cli->output('Ok');
                    $currency->store();
                    $currencyList[$currencyCode] = $currency;
                } else {
                    $cli->error('Failed');
                }
            } else {
                $currency = $currencyList[$currencyCode];
            }
        } else {
            $cli->error("Unable to find currency code for the '{$localeString}' locale");
        }
    } else {
        $cli->error("Unable to find '{$localeString}' locale");
    }
    return $currency;
}