Imports System Imports Microsoft.VisualBasic Imports YTxCommon.App.Enums Imports OrderCalculations Imports System.Collections.Generic Imports System.Linq Public Class UserOrderCalculations Implements IOrderCalculations '--------------------------------------------------------- ' Константы ' Константы почасового тарифа (в одну сторону) Private Const TariffBy1h As Double = 100 ' Тариф, грн. за 1 час Private Const MinSum1h As Double = 100 ' Минимальная стоимость, грн. ' Константы базового тарифа (возврат, в обратную сторону) ' Базовая минималка для гибкого тарифа, грн. Private Const MinSumBase As Double = 28 ' Учитывать км в минималке, км. Private Const DistanceInMin As Double = 5 ' Минималка при проезде через центр, грн. Private Const MinSumCenter As Double = 30 ' Тариф, грн. за 1 километр Private Const TariffBy1km As Double = 3 ' Тариф при проезде через Центр, грн. за 1 километр Private Const TariffBy1kmCenter As Double = 3 ' Загородный Тариф, грн. за 1 километр в одну сторону Private Const TariffBy1kmOut_1 As Double = 30 ' Загородный Тариф, грн. за 1 километр с возвратом (и точка откуда и точка куда находится в черте города) Private Const TariffBy1kmOut_2 As Double = 300 ' Минималка при безналичных заказах Private Const MinSumBN As Double = 30 ' Учитывать км в минималке при безналичном заказе, км. Private Const DistanceInMinBN As Double = 5 ' Тариф для безналичных заказов, грн. за 1 километр Private Const TariffBy1kmBN As Double = 3 ' Загородный Тариф для безналичных заказов, грн. за 1 километр в одну сторону Private Const TariffBy1kmOutBN_1 As Double = 30 ' Загородный Тариф для безналичных заказов, грн. за 1 километр с возвратом (и точка откуда и точка куда находится в черте города) Private Const TariffBy1kmOutBN_2 As Double = 300 ' Минималка для утренних и вечерних заказов (например, с 7:ОО до 10:00 и с 17:00 до 20:00), грн. Private Const MinSumJams As Double = 30 ' Минималка для выходных, грн. Private Const MinSumDayOff As Double = 25 ' Добавочная стоимость, грн. Private Const Surcharge As Double = 0 ' Добавочная стоимость, % Private Const SurchargeP As Double = 0 ' Простои, грн. за 1 мин Private Const TariffByIdleTime As Double = 0.5 ' Минимальное время простоя в минутах, при котором учитывается простой, мин Private Const MinIdleTime As Double = 5 ' Разница между временем создания заказа и временем заказа (на когда), при котором заказ считаем предварительным, мин Private Const AddTime As Double = 45 ' Утренние часы Private Const MorningHourBegin As Integer = 7 Private Const MorningMinuteBegin As Integer = 0 Private Const MorningHourEnd As Integer = 10 Private Const MorningMinuteEnd As Integer = 0 ' Вечерние часы Private Const EveningHourBegin As Integer = 17 Private Const EveningMinuteBegin As Integer = 0 Private Const EveningHourEnd As Integer = 20 Private Const EveningMinuteEnd As Integer = 0 ' Расстояние, километры после которого считаются со скидкой, км Private Const DistanceExtra As Double = 20 ' Скидка на километры сверх определённого расстояния, % Private Const Discount_DistanceExtra As Double = 10 ' Наценка за дополнительные услуги, грн. Private Const Surcharge_Conditioner As Double = 0 'Кондиционер Private Const Surcharge_Baggage As Double = 0 'Багаж в салоне Private Const Surcharge_Smoking As Double = 0 'Можно курить Private Const Surcharge_MeetingSign As Double = 0 'Встреча с табличкой Private Const Surcharge_WithRope As Double = 0 'Машина с тросом Private Const Surcharge_WithLighter As Double = 0 'Машина с прикуривателем Private Const Surcharge_Towing As Double = 0 'Буксировка Private Const Surcharge_Courier As Double = 40 'Курьер Private Const Surcharge_WiFi As Double = 0 'WIFI Private Const Surcharge_BabySeat As Double = 0 'Детское кресло Private Const Surcharge_PetTo5 As Double = 10 'Домашнее животное до 5 кг Private Const Surcharge_PetMore5 As Double = 10 'Домашнее животное более 5 кг Private Const Surcharge_TakeOut As Double = 0 'Багаж из дома\офиса Private Const Surcharge_Skid As Double = 0 'Багаж в дом\офис Private Const Surcharge_BabySitter As Double = 0 'Автоняня Private Const Surcharge_English As Double = 0 'Английский язык Private Const Surcharge_CourierDelivery As Double = 0 'Курьерская доставка Private Const Surcharge_BillRequired As Double = 0 'Требуется документ на оплату заказа Private Const Surcharge_TerminalRequired As Double = 0 'Требуется платёжный терминал для оплаты ' Наценка за дополнительные услуги, % Private Const SurchargeP_Conditioner As Double = 0 'Кондиционер Private Const SurchargeP_Baggage As Double = 0 'Багаж в салоне Private Const SurchargeP_Smoking As Double = 0 'Можно курить Private Const SurchargeP_MeetingSign As Double = 0 'Встреча с табличкой Private Const SurchargeP_WithRope As Double = 0 'Машина с тросом Private Const SurchargeP_WithLighter As Double = 0 'Машина с прикуривателем Private Const SurchargeP_Towing As Double = 0 'Буксировка Private Const SurchargeP_Courier As Double = 0 'Курьер Private Const SurchargeP_WiFi As Double = 0 'WIFI Private Const SurchargeP_BabySeat As Double = 0 'Детское кресло Private Const SurchargeP_PetTo5 As Double = 0 'Домашнее животное до 5 кг Private Const SurchargeP_PetMore5 As Double = 0 'Домашнее животное более 5 кг Private Const SurchargeP_TakeOut As Double = 0 'Багаж из дома\офиса Private Const SurchargeP_Skid As Double = 0 'Багаж в дом\офис Private Const SurchargeP_BabySitter As Double = 0 'Автоняня Private Const SurchargeP_English As Double = 0 'Английский язык Private Const SurchargeP_CourierDelivery As Double = 0 'Курьерская доставка Private Const SurchargeP_BillRequired As Double = 0 'Требуется документ на оплату заказа Private Const SurchargeP_TerminalRequired As Double = 0 'Требуется платёжный терминал для оплаты ' Наценка за класс авто, грн. Private Const Surcharge_Standard As Double = 0 'Стандарт Private Const Surcharge_Economy As Double = 0 'Эконом Private Const Surcharge_Comfort As Double = 0 'Комфорт Private Const Surcharge_Business As Double = 0 'Бизнес Private Const Surcharge_VIP As Double = 0 'VIP Private Const Surcharge_Universal As Double = 0 'Универсал Private Const Surcharge_Limo As Double = 0 'Лимузин Private Const Surcharge_Miniwan As Double = 0 'Минивен Private Const Surcharge_MicroBus As Double = 0 'Микроавтобус Private Const Surcharge_Gazelle As Double = 0 'Газель Private Const Surcharge_Evacuator As Double = 0 'Эвакуатор Private Const Surcharge_Bus As Double = 0 'Автобус ' Наценка за класс авто, % Private Const SurchargeP_Standard As Double = 0 'Стандарт Private Const SurchargeP_Economy As Double = 0 'Эконом Private Const SurchargeP_Comfort As Double = 0 'Комфорт Private Const SurchargeP_Business As Double = 0 'Бизнес Private Const SurchargeP_VIP As Double = 0 'VIP Private Const SurchargeP_Universal As Double = 0 'Универсал Private Const SurchargeP_Limo As Double = 0 'Лимузин Private Const SurchargeP_Miniwan As Double = 0 'Минивен Private Const SurchargeP_MicroBus As Double = 0 'Микроавтобус Private Const SurchargeP_Gazelle As Double = 0 'Газель Private Const SurchargeP_Evacuator As Double = 0 'Эвакуатор Private Const SurchargeP_Bus As Double = 0 'Автобус ' Наценка за предварительный заказ, грн. Private Const Surcharge_Preorder As Double = 2 ' Наценка за количество точек маршрута, грн. за точку Private Const Surcharge_PointsQuantity As Double = 2 ' Количество точек маршрута, сверх которого считаем наценку Private Const LimitPointsQuantity As Integer = 2 '--------------------------------------------------------- Public Function OrderCalculation(ByVal arguments As OrderCalculationParameters) As OrderCalculationResult _ Implements IOrderCalculations.OrderCalculation Dim result As OrderCalculationResult = New OrderCalculationResult Dim paysum_duration As Double = 0 ' расчетная сумма (часть 1, почасовый тариф) Dim paysum As Double = 0 ' расчетная сумма (часть 2, базовый тариф) Dim calculationlog As String = "Поэтапные вычисления:" ' лог расчета Dim provisionsSum As Double = 0 ' сумма наценки по всем услугам в грн Dim provisionsSumP As Double = 0 ' суммарная процентная наценка по всем услугам Dim OrderDay As Integer = arguments.RealBegin.DayOfWeek ' Номер дня недели заказа Dim Year As Integer = arguments.RealBegin.Year ' Год заказа Dim Month As Integer = arguments.RealBegin.Month ' Месяц заказа Dim Day As Integer = arguments.RealBegin.Day ' День заказа Dim MorningTimeBegin As New Date( Year, Month, Day, MorningHourBegin, MorningMinuteBegin, 0) ' Время начала утренних пробок Dim MorningTimeEnd As New Date( Year, Month, Day, MorningHourEnd, MorningMinuteEnd, 0) ' Время окончания утренних пробок Dim EveningTimeBegin As New Date( Year, Month, Day, EveningHourBegin, EveningMinuteBegin, 0) ' Время начала вечерних пробок Dim EveningTimeEnd As New Date( Year, Month, Day, EveningHourEnd, EveningMinuteEnd, 0) ' Время окончания вечерних пробок Dim RsltCmprTimeMnBgn As Integer = DateTime.Compare(arguments.RealBegin, MorningTimeBegin) ' Сравниваем время заказа с началом утренних часов Dim RsltCmprTimeMnEnd As Integer = DateTime.Compare(arguments.RealBegin, MorningTimeEnd) ' Сравниваем время заказа с окончанием утренних часов Dim RsltCmprTimeEvBgn As Integer = DateTime.Compare(arguments.RealBegin, EveningTimeBegin) ' Сравниваем время заказа с началом вечерних часов Dim RsltCmprTimeEvEnd As Integer = DateTime.Compare(arguments.RealBegin, EveningTimeEnd) ' Сравниваем время заказа с окончанием вечерних часов Dim DistanceInTown As Double = 0 ' Расстояние для части маршрута по городу, метры Dim DistanceOutTown As Double = 0 ' Расстояние для части маршрута за городом, метры Dim DistanceCenterTown As Double = 0 ' Расстояние для части маршрута в центре, метры 'Выбраный загородный тариф, грн. за 1 километр Dim TariffBy1kmOut As Double = 0 'Выбраный загородный тариф для безналичных заказов, грн. за 1 километр Dim TariffBy1kmOutBN As Double = 0 If arguments.RunDistance <> 0 Then ' расчет выполняем только в том случае, если определилось расстояние ' Расчет перемещения машины клиента (почасовой, в одну сторону) calculationlog += String.Format(" {0} Перемещение машины клиента {0}", vbCrLf) paysum_duration = TariffBy1h * arguments.RunDuration / 3600 calculationlog += String.Format("{2}Почасовой тариф {1} грн/ч {2} Время {0}ч. {2} ", Math.Round(arguments.RunDuration / 3600, 2), TariffBy1h, vbCrLf) calculationlog += String.Format("{1}Расчетная сумма {0} {1}", Math.Round(paysum_duration, 2), vbCrLf) If paysum_duration < MinSum1h Then paysum_duration = MinSum1h calculationlog += String.Format(" приводим к минимальной {0} {1} ", MinSum1h, vbCrLf) End If ' Выбираем используемый загородный тариф Dim item_first As KeyValuePair(Of Integer, String) ' Зона первой точки маршрута Dim item_last As KeyValuePair(Of Integer, String) ' Зона последней точки маршрута item_first = arguments.PriceZonesByOrderPoints.First() item_last = arguments.PriceZonesByOrderPoints.Last() calculationlog += String.Format("{1}Колво точек маршрута - зона: {0}", arguments.PriceZonesByOrderPoints.Count, vbCrLf) calculationlog += String.Format("{2}Старт маршрута - зона: {0}={1}", item_first.Key, item_first.Value, vbCrLf) calculationlog += String.Format("{2}Финиш маршрута - зона: {0}={1}", item_last.Key, item_last.Value, vbCrLf) If item_first.Value = "" or item_last.Value = "" Then ' Если хоть одна из крайних точек маршрута (ИЛИ точка откуда ИЛИ точка куда) находится в зоне "Загород" TariffBy1kmOut = TariffBy1kmOut_1 TariffBy1kmOutBN=TariffBy1kmOutBN_1 calculationlog += String.Format("{0} загородный тариф в одну сторону {0}", vbCrLf) Else TariffBy1kmOut = TariffBy1kmOut_2 TariffBy1kmOutBN = TariffBy1kmOutBN_2 calculationlog += String.Format("{0} загородный тариф с возвратом, или отсутствует {0}", vbCrLf) End If calculationlog += String.Format("{0} загородный тариф для безналичных заказов: {1} {0} загородный тариф для не безналичных: {2} {0}", vbCrLf, TariffBy1kmOutBN,TariffBy1kmOut) ' считаем расстояние части маршрута по городу и за городом Dim item As KeyValuePair(Of String, Integer) For Each item In arguments.RunDistanceByPriceZones calculationlog += String.Format("{0} цикл {0}", vbCrLf) ' отладка If item.Key = "Город" Then DistanceInTown = DistanceInTown + item.Value ' Добавляем часть маршрута по зоне "Город" calculationlog += String.Format("{0} расстояние по городу: приплюсовали Город {1} метров {0}", vbCrLf, DistanceInTown) ElseIf item.Key = "Центр" Then DistanceCenterTown = DistanceCenterTown + item.Value ' Добавляем часть маршрута по зоне "Центр" calculationlog += String.Format("{0} расстояние по центру: приплюсовали Центр {1} метров {0}", vbCrLf, DistanceCenterTown) ElseIf item.Key = "" Then DistanceOutTown = DistanceOutTown + item.Value ' Считаем загородный маршрут calculationlog += String.Format("{0} Маршрут за городом: приплюсовали {1} метров {0}", vbCrLf, DistanceOutTown) Else calculationlog += String.Format("{0} Есть маршрут в не рассчитываемых зонах, зона: ({1}) {0}", vbCrLf, item.Key) End If Next calculationlog += String.Format("{2} Итого по городу {0}м, за городом {1}м", DistanceInTown, DistanceOutTown, vbCrLf) calculationlog += String.Format(" Тип оплаты заказа: {0}{1}", arguments.PayType, vbCrLf) ' Выбираем минималку If arguments.PayType = PayTypes.NonCash Then ' Минималка для безналичных заказов paysum = MinSumBN calculationlog += String.Format("Заказ безналичный {0}", vbCrLf) Else ' Вычисляем минималку, если заказ не безналичный ' Если день недели суббота или воскресенье - берём минималку для выходных If OrderDay = 6 or OrderDay = 7 Then paysum = MinSumDayOff Else ' Если время начала выполнения заказа (не раньше начала и не позже окончания утренних часов), ' или (не раньше начала и не позже окончания вечерних часов), ' то берём минималку для времени пробок If (RsltCmprTimeMnBgn >= 0 and RsltCmprTimeMnEnd <= 0) or (RsltCmprTimeEvBgn >= 0 and RsltCmprTimeEvEnd <= 0) Then paysum = MinSumJams Else ' Проверяем наличие маршрута через центр If DistanceCenterTown > 0 Then ' Если расстояние для части маршрута в центре больше нуля paysum = MinSumCenter ' Считаем минималку при проезде через центр. Else ' Иначе - базовую минималку paysum = MinSumBase End If End If End If End If calculationlog += String.Format("{1} минималка: {0}", paysum, vbCrLf) calculationlog += String.Format("{1}Колво адресов: {0}", arguments.OrderPoints.Count, vbCrLf) Dim AddressFrom As KeyValuePair(Of Integer, OrderCalculationPoint) ' Зона первой точки маршрута AddressFrom = arguments.OrderPoints.Last() calculationlog += String.Format("{3}Адрес откуда: {0}, {1}, {2}, {4}, {5}, {6}", AddressFrom.Value.TownName, AddressFrom.Value.StreetName, AddressFrom.Value.House, vbCrLf,AddressFrom.Value.Address, AddressFrom.Value.GPSLat , AddressFrom.Value.GPSLon ) ' if AddressFrom.Value.StreetName = "Крещатик ул." and AddressFrom.Value.House = "22" then ' paysum = paysum + 50000 ' End if If arguments.PayType = PayTypes.NonCash Then ' Если безналичный заказ ' Если в минималку не вписываемся, добавляем плату за каждый километр сверх минималки If arguments.RunDistance > DistanceInMinBN * 1000 Then ' Считаем сумму с учётом маршрута по городу (в том числе центра) и за городом paysum = paysum + (DistanceInTown / 1000.0 - DistanceInMinBN) * TariffBy1kmBN + DistanceCenterTown / 1000.0 * TariffBy1kmBN + DistanceOutTown / 1000.0 * TariffBy1kmOutBN ' Примечание: если часть маршрута по городу меньше минималки, то разница считается по городскому тарифу и вычитается из общей суммы. calculationlog += String.Format("{1} за весь километраж: {0}", paysum, vbCrLf) End If Else ' Если заказ не безналичный ' Если в минималку не вписываемся, добавляем плату за каждый километр сверх минималки If arguments.RunDistance > DistanceInMin * 1000 Then ' Считаем сумму с учётом маршрута в центре по городу и за городом paysum = paysum + (DistanceInTown / 1000.0 - DistanceInMin) * TariffBy1km + DistanceCenterTown / 1000.0 * TariffBy1kmCenter + DistanceOutTown / 1000.0 * TariffBy1kmOut ' Примечание: если часть маршрута по городу меньше минималки, то разница считается по городскому тарифу и вычитается из общей суммы. calculationlog += String.Format("{1} за весь километраж: {0}", paysum, vbCrLf) End If End If ' Если расстояние превышает установленное для скидки, то делаем скидку на километры сверх этого расстояния If arguments.RunDistance > DistanceExtra * 1000 Then paysum = paysum - (arguments.RunDistance / 1000 - DistanceExtra) * TariffBy1km * Discount_DistanceExtra / 100 End If calculationlog += String.Format("{1} С учётом скидки за километраж: {0}", paysum, vbCrLf) ' Прибавляем добавочную стоимость paysum = paysum + Surcharge paysum = paysum * (100 + SurchargeP) / 100 calculationlog += String.Format("{1} С начислением добавочной стоимости: {0}", paysum, vbCrLf) ' Если простой свыше определённого значения, добавляем плату за простой If arguments.WaitDuration >= MinIdleTime * 60 Then paysum = paysum + TariffByIdleTime * arguments.WaitDuration / 60 End If calculationlog += String.Format("{1} С учётом простоя: {0}", paysum, vbCrLf) ' Вычисляем наценку за дополнительные услуги For Each item1 As OrderTypes In arguments.Provisions Select Case item1 Case 0 provisionsSum += Surcharge_Conditioner provisionsSumP += SurchargeP_Conditioner Case 1 provisionsSum += Surcharge_Baggage provisionsSumP += SurchargeP_Baggage Case 2 provisionsSum += Surcharge_Smoking provisionsSumP += SurchargeP_Smoking Case 3 provisionsSum += Surcharge_MeetingSign provisionsSumP += SurchargeP_MeetingSign Case 4 provisionsSum += Surcharge_WithRope provisionsSumP += SurchargeP_WithRope Case 5 provisionsSum += Surcharge_WithLighter provisionsSumP += SurchargeP_WithLighter Case 6 provisionsSum += Surcharge_Towing provisionsSumP += SurchargeP_Towing Case 7 provisionsSum += Surcharge_Courier provisionsSumP += SurchargeP_Courier Case 8 provisionsSum += Surcharge_WiFi provisionsSumP += SurchargeP_WiFi Case 9 provisionsSum += Surcharge_BabySeat provisionsSumP += SurchargeP_BabySeat Case 10 provisionsSum += Surcharge_PetTo5 provisionsSumP += SurchargeP_PetTo5 Case 11 provisionsSum += Surcharge_PetMore5 provisionsSumP += SurchargeP_PetMore5 Case 12 provisionsSum += Surcharge_TakeOut provisionsSumP += SurchargeP_TakeOut Case 13 provisionsSum += Surcharge_Skid provisionsSumP += SurchargeP_Skid Case 14 provisionsSum += Surcharge_BabySitter provisionsSumP += SurchargeP_BabySitter Case 15 provisionsSum += Surcharge_English provisionsSumP += SurchargeP_English Case 16 provisionsSum += Surcharge_CourierDelivery provisionsSumP += SurchargeP_CourierDelivery Case 17 provisionsSum += Surcharge_BillRequired provisionsSumP += SurchargeP_BillRequired Case 18 provisionsSum += Surcharge_TerminalRequired provisionsSumP += SurchargeP_TerminalRequired End Select Next ' начисляем проценты за услуги paysum = paysum * (100 + provisionsSumP) / 100 calculationlog += String.Format("{1} С процентным начислением за доп.услуги: {0}", paysum, vbCrLf) ' начисляем фиксированные наценки за услуги paysum = paysum + provisionsSum calculationlog += String.Format("{1} С учётом фиксированных наценок за доп.услуги: {0}", paysum, vbCrLf) ' Начисляем наценку за класс авто Select Case arguments.CarClass Case CarClasses.Standard paysum = paysum + Surcharge_Standard + paysum * SurchargeP_Standard / 100 Case CarClasses.Economy paysum = paysum + Surcharge_Economy + paysum * SurchargeP_Economy / 100 Case CarClasses.Comfort paysum = paysum + Surcharge_Comfort + paysum * SurchargeP_Comfort / 100 Case CarClasses.Business paysum = paysum + Surcharge_Business + paysum * SurchargeP_Business / 100 Case CarClasses.VIP paysum = paysum + Surcharge_VIP + paysum * SurchargeP_VIP / 100 Case CarClasses.Universal paysum = paysum + Surcharge_Universal + paysum * Surcharge_Universal / 100 Case CarClasses.Limo paysum = paysum + Surcharge_Limo + paysum * Surcharge_Limo / 100 Case CarClasses.Miniwan paysum = paysum + Surcharge_Miniwan + paysum * SurchargeP_Miniwan / 100 Case CarClasses.MicroBus paysum = paysum + Surcharge_MicroBus + paysum * SurchargeP_MicroBus / 100 Case CarClasses.Gazelle paysum = paysum + Surcharge_Gazelle + paysum * SurchargeP_Gazelle / 100 Case CarClasses.Evacuator paysum = paysum + Surcharge_Evacuator + paysum * SurchargeP_Evacuator / 100 Case CarClasses.Bus paysum = paysum + Surcharge_Bus + paysum * SurchargeP_Bus / 100 End Select calculationlog += String.Format("{1} С учётом класса автомобиля: {0}", paysum, vbCrLf) ' Начисляем наценку за предварительный заказ If arguments.Preorder = true Then Dim timePreorder As DateTime = arguments.Created ' Время создания заказа timePreorder.AddMinutes(AddTime) ' Прибавляем разницу времени, определяющую предварительный заказ Dim rsltCmprTimePreorder As Integer = DateTime.Compare(timePreorder, arguments.RealBegin) ' Сравниваем с временем заказа (на когда) If rsltCmprTimePreorder < 0 Then ' Если время создания плюс разница, определяющая предварительный заказ раньше, чем время начала выполнения заказа paysum = paysum + Surcharge_Preorder ' то добавляем наценку за предварительный заказ End If End If calculationlog += String.Format("{1} С учётом наценки за предварительный заказ: {0}", paysum, vbCrLf) ' Если точек маршрута больше определённого количества, начисляем наценку за каждую точку сверх If arguments.PointsQuantity > LimitPointsQuantity Then paysum = paysum + (arguments.PointsQuantity - LimitPointsQuantity) * Surcharge_PointsQuantity End If calculationlog += String.Format("{1} С учётом количества точек маршрута: {0}", paysum, vbCrLf) ' складываем части "туда" и "обратно" (почасовку с базовым) paysum = paysum + paysum_duration calculationlog += String.Format("{1} сумма частей расчета туда и обратно: {0}", paysum, vbCrLf) ' округляем paysum = Math.Round(paysum, 2) calculationlog += String.Format("{1} Округление результата: {0}", paysum, vbCrLf) ' результат переводим в копейки result.PaySum = paysum * 100 result.CalculationLog = String.Format("Расстояние: {0} км{5}Время: {7} ч {5}Тариф: {1} грн/км{5}Почасовой тариф: {6} грн/км{5}Загородный тариф: {2} грн/км{5}К оплате: {3} грн{5} {4}", arguments.RunDistance / 1000, TariffBy1km, TariffBy1kmOut, paysum, calculationlog, vbCrLf, TariffBy1h, Math.Round(arguments.RunDuration / 3600)) Return result Else ' если расстояние не определено, расчет не выполняем. Return Nothing End If End Function End Class