Добрый день!

В работе столкнулись с такой проблемой, как некорректная конвертация валютных платежей. В справочники курс валют были загружены курсы валют помесячно за период с 2009 по 2020 год. Далее мы произвели импорт платежей с помощью Excel за период с 2009 по январь 2020 г.

Обратили внимание что платеж, в карточке Платежа отражается по курсу, который соответствует Дате создания записи в системе. Т.е. в том случае когда загружаются платежи за ранние периоды, конвертация курса валют не учитывает дату платежа (хотя правильная логика - это конвертировать валютный платеж по курсу, соответствующему дате платежа). 

Выяснили что, в методе setCurrencyRate используется коробочный метод LoadCurrencyRate модуля MoneyModule, в который передается текущая дата платежа (т.е. дата создания записи в системе) Т.о. если импорт платежей был создан в системе в январе 2020 года, но, например - дата импортируемого платежа за ноябрь 2009 года, то платеж будет конвертироваться по курсу января 2020 года.

Возникает вопрос: почему логика опирается на дату создания записи, а не на дату фактического платежа?

Можно ли изменить логику в методе LoadCurrencyRate модуля MoneyModule?

 

Нравится

1 комментарий

Судя по коду, LoadCurrencyRate  получает дату извне в параметре, а заполняет её функция setCurrencyRate на конкретной карточке. Видимо, у Вас в ней берётся дата не из того поля. Нужно менять там, а не в MoneyModule.

/**
 * Calls onLoadCurrencyRate and sets specified currencyRateAttribute if currencyAttribute isn't empty.
 * @param currencyAttribute - Currency attribute.
 * @param currencyRateAttribute - Currency rate attribute.
 * @param startDate - Currency start date.
 * @param {function} callback
 */
moneyModule.LoadCurrencyRate = function(currencyAttribute, currencyRateAttribute, startDate, callback) {
	var currency = this.get(currencyAttribute);
	if (Ext.isEmpty(currency)) {
		return;
	}
	moneyModule.self.onLoadCurrencyRate.call(this, currency.value, startDate,
		function(item) {
			this.set(currencyRateAttribute, item.Rate);
			if (callback) {
				callback.call(this);
			}
		}, function() {
			this.set(currencyRateAttribute, null);
		});
};

Не вижу раздела «Платежи», видимо, он разработан в ходе проекта или переименован. Как называется схема карточки?

Мультивалютное поле работает с теми данными, которые есть в связанных с ним полях объекта: сумма, сумма в базовой валюте, выбранная валюта и курс. Вам нужно, чтобы уже при заливке были корректные данные во всех этих полях.

Показать все комментарии

Вниманию предлагается набор функций для загрузки в Terrasoft 3.X актуального курса доллара к гривне по версии Нацбанка Украины. Можно получать как официальный, так и средневзвешенный рыночный курс.
 Национальный банк Украины

Функция непосредственного получения курса. Если входной параметр true – получает официальный курс, если false или без параметра – средневзвешенный.

Результат - объект с двумя полями. Rate – количество украинских гривен за 1 доллар США (например, 7.993). Date – указанная на сайте дата этого курса. Для официального – следующий рабочий день, для среднего – предыдущий.

function GetUSDRate(IsOfficial) {
        try {
            var Result = new Object();
                var webAddress = 'http://bank.gov.ua/control/uk/index';
                var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
                xmlHttpReq.open("GET", webAddress, false);        
            xmlHttpReq.send();
            var HtmlText = xmlHttpReq.responseText.replace(/\s/g, "");
            if (IsOfficial) {
                var BeginText = '100 ДоларівСША';
                var EndText = '100 Євро';
               
                } else {
                        var BeginText = '
грн.за100доларівСША';
                        var EndText =  '
Детальніше...';
                }

                var BeginIndex = HtmlText.indexOf(BeginText)+ BeginText.length;
                var EndIndex = HtmlText.indexOf(EndText);
            var HtmlFragment = HtmlText.substring(BeginIndex, EndIndex);
                var Rate = parseFloat(HtmlFragment);
                if (isNaN(Rate)) {
                        Log.Write(2, 'Ошибка при получении курса Нацбанка');
                        return null;
                }
                Result.Rate = Rate/100;
            if (IsOfficial) {          
                BeginText = 'Офіційнийкурсгривнідоіноземнихвалютз14.00';
                EndText = '';
                } else {
                    BeginText = 'Середньозваженийкурснаміжбанківськомуринку(начасвстановленняофіційногокурсугривні)
';
                    EndText = '

Нравится

Поделиться

4 комментария

Александр, спасибо!
Правильно ли я понимаю, что функция рассчитана на текущую разметку официального сайта НБУ и Вы будете следить за ее изменениями, внося соответствующие правки в свое решение?

Да, так и есть. У НБУ, в отличие от ЦБРФ, нет публичного XML API.
За полгода дизайн сайта НБУ не менялся, пока работает нормально.

Александр! функция перестала работать!

выдает сообщение: "Ошибка при получении курса Нацбанка"

Поправьте скрипт как можно скорее!
Спасибо.

Исправлено.

Показать все комментарии
Публикация

Hello colleagues,

Usually we setup procedure, that automatically imports currency rates from bank.
I share the procedure for currency rates import from http://cbr.ru/ (http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx). Implemented call to the web service method GetCursOnDate.
Clr procedure is run at the MS SQL database level. There is no need to run Terrasoft application for such import.

For installing it You should do these steps:
1. Copy ClrBPMAExchangeRatesRU.dll and ClrBPMAExchangeRatesRU.XmlSerializers.dll to the MS SQL database server. (In the example the path is used: D:\BPMSolutions\Integrations\ExchangeRatesRU\)
2. Run scripts, located in the RecreateProcedures.sql file. Note: Check Microsoft documentation and make sure, these configuration changes will not affect Your DB negative.
3. Load TS service tbl_ExchangeRatesTmp.xml
4. Run bsp_ImportCurrencyRatesRU.sql for creating stored procedure, that imports data to Terrasoft currency table. You can modify it by Your needs.
5. Use ImportCurrencyRatesTask.sql and ImportCurrencyRatesTask.bat to setup MS Windows scheduled task for running the procedure or run it as database job.
All files ar attached: importcurrencyratesru.zip.

Solution is tested in TS 3.3.2, but can easy be modified for TS 3.4.0.

Нравится

Поделиться

0 комментариев
Показать все комментарии