/**
  * Indicates if debug mode is active.
  *
  * @return bool
  */
 protected static function debug_mode()
 {
     if (self::$_debug_mode === null) {
         self::$_debug_mode = \WC_Aelia_CurrencySwitcher::settings()->debug_mode();
     }
     return self::$_debug_mode;
 }
 /**
  * Returns the Currency used in the Country to which a specific IP Address
  * belongs.
  *
  * @param string host A host name or IP Address.
  * @param string default_currency The Currency to use as a default in case the
  * Country currency could not be detected.
  * @return string|bool A currency code, or False if an error occurred.
  */
 public function get_currency_by_host($host, $default_currency)
 {
     $ip2location = WC_Aelia_IP2Location::factory();
     $country_code = $ip2location->get_country_code($host);
     if ($country_code === false) {
         Logger::log(sprintf(__('Could not retrieve Country Code for host "%s". Using ' . 'default currency: %s. Error messages (JSON): %s.', AELIA_CS_PLUGIN_TEXTDOMAIN), $host, $default_currency, json_encode($ip2location->get_errors())));
         return $default_currency;
     }
     $country_currency = $this->get_country_currency($country_code);
     if (WC_Aelia_CurrencySwitcher::settings()->is_currency_enabled($country_currency)) {
         return $country_currency;
     } else {
         return $default_currency;
     }
 }
 /**
  * Displays additional data in the "orders list" page.
  *
  * @param string column The column being displayed.
  */
 public function manage_shop_order_posts_custom_column($column)
 {
     global $post, $woocommerce, $the_order;
     if (empty($the_order) || $the_order->id != $post->ID) {
         $the_order = new Aelia_Order($post->ID);
     }
     switch ($column) {
         case 'order_total':
         case 'total_cost':
             $base_currency = WC_Aelia_CurrencySwitcher::settings()->base_currency();
             /* If order is not in base currency, display order total in base currency
              * before the one in order currency. It's not possible to display it after,
              * because WooCommerce core simply outputs the information and it's not
              * possible to modify it.
              */
             if ($the_order->get_order_currency() != $base_currency) {
                 $order_total_base_currency = WC_Aelia_CurrencySwitcher::instance()->format_price($the_order->get_total_in_base_currency(), $base_currency);
                 echo '<div class="order_total_base_currency" title="' . __('Order total in base currency (estimated)', AELIA_CS_PLUGIN_TEXTDOMAIN) . '">';
                 echo '(' . esc_html(strip_tags($order_total_base_currency)) . ')';
                 echo '</div>';
             }
             break;
     }
 }
 /**
  * Class constructor.
  *
  * @param array An array of Settings that can be used to override the ones
  * currently saved in the configuration.
  * @return WC_Aelia_OpenExchangeRatesModel.
  */
 public function __construct($settings = null)
 {
     parent::__construct($settings);
     // API Key is necessary for the Model to work correctly
     $this->_api_key = get_value(WC_Aelia_CurrencySwitcher_Settings::FIELD_OPENEXCHANGE_API_KEY, $settings, WC_Aelia_CurrencySwitcher::settings()->current_settings(WC_Aelia_CurrencySwitcher_Settings::FIELD_OPENEXCHANGE_API_KEY));
     if (empty($this->_api_key)) {
         throw new Exception(__('Open Exchange API Key has not been entered. Service cannot be used ' . 'without such key. See http://openexchangerates.org/ for more details.', AELIA_CS_PLUGIN_TEXTDOMAIN));
     }
 }
 * variation. In such case, we load it ourselves.
 */
if (!function_exists('woocommerce_wp_text_input')) {
    global $woocommerce;
    if (version_compare($woocommerce->version, '2.1', '<')) {
        require_once $woocommerce->plugin_path . '/admin/post-types/writepanels/writepanels-init.php';
    }
}
echo '<tr>';
echo '<td colspan="2">';
// This view is designed to be loaded by an instance of
// WC_Aelia_CurrencyPrices_Manager. Such instance is what "$this" and "self"
// refer to.
$currencyprices_manager = $this;
$enabled_currencies = $currencyprices_manager->enabled_currencies();
$base_currency = WC_Aelia_CurrencySwitcher::settings()->base_currency();
$post_id = $currencyprices_manager->current_post->ID;
$loop = $currencyprices_manager->loop_idx;
echo '<div id="wc_aelia_cs_product_prices" class="clearfix hide_if_variable-subscription">';
// Display header of currency pricing section
include 'product_currencyprices_header.php';
echo '<div id="regular_prices">';
$product_regular_prices = $currencyprices_manager->get_variation_regular_prices($post_id);
// Outputs the Product Variation prices in the different Currencies
foreach ($enabled_currencies as $currency) {
    if ($currency == $base_currency) {
        continue;
    }
    woocommerce_wp_text_input(array('id' => WC_Aelia_CurrencyPrices_Manager::FIELD_VARIABLE_REGULAR_CURRENCY_PRICES . "[{$loop}][{$currency}]", 'class' => 'wc_input_price short', 'label' => __('Regular Price', 'woocommerce') . ' (' . get_woocommerce_currency_symbol($currency) . ')', 'type' => 'number', 'value' => get_value($currency, $product_regular_prices, null), 'placeholder' => __('Auto', AELIA_CS_PLUGIN_TEXTDOMAIN), 'custom_attributes' => array('step' => 'any', 'min' => '0')));
}
echo '</div>';
 /**
  * Returns the instance of the settings controller loaded by the plugin.
  *
  * @return WC_Aelia_CurrencySwitcher_Settings
  */
 protected function settings_controller()
 {
     return WC_Aelia_CurrencySwitcher::settings();
 }
 /**
  * Convenience method. Returns an array of the Enabled Currencies.
  *
  * @return array
  */
 protected function enabled_currencies()
 {
     return WC_Aelia_CurrencySwitcher::settings()->get_enabled_currencies();
 }
 /**
  * Returns an array of Currency => Currency Name pairs.
  *
  * @return array An array of Currency => Currency Name pairs.
  */
 protected function get_currency_options()
 {
     $result = array();
     $settings_controller = WC_Aelia_CurrencySwitcher::settings();
     $enabled_currencies = $settings_controller->get_enabled_currencies();
     $exchange_rates = $settings_controller->get_exchange_rates();
     $woocommerce_currencies = get_woocommerce_currencies();
     foreach ($enabled_currencies as $currency) {
         // Display only Currencies supported by WooCommerce
         if (($currency_name = get_value($currency, $woocommerce_currencies, false)) != false) {
             // Display only currencies with a valid Exchange Rate
             if (get_value($currency, $exchange_rates, 0) > 0) {
                 $result[$currency] = $currency_name;
             } else {
                 $this->misconfigured_currencies = true;
             }
         }
     }
     return $result;
 }
 /**
  * Calculate order items totals and taxes in base currency for all orders.
  * This method adds the line totals in base currency for all the order items
  * created before Currency Switcher 3.2.11.140227 was installed.
  *
  * @return bool
  */
 protected function update_to_3_3_7_140611()
 {
     $price_decimals = WC_Aelia_CurrencySwitcher::settings()->price_decimals($this->settings->base_currency());
     // Retrieve the order items for which the values in base currencies will be
     // added/updated
     $SQL = $this->wpdb->prepare("\r\n\t\t\tINSERT INTO {$this->wpdb->prefix}woocommerce_order_itemmeta (\r\n\t\t\t\torder_item_id\r\n\t\t\t\t,meta_key\r\n\t\t\t\t,meta_value\r\n\t\t\t)\r\n\t\t\tSELECT\r\n\t\t\t\tLINE_ITEMS_DATA.order_item_id\r\n\t\t\t\t,LINE_ITEMS_DATA.order_item_meta_key_base_currency\r\n\t\t\t\t,LINE_ITEMS_DATA.meta_value_base_currency\r\n\t\t\tFROM (\r\n\t\t\t\t-- Fetch all line items for whom the totals in base currency have not been saved yet\r\n\t\t\t\tSELECT\r\n\t\t\t\t\tposts.ID AS order_id\r\n\t\t\t\t\t,meta_order_base_currency.meta_value / meta_order.meta_value as exchange_rate\r\n\t\t\t\t\t,WCOI.order_item_id\r\n\t\t\t\t\t,WCOI.order_item_type\r\n\t\t\t\t\t,WCOIM.meta_key\r\n\t\t\t\t\t,WCOIM.meta_value\r\n\t\t\t\t\t,CONCAT(WCOIM.meta_key, '_base_currency') AS order_item_meta_key_base_currency\r\n\t\t\t\t\t,ROUND(WCOIM.meta_value * (meta_order_base_currency.meta_value / meta_order.meta_value), %d) AS meta_value_base_currency\r\n\t\t\t\tFROM\r\n\t\t\t\t\t{$this->wpdb->posts} AS posts\r\n\t\t\t\tJOIN\r\n\t\t\t\t\t{$this->wpdb->postmeta} AS meta_order ON\r\n\t\t\t\t\t\t(meta_order.post_id = posts.ID) AND\r\n\t\t\t\t\t\t(meta_order.meta_key IN ('_order_total'))\r\n\t\t\t\tLEFT JOIN\r\n\t\t\t\t\t{$this->wpdb->postmeta} AS meta_order_base_currency ON\r\n\t\t\t\t\t\t(meta_order_base_currency.post_id = posts.ID) AND\r\n\t\t\t\t\t\t(meta_order_base_currency.meta_key = CONCAT(meta_order.meta_key, '_base_currency')) AND\r\n\t\t\t\t\t\t(meta_order_base_currency.meta_value > 0)\r\n\t\t\t\tLEFT JOIN\r\n\t\t\t\t\t{$this->wpdb->postmeta} AS meta_order_currency ON\r\n\t\t\t\t\t\t(meta_order_currency.post_id = posts.ID) AND\r\n\t\t\t\t\t\t(meta_order_currency.meta_key = '_order_currency')\r\n\t\t\t\tLEFT JOIN\r\n\t\t\t\t\t{$this->wpdb->term_relationships} AS rel ON\r\n\t\t\t\t\t\t(rel.object_ID = posts.ID)\r\n\t\t\t\tLEFT JOIN\r\n\t\t\t\t\t{$this->wpdb->term_taxonomy} AS taxonomy ON\r\n\t\t\t\t\t\t(taxonomy.term_taxonomy_id = rel.term_taxonomy_id)\r\n\t\t\t\tLEFT JOIN\r\n\t\t\t\t\t{$this->wpdb->terms} AS term ON\r\n\t\t\t\t\t\t(term.term_id = taxonomy.term_id)\r\n\t\t\t\t-- Order items\r\n\t\t\t\tJOIN\r\n\t\t\t\t\t{$this->wpdb->prefix}woocommerce_order_items WCOI ON\r\n\t\t\t\t\t\t(WCOI.order_id = posts.ID)\r\n\t\t\t\tJOIN\r\n\t\t\t\t\t{$this->wpdb->prefix}woocommerce_order_itemmeta WCOIM ON\r\n\t\t\t\t\t\t(WCOIM.order_item_id = WCOI.order_item_id) AND\r\n\t\t\t\t\t\t(WCOIM.meta_key IN ('_line_subtotal',\r\n\t\t\t\t\t\t\t\t\t\t\t'_line_subtotal_tax',\r\n\t\t\t\t\t\t\t\t\t\t\t'_line_tax',\r\n\t\t\t\t\t\t\t\t\t\t\t'_line_total',\r\n\t\t\t\t\t\t\t\t\t\t\t'tax_amount',\r\n\t\t\t\t\t\t\t\t\t\t\t'shipping_tax_amount'))\r\n\t\t\t\tLEFT JOIN\r\n\t\t\t\t\t{$this->wpdb->prefix}woocommerce_order_itemmeta WCOIM_TOUPDATE ON\r\n\t\t\t\t\t\t(WCOIM_TOUPDATE.order_item_id = WCOIM.order_item_id) AND\r\n\t\t\t\t\t\t(WCOIM_TOUPDATE.meta_key = CONCAT(WCOIM.meta_key, '_base_currency'))\r\n\t\t\t\tWHERE\r\n\t\t\t\t\t(WCOIM_TOUPDATE.meta_value IS NULL) AND\r\n\t\t\t\t\t(posts.post_type = 'shop_order') AND\r\n\t\t\t\t\t(meta_order.meta_key = '_order_total') AND\r\n\t\t\t\t\t(meta_order.meta_value IS NOT NULL) AND\r\n\t\t\t\t\t(meta_order_base_currency.meta_value IS NOT NULL)\r\n\t\t\t) AS LINE_ITEMS_DATA;\r\n\t\t", $price_decimals);
     //var_dump($SQL);die();
     $this->add_message(E_USER_NOTICE, __('Recalculating line totals in base currency...'));
     $rows_affected = $this->exec($SQL);
     // Debug
     //var_dump($order_items_to_update);die();
     if ($rows_affected === false) {
         $this->add_message(E_USER_ERROR, __('Failed. Please check PHP error log for error messages ' . 'related to the operation.'));
         return false;
     } else {
         $this->add_message(E_USER_NOTICE, sprintf(__('Done. %s rows affected.'), $rows_affected));
     }
     return true;
 }