diff --git a/Application.cfc b/Application.cfc index 8ce3723..ab47b40 100644 --- a/Application.cfc +++ b/Application.cfc @@ -87,7 +87,7 @@ - + diff --git a/inc/functions.cfm b/inc/functions.cfm index 398a022..5e92d70 100644 --- a/inc/functions.cfm +++ b/inc/functions.cfm @@ -159,7 +159,7 @@ function skuCode(area_code="", abstract_service_code="") { } request.skuCode = skuCode; */ -function roundSafe(a, precision) { +function roundSafe(a, precision=0) { return (isNumeric(a) AND isNumeric(precision)) ? round(a,precision) : a; } request.roundSafe = roundSafe; diff --git a/payg.cfm b/payg.cfm index b432fb4..d54ce3d 100644 --- a/payg.cfm +++ b/payg.cfm @@ -601,6 +601,7 @@ S3 операции и трафик: + Услуга Артикул специф. Кол-во специф. Артикул метр. @@ -614,9 +615,8 @@ S3 операции и трафик:     - Услуга Компонент - Клиентс. назв. + Польз. наим. GPL с НДС Скидка% @@ -676,7 +676,7 @@ S3 операции и трафик: class="gray"> #currentRow# - + #abstract_service#: #modifier# style="background:lightgreen;color:black;">#s_code# "err r""r">#component_quantity# #m_code# @@ -690,7 +690,6 @@ S3 операции и трафик: - #abstract_service# #modifier# #component# #user_description# @@ -706,7 +705,7 @@ S3 операции и трафик: #price# - #discounted_price# + #discounted_price# #service_quantity# #service_discount# #component_quantity# @@ -722,8 +721,8 @@ S3 операции и трафик: - - Итого #code#: + + Итого #code#: #round(final_metric_dimension_1,3)# #free_tier# #max(ceiling(final_metric_dimension_1) - free_tier, 0)# @@ -738,7 +737,7 @@ S3 операции и трафик: - Итого #wz# #contragent#: + Итого #wz# #contragent#: #accum_cost_svc# diff --git a/vm_gpu_rpt.cfm b/vm_gpu_rpt.cfm new file mode 100644 index 0000000..972c9be --- /dev/null +++ b/vm_gpu_rpt.cfm @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select + p.ts::date, + count(distinct p.obj_uuid) as unique_vm_cnt, + count(distinct p.obj_uuid) FILTER (WHERE p.value=1) as unique_vm_cnt_on, + round((sum(p.value)/12.)::numeric,1) as vm_h, -- 5 minute sampling + round((sum(p.value)/12.*32.18)::numeric,2) as cost, + + round((sum(p.value)/12./24)::numeric, 1) as avg_roundclock_vm + from gpu.vm + JOIN gpu.vm_power_state p on (vm.obj_uuid=p.obj_uuid) + where 1=1 + AND p.ts >= + AND p.ts < + + AND vm.client_id like + + GROUP BY p.ts::date +ORDER BY 1 + + + + +qComputing:#getTickCount()-request.startTickCount# + + + + + + + + select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource + + +qComputingAge:#getTickCount()-request.startTickCount# + + + + + + + + +qCharge:#getTickCount()-request.startTickCount# + + + + + + + + + + + + + + + + Отчет по PAYG + + + + + + + +Факт потребления по основной базе биллинга, спецификации из DWH. Без детализации по бакетам, VDC и т.д. +Все запросы кэшированы на 25 минут.
+Внимание! округление вверх при расчете метрик get, put S3. Расчетные суммы могут содержать погрешности округления, поэтому окончательный расчет стоимости (количество * цену) должен выполняться в бухгалтерской программе. +Если у клиента больше 1 действующего допника с услугами PAYG, то данные в отчете могут быть замножены, в этом случае считать вручную +
+Даты актуальности пока проверять вручную. Обращать внимание на замножение строк. + +
+Период с +по +Только PAYG checked/> +WZ по вхождению, с регистром +Код по вхождению + + +
+Часов в периоде: #hours# Строк в отчете: #qCharge.recordCount#
+Актуальность данных: +VCD Computing: class="err">>#dateFormat(qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(qComputingAge.dt_load,'HH:mm:ss.lXX')# +VCD Storage: class="err">>#dateFormat(qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(qStorageAge.dt_load,'HH:mm:ss.lXX')# +S3 хранение: class="err">>#dateFormat(qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3VolAge.dt_load,'HH:mm:ss.lXX')# +S3 операции и трафик: class="err">>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3OpsTrfAge.dt_load,'HH:mm:ss.lXX')# + +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + class="gray"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
УслугаАртикул специф.Кол-во специф.Артикул метр.ДетализацияКол-во метр.Free Tier.Опл. объемЕд.изм.Цена ₽ со скид., с НДССтоимость ₽ с НДС   КомпонентПольз. наим.GPL с НДССкидка%Дата НОУДата КОУКлюч строкиСырая метрикаПриведен­ная метрикаЦена ₽ до ск. с НДСЦена ₽ co ск. с НДС без окр.Service QuantityService DiscountComponent QuantityComponent DiscountДоговорДопникСделкаКонечник
+ + #wz# + #contragent# + (сводка) + + ответственный: + class="err">#responsible# #responsible_email# +
#currentRow##abstract_service#: #modifier# style="background:lightgreen;color:black;">#s_code#"err r""r">#component_quantity##m_code##dimension1##request.roundSafe(metric,3)##free_tier##unit# [#ed_izm#]#gaussianRound(discounted_price,2)##component##user_description##gaussianRoundSafe(price,2)##component_discount##dateFormat(serviceStart,'YYYY-MM-DD')##dateFormat(serviceEnd,'YYYY-MM-DD')##line_key##request.roundSafe(raw_metric,3)##request.roundSafe(metric,3)##price##discounted_price##service_quantity##service_discount##component_quantity##component_discount##contract##additional_agreement##deal##WZE#
Итого #code#:#round(final_metric_dimension_1,3)##free_tier##max(ceiling(final_metric_dimension_1) - free_tier, 0)##unit# [#ed_izm#]#current_price##gaussianRoundSafe(cost_dimension_1,2)#
Итого #wz# #contragent#:#accum_cost_svc#
+ + + + + + + + + + + + +string function gaussianRoundSafe(any num, numeric precision = 0, string default="") { + return (isNumeric(arguments.num)) ? gaussianRound(arguments.num, arguments.precision) : arguments.default; +} + +function gaussianRound(numeric number, numeric precision = 0) { + var factor = 10 ^ precision; + var scaledNumber = number * factor; + var absScaled = abs(scaledNumber); + var sign = sgn(scaledNumber); + var floored = int(absScaled); + + // If it's not ending in exactly .5, use standard rounding or precision scaling + if (absScaled - floored != 0.5) { + return round(number * factor) / factor; + } + + // If it is exactly .5, round towards the nearest even number + if (floored % 2 != 0) { + // Nearest even is UP + return (floored + 1) * sign / factor; + } else { + // Nearest even is DOWN + return floored * sign / factor; + } +} + \ No newline at end of file diff --git a/vm_ls.cfm b/vm_ls.cfm index 0f70f59..76825fe 100644 --- a/vm_ls.cfm +++ b/vm_ls.cfm @@ -119,8 +119,8 @@ S3 операции и трафик: #dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M #Organization# #VDC# - #round(VDC_CPU_Reserv,3)# - #round(VDC_CPU_Speed,3)# + #request.roundSafe(VDC_CPU_Reserv,3)# + #request.roundSafe(VDC_CPU_Speed,3)# #qVM.Cluster# @@ -129,19 +129,19 @@ S3 операции и трафик: #dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M #CPU_Model# #Host_CPU_Cores# #Host_CPU_Sockets# - #round(Host_CPU_Speed,3)# - #round(Host_RAM)# - #round(Host_CPU_Used,1)# - #round(Host_CPU_Used_Avg,1)# + #request.roundSafe(Host_CPU_Speed,3)# + #request.roundSafe(Host_RAM)# + #request.roundSafe(Host_CPU_Used,1)# + #request.roundSafe(Host_CPU_Used_Avg,1)# #VM_vCPU_count# - #round(VM_CPU_Used,1)# - #round(VM_CPU_Used_AVG,1)# - #round(VM_CPU_Reserv_GHz,1)# + #request.roundSafe(VM_CPU_Used,1)# + #request.roundSafe(VM_CPU_Used_AVG,1)# + #request.roundSafe(VM_CPU_Reserv_GHz,1)# #VM_CPU_Reserv_perc# #VM_RAM_Allocated# - #round(VM_RAM_Used)# + #request.roundSafe(VM_RAM_Used)# #VM_is_ON#