Добрый день!

Хочу сделать актуализацию курсов валют, указывая актуальные значения, полученные через веб-сервис. Возникает проблема с сохранением значения курса. Пишу новое значение как новую запись в таблицу CurrencyRate, заполняю поля CurrencyId, Rate, StartDate. Проблема в том, что система обрабатывает значения Rate, вычисляя обратный курс, мантиссу и на выходе в интерфейсе имею совсем другой курс и при расчетах получаю неверные значения. Подскажите каким образом корректно сохранить полученное прямое значение курса в системе и корректно вывести его в интерфейсе в справочнике Валюты.

Нравится

3 комментария
Лучший ответ

Добрый день, вам нужно учесть что система производит расчеты относительно базовой валюты соответсвенно вам необходимо указывать курсы валют относительно базовой валюты. Так же следует учитывать что курс валют кешируется на уровне сессии пользователя, тоесть новый курс валюты при расчете на стороне клиента будет использоваться только после того как пользователь выйдет и войдет в систему(после обновления курса).
Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

Добрый день, вам нужно учесть что система производит расчеты относительно базовой валюты соответсвенно вам необходимо указывать курсы валют относительно базовой валюты. Так же следует учитывать что курс валют кешируется на уровне сессии пользователя, тоесть новый курс валюты при расчете на стороне клиента будет использоваться только после того как пользователь выйдет и войдет в систему(после обновления курса).
Пример реализации логики можете посмотреть тут https://marketplace.terrasoft.ru/app/exchange-rate-update-bpmonline

Добрый день!

Здорово что есть готовый и бесплатный инструмент позволяющий загружать валюты и их курсы. Но я рано обрадовался. Установил приложение, запустил процесс и обнаружил ошибку в журнале БП:

System.ServiceModel.EndpointNotFoundException: Прослушивание на http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx не выполняла ни одна конечная точка, которая могла бы принять сообщение. Среди прочих причин это могло быть вызвано неправильным адресом или действием SOAP. Подробнее см. в описании InnerException (если имеется). ---> System.Net.WebException: Невозможно соединиться с удаленным сервером ---> System.Net.Sockets.SocketException: Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера 212.40.192.49:80
   в System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
   в System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
   --- Конец трассировки внутреннего стека исключений ---
   в System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   в System.Net.HttpWebRequest.GetRequestStream()
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   --- Конец трассировки внутреннего стека исключений ---
 
Server stack trace: 
   в System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
   в System.ServiceModel.Channels.HttpOutput.Send(TimeSpan timeout)
   в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.SendRequest(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   в System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   в System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
 
Exception rethrown at [0]: 
   в System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   в System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   в Terrasoft.Configuration.CbrfDI.DailyInfoSoap.GetCursOnDate(DateTime On_date)
   в Terrasoft.Configuration.TscCbrfLoader.Load()
   в Terrasoft.Core.Process.TscLoadCurrencyRateMethodsWrapper.RunLoadCurrencyRateExecute(ProcessExecutingContext context)
   в Terrasoft.Core.Process.ProcessFlowElement.Execute(ProcessExecutingContext context)

Сталкивались ли вы с этим? В чем может быть причина?

Этот механизм реализован компанией «Техносерв консалтинг», лучше связаться с ними. А по тексту в журнале, может, с Вашего веб-сервера не было доступа к адресу http://www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx.

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

Теперь в дополнении "Exchange rates and calculator for Creatio" есть возможность оперативной синхронизации с ЦБРФ. 
Дополнительным бонусом
стала возможность отображения актуального курса Bitcoin в перечне курсов валют)

Дополнение экономит время пользователя, поскольку не требует дополнительных переходов на другие страницы или разделы системы, внешние ресурсы и т.д.

При телефонном разговоре с клиентом менеджер сможет высчитать сумму с учетом текущего курса валют непосредственно на открытой странице продажи, не переключаясь на другие вкладки.

установить можно здесь  ✅

Приятного использования)

 

 

Нравится

Поделиться

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

Здравствуйте!
Меня интересует вопрос о заполнении курсов валют из точним банковским курсом.
Допустим ситуацию:
Базовая валюта - руб
Стоимость продукта - 100$
Курс Доллара США $ - 76,3928 руб.

Если зайти в справочники в валюты, то нужно ввести курс на сегодня. Но получается что курс доллада нада вписывать 100/76,3928=1.309023887

Получается нужно писать 1.31?

Но когда добавляеш продукт в заказ то его стоимость 7633,58 руб.

а должна быть 7639,28 руб.
1.Что можна сделать чтобы числа были точные?
2.Можна ли автоматизировать процесс загрузки курсов в систему bpmonline commerce 7.7?

Нравится

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

Здравствуйте!

Система считает корректно:
[Цена продукта в $]/[Курс (1,31)]*100(рублей/$)

Итого, при стоимости товара в 1$ его цена будет составлять 76.3358. Так как тип "Деньги" - два знака после запятой, то система округлит значение до 76.34.

При стоимости в 100$ - сумма будет 7633.58 (при округлении - 7633.58).

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

Здравствуйте!

Как пользователю обновить цены сразу во всём прайс-листе продуктов в соответствии с установленным в справочнике курсом валюты?

Нравится

6 комментариев

Здравствуйте, Алексей!
Такой функционал реализован в версии 3.5.2.
Могу выслать метод, реализующий пересчет цены.

Андрей, можете и мне выслать.

Т.е. при изменении курса валют в справочнике автоматически пересчитывается базовая цена в карточке продукта и соответствующие цены в прайс листах?

Спасибо!

Андрей, здравствуйте!

К сожалению, у нас версия 3.3.2
Если не сложно - вышлите, пожалуйста. Вы меня очень выручите.

Здравствуйте!
В 3.5.2 пересчет реализовано действие, по которому вызывается следующая функция:

function amiRecalcOfferingPriceOnExecute(ActionMenuItem, Sender) {
	if (BaseWorkspace.Grid.SelectedIDs.Count == 0) {
		return;
	}
	var OfferingIDs = GetArrayByCollection(BaseWorkspace.Grid.SelectedIDs);
	var CurrentDate = GetLocalDate();
	RecalcOfferingPrices(CurrentDate, OfferingIDs, 'IDs');
}

, где

function RecalcOfferingPrices(CurrentDate, SelectedIDs, FilterName) {
	var RecordsCount = SelectedIDs.length;
	if (RecordsCount == 0) {
		ShowWarningDialog("Не выбрано ни одной записи");
		return;
	}
	var OfferingDataset = GetSingleItemByCode('ds_Offering', 'RecalcOfferingPrices');
	EnableDatasetFields(OfferingDataset, false);
	EnableDatasetFields(OfferingDataset, true, ['ID', 'CurrencyID', 'Rate']);
	ApplyDatasetIncludeFilter(OfferingDataset, 'IDs', SelectedIDs, true);
	OfferingDataset.Close();
	OfferingDataset.Open();
 
	var PriceCategoryDataset = GetSingleItemByCode('ds_PriceCategory', 'RecalcOfferingPrices');
	EnableDatasetFields(PriceCategoryDataset, false);
	EnableDatasetFields(PriceCategoryDataset, true, ['ID', 'IsBase', 
		'PriceCalcMethodID', 'Name', 'DiscountPercent', 'CurrencyID']);
	ApplyDatasetFilter(PriceCategoryDataset, 'IsDefault', true, true);
	PriceCategoryDataset.Close();
	PriceCategoryDataset.Open();
 
	var OfferingID;
	var PriceCalcMethodID;
	var PrimeCost;
	var PriceCategoryID;
	OfferingDataset.GotoFirst();
	while (!OfferingDataset.IsEOF) {
		OfferingID = OfferingDataset('ID');
		PriceCategoryDataset.GotoFirst();
		while (!PriceCategoryDataset.IsEOF) {
			PriceCategoryID = PriceCategoryDataset('ID');
			PriceCalcMethodID = PriceCategoryDataset('PriceCalcMethodID');
			PrimeCost = GetOfferingPrimeCost(OfferingID, PriceCalcMethodID) *
				(1 + PriceCategoryDataset('DiscountPercent') / 100);
 
			if (!IsZeroValue(PrimeCost)) {
				var OfferingPriceObject = GetOfferingPriceData(OfferingID, 
					CurrentDate, PriceCategoryID, true);
				var Dataset = OfferingPriceObject.Dataset;
				if (IsEmptyValue(OfferingPriceObject.ID) ||
					GetDateDiff(OfferingPriceObject.StartDate, CurrentDate) != 0) {
					OfferingPriceObject.PriceKindID = opk_PriceList;
					OfferingPriceObject.PriceCategoryID = PriceCategoryID;
					OfferingPriceObject.PriceCategoryName = PriceCategoryDataset('Name');
					if (IsEmptyValue(OfferingPriceObject.ID)) {
						OfferingPriceObject.CurrencyID = PriceCategoryDataset('CurrencyID');
					}
					OfferingPriceObject.Rate = GetCurrencyRate(
						OfferingPriceObject.CurrencyID, CurrentDate, false);
					OfferingPriceObject.StartDate = CurrentDate;
					OfferingPriceObject.DueDate = CurrentDate;
					OfferingPriceObject.ID = null;
					FillOfferingPriceObjectDefault(OfferingPriceObject, CurrentDate);
					OfferingPriceObject.IsPriceWithTaxCalc = false;
				}
 
				OfferingPriceObject.BasicPrice = PrimeCost;
				OfferingPriceObject.Price = RoundFloatValue(CalcNonBasicPrice(
					OfferingPriceObject.BasicPrice, OfferingPriceObject.CurrencyID, 
					OfferingPriceObject.Rate), 2);
				OldIsPriceWithTaxCalc = OfferingPriceObject.IsPriceWithTaxCalc;
				OfferingPriceObject.IsPriceWithTaxCalc = false;
				OfferingPriceDataChange('Price', OfferingPriceObject.Price,
					OfferingPriceObject);
				OfferingPriceObject.IsPriceWithTaxCalc = OldIsPriceWithTaxCalc;
 
				if (IsEmptyValue(OfferingPriceObject.ID)) {
					AppendOfferingPriceByObject(OfferingID, OfferingPriceObject);
				} else {
					Dataset.Edit();
					CopyOfferingPriceObjectToDataset(OfferingPriceObject, Dataset);
					Dataset.Post();
				}
			}
 
			PriceCategoryDataset.GotoNext();
		}
		OfferingDataset.GotoNext();
	}
}

Адаптацию под свои версии предлагаю Вам сделать самостоятельно.

Здравствуйте!
Оказалось, такая функция реализована ещё в 3.3.2.290 в действиях над продуктами
(раздел "Продукты" ->"Действия ->"Пересчитать и добавить новые цены по прайс-листам").
В любом случае - Андрей, спасибо Вам! :twisted:

Алексей, действительно, не подумал, что надо в Distribution смотреть.
Всегда пожалуйста!

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

Вниманию предлагается набор функций для загрузки в 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.
За полгода дизайн сайта НБУ не менялся, пока работает нормально.

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

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

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

Исправлено.

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

Будучи знакомым с WEB-разработкой, я однажды задумался на тем, что же мешает использовать тот же Ajax в Terrasoft CRM?. Не долго думая и зная ситуации на белорусском рынке валют, я решил сделать автоматическую загрузку курсов валют "черного" рынка. Скрипт был написан в версии системы 3.3. Но, вероятнее всего, подойдет для любой версии системы. Вот что получилось.

Пришлось немного повозиться, хочу вам сказать. Однако результат оказался довольно вменяемым. Итак, для того, чтобы протестировать сие чудное творение, распакуйте прикрепленный архив куда-нибудь на рабочий стол. Затем, через Администратор Terrasoft CRM загрузите сервисы из папки Ajax. Все сервисы появятся в дереве Common//Ajax. Далее нам нужно будет подправить в Администраторе wnd_Main, а точнее меню "Файл". Итак, открываем wnd_Main, заходим на вкладку "Невизуальные", ищем группу amiFile и создаем дочерний элемент amiCurrencyRates с заголовком "Получить курсы валют". Затем, в обработчике OnExecute() созданного элемента вписываем код, чтобы получилось вот так:

function amiCurrencyRatesOnExecute(ActionMenuItem, Sender) {
   InitializeAjax();
   GetUrl("http://prokopovi.ch/
informer_code_withoutdynamic/0/230/200/0/0/10/ru/
%D0%9A%D1%83%D1%80%D1%81%D1%8B+prokopovi.ch+%D0%BD%D0%B0+%21date"
);
}

В сам scr_Main добавляем в includes скрипт scr_AjaxCurrency. На этом предварительная настройка завершена! Заходим в Terrasoft Client, меню файл->получить курсы валют и наблюдаем результат.

Чтобы кастомизировать данный скрипт, нужно задать свой URL в GetUrl() обработчика amiCurrencyRatesOnExecute(ActionMenuItem, Sender) и переписать функцию ProcessProkopovich(txtResponse) в скрипте scr_AjaxCurrency под свой формат.

Оригинал публикации можно найти здесь.

Нравится

Поделиться

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

Всем привет!
Нужно настроить систему Terrasoft CRM 3.2 на автоматическое обновление курсов валют с сайта например RBC.
Есть стандартные решения этой задачи?
А может кто поделится готовым собственным решением... :)

Спасибо!

PS Если подобная тема и проскакивала, то я её не нашол... простите если повторяюсь. Впрочем поиска по форуму я также не нашол... :)))

Нравится

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

Был пример:
http://community.terrasoft.ua/node/2508

UPD
Поиск в верхнем правом углу.

Спасибо!

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