Skip to content
Code-Schnipsel Gruppen Projekte
Currency.js 8,11 KiB
Newer Older
  • Learn to ignore specific revisions
  • Henning Leutz's avatar
    Henning Leutz committed
    /**
     * Currency Handler
     *
    
    Henning Leutz's avatar
    Henning Leutz committed
     * @module package/quiqqer/currency/bin/Currency
     * @author wwww.pcsg.de (Henning Leutz)
    
    Henning Leutz's avatar
    Henning Leutz committed
     */
    define('package/quiqqer/currency/bin/Currency', [
    
        'qui/QUI',
    
    Henning Leutz's avatar
    Henning Leutz committed
        'qui/classes/DOM',
    
        'Ajax',
        'package/quiqqer/currency/bin/classes/BulkConverting'
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
    ], function (QUI, QUIDOM, QUIAjax, BulkConverting) {
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
        let Converter = null;
        let def = 'EUR';
    
        let SYSTEM_CURRENCY = '';
    
        let getCurrenciesFetch = false;
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
        // package_quiqqer_currency_ajax_setUserCurrency
    
        if (typeof window.DEFAULT_CURRENCY !== 'undefined') {
    
            def = window.DEFAULT_CURRENCY;
    
            SYSTEM_CURRENCY = def;
    
    Henning Leutz's avatar
    Henning Leutz committed
        }
    
    
        if (typeof window.DEFAULT_USER_CURRENCY !== 'undefined') {
    
            def = window.DEFAULT_USER_CURRENCY.code;
    
            SYSTEM_CURRENCY = def;
    
        const Currencies = new Class({
    
    
    Henning Leutz's avatar
    Henning Leutz committed
            Extends: QUIDOM,
    
            Type: 'package/quiqqer/currency/bin/Currency',
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            initialize: function (options) {
    
    Henning Leutz's avatar
    Henning Leutz committed
                this.parent(options);
    
    
                this.$currency = def;
                this.$currencies = {};
    
    Patrick Müller's avatar
    Patrick Müller committed
                this.$currencyTypes = [];
    
    
                if (SYSTEM_CURRENCY !== this.$currency) {
                    this.fireEvent('change', [
                        this,
                        this.$currency
                    ]);
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
            },
    
            /**
             * Change the global currency
             *
             * @param {String} currencyCode
             */
    
            setCurrency: function (currencyCode) {
                this.getCurrencies().then(function (currencies) {
                    const found = currencies.find(function (Currency) {
    
                        return Currency.code === currencyCode;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
    
                    if (found) {
                        this.$currency = found.code;
    
                        this.fireEvent('change', [
                            this,
                            found.code
                        ]);
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }
                }.bind(this));
            },
    
            /**
    
             * Return the data of a wanted currency
    
    Henning Leutz's avatar
    Henning Leutz committed
             *
    
             * @param {String} [currencyCode] - optional, default = current currency
    
    Patrick Müller's avatar
    Patrick Müller committed
             * @param {Boolean} [refresh] - Refresh data from database
    
    Henning Leutz's avatar
    Henning Leutz committed
             * @return {Promise}
             */
    
            getCurrency: function (currencyCode, refresh) {
    
                currencyCode = currencyCode || this.$currency;
    
                refresh = refresh || false;
    
    Patrick Müller's avatar
    Patrick Müller committed
    
                if (refresh) {
                    return new Promise((resolve, reject) => {
                        QUIAjax.get('package_quiqqer_currency_ajax_getCurrency', resolve, {
                            'package': 'quiqqer/currency',
    
                            currency: currencyCode,
                            onError: reject
    
    Patrick Müller's avatar
    Patrick Müller committed
                        });
                    });
                }
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                return new Promise((resolve, reject) => {
                    this.getCurrencies().then((currencies) => {
                        const found = currencies.find((Currency) => {
    
                            return Currency.code === currencyCode;
    
    Henning Leutz's avatar
    Henning Leutz committed
                        });
    
                        if (found) {
                            return resolve(found);
                        }
    
    
                        return reject('Currency is not supported. ' + currencyCode);
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Return all available currencies
             *
             * @returns {Promise}
             */
    
            getCurrencies: function () {
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (Object.getLength(this.$currencies)) {
                    return Promise.resolve(this.$currencies);
                }
    
    
                if (getCurrenciesFetch) {
                    return new Promise((resolve) => {
                        (() => {
                            this.getCurrencies().then(resolve);
                        }).delay(50);
                    });
                }
    
                getCurrenciesFetch = true;
    
    
                return new Promise((resolve, reject) => {
    
    Patrick Müller's avatar
    Patrick Müller committed
                    QUIAjax.get('package_quiqqer_currency_ajax_getAllowedCurrencies', (result) => {
    
                        this.$currencies = result;
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                        resolve(this.$currencies);
    
    
                        getCurrenciesFetch = false;
    
    Henning Leutz's avatar
    Henning Leutz committed
                    }, {
                        'package': 'quiqqer/currency',
    
                        onError: reject
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
                });
            },
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
            /**
             * Return all available currency types.
             *
             * @returns {Promise}
             */
            getDefaultCurrency: function () {
                if (SYSTEM_CURRENCY !== '') {
                    return Promise.resolve(SYSTEM_CURRENCY);
                }
    
                return new Promise((resolve, reject) => {
                    QUIAjax.get('package_quiqqer_currency_ajax_getDefault', (result) => {
                        SYSTEM_CURRENCY = result.code;
                        resolve(result.code);
                    }, {
                        'package': 'quiqqer/currency',
                        onError: reject
                    });
                });
            },
    
    
    Patrick Müller's avatar
    Patrick Müller committed
            /**
             * Return all available currency types.
             *
             * @returns {Promise<Array>}
             */
    
            getCurrencyTypes: function () {
    
    Patrick Müller's avatar
    Patrick Müller committed
                if (this.$currencyTypes.length) {
                    return Promise.resolve(this.$currencyTypes);
                }
    
                return new Promise((resolve, reject) => {
                    QUIAjax.get('package_quiqqer_currency_ajax_getCurrencyTypes', (result) => {
                        this.$currencyTypes = result;
                        resolve(this.$currencyTypes);
                    }, {
                        'package': 'quiqqer/currency',
    
                        onError: reject
    
    Henning Leutz's avatar
    Henning Leutz committed
            /**
             * Convert an amount, the result is without the currency sign
             *
             * @param {Number} amount
             * @param {String} currencyFrom
             * @param {String} currencyTo
             * @returns {Promise}
             */
    
            convert: function (amount, currencyFrom, currencyTo) {
    
                currencyTo = currencyTo || this.$currency;
    
    Henning Leutz's avatar
    Henning Leutz committed
                currencyFrom = currencyFrom || this.$currency;
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                return new Promise((resolve) => {
    
    Patrick Müller's avatar
    Patrick Müller committed
                    QUIAjax.get('package_quiqqer_currency_ajax_convert', resolve, {
    
                        'package': 'quiqqer/currency',
                        amount: amount,
    
    Henning Leutz's avatar
    Henning Leutz committed
                        currencyFrom: currencyFrom,
    
                        currencyTo: currencyTo
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
                });
            },
    
            /**
             * Convert an amount, the result is with the currency sign
             *
             * @param {Number} amount
             * @param {String} currencyFrom
             * @param {String} currencyTo
             * @returns {Promise}
             */
    
            convertWithSign: function (amount, currencyFrom, currencyTo) {
    
                currencyTo = currencyTo || this.$currency;
    
    Henning Leutz's avatar
    Henning Leutz committed
                currencyFrom = currencyFrom || this.$currency;
    
    Henning Leutz's avatar
    Henning Leutz committed
    
    
                if (typeof currencyTo === 'object' && typeof currencyTo.code !== 'undefined') {
                    currencyTo = currencyTo.code;
                }
    
                if (typeof currencyFrom === 'object' && typeof currencyFrom.code !== 'undefined') {
                    currencyFrom = currencyFrom.code;
                }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                if (!amount) {
                    amount = 0;
                }
    
    
                if (!Converter) {
                    Converter = new BulkConverting();
                }
    
                if (Converter.isRunning() === false) {
                    Converter.removeEvents('onDone');
                }
    
    
                Converter.add(amount, currencyFrom, currencyTo);
    
    
                return new Promise((resolve) => {
                    Converter.addEvent('onDone', (Cnv, result) => {
    
                        let i = 0, len = result.length;
    
                        for (; i < len; i++) {
    
                            if (result[i].amount == amount &&
                                result[i].from === currencyFrom &&
                                result[i].to === currencyTo) {
                                break;
                            }
                        }
    
                        if (typeof result[i] === 'undefined' || typeof result[i].converted === 'undefined') {
                            return;
                        }
    
    
    Henning Leutz's avatar
    Henning Leutz committed
                    });
                });
            }
    
    Henning Leutz's avatar
    Henning Leutz committed
        });
    
        return new Currencies();
    
    Henning Leutz's avatar
    Henning Leutz committed
    });