071 deep debug

This commit is contained in:
2026-08-14 18:07:24 +03:00
parent 5401b7e96d
commit 91b6687220
8 changed files with 277 additions and 127 deletions
+38 -14
View File
@@ -130,6 +130,14 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<th width="10%">Услуга</th>
<th width="10%">Компонент</th>
<td width="3%">Цена &#8381; до ск. с НДС</td>
<td width="3%">Цена &#8381; co ск. с НДС без окр.</td>
<!--- <td width="3%">Цена &#8381; co ск. с НДС без окр.v2</td> --->
<td width="3%">Service Quantity</td>
<td width="3%">Service Discount</td>
<td width="3%">Component Quantity</td>
<td width="3%">Component Discount</td>
<!--- <td width="10%">Клиентс. назв.</td> --->
<!--- <td width="3%">GPL с НДС</td>
@@ -156,6 +164,7 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<!--- видимо, Free Tier и единицу измерения нужно брать и для строк, которые не найдены в договоре
(еше можно было бы туда для полноты добавлять GPL цену, но для этого нужен каталог)
Добавить реквизиты договора? --->
<cfset accum_cost_total = 0/>
<cfoutput query="report.qCharge" group="year">
<cfoutput group="month">
<tr><td colspan="99"><cfif month GT 0><b>#year#-#numberFormat(month,"00")#</b></cfif></td></tr>
@@ -164,7 +173,7 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<cfset var accum_metric_svc = 0/>
<tr>
<td bgcolor="##ccc"></td>
<td bgcolor="##ccc" colspan="12">
<td bgcolor="##ccc" colspan="99">
#svc# <b>#service_code#</b>
<cfif len(serviceCustomName)>(#serviceCustomName#)</cfif>
<cfif serviceHash EQ "">(не найдено в договоре)</cfif>
@@ -179,7 +188,7 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<td></td>
<td colspan="10">#code# <cfif code EQ "">(#m_code#)</cfif></td>
<td>#svc#</td>
<td>#component# </td>
<td colspan="99">#component# </td>
</tr>
<cfset accum_metric_dimension_1 = 0/>
@@ -196,33 +205,43 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<td><!--- free tier ---></td>
<td class="r" style="font-size:120%; padding:0 1em;"></td>
<td class="c">#unit#</td>
<td class="r">#gaussianRound(discounted_price,2)#</td>
<td class="r">#gaussianRoundSafe(discounted_price,2)#</td>
<td class="r"><!--- здесь не вычисляется стоимость, потому что Free Tier вычитается после агрегации (скидочные политики реализовывать будет непросто) ---></td>
<td></td>
<td></td>
<td></td>
<!--- сырые исходные данные без округлений --->
<td class="r gray">#price#</td>
<td class="r gray">#discounted_price#</td>
<!--- <td class="r gray">#discounted_price2#</td> --->
<td class="r gray">#service_quantity#</td>
<td class="r gray">#service_discount#</td>
<td class="r gray">#component_quantity#</td>
<td class="r gray">#component_discount#</td>
</tr>
</cfoutput>
<cfset cost_dimension_1 = precisionEvaluate("gaussianRound(max(accum_metric_dimension_1 - free_tier, 0)*gaussianRound(discounted_price, 2), 2)")/>
<cfset final_metric_dimension_1 = ceiling(accum_metric_dimension_1)/>
<cfset cost_dimension_1 = (isNumeric(discounted_price)) ? precisionEvaluate("gaussianRound(max(final_metric_dimension_1 - free_tier, 0)*gaussianRound(discounted_price, 2), 2)"):0/>
<tr class="b">
<td></td>
<td colspan="4">Итого #code# <cfif code EQ "">(#m_code#)</cfif>:</td>
<td class="r"><cfif accum_metric_dimension_1 NEQ 0 AND isNumeric(accum_metric_dimension_1)>#round(accum_metric_dimension_1,3)#</cfif></td>
<td class="r"><cfif final_metric_dimension_1 NEQ 0 AND isNumeric(final_metric_dimension_1)>#round(final_metric_dimension_1,3)#</cfif></td>
<td class="r">#free_tier#</td>
<td class="r" style="font-size:120%; padding:0 1em;"><cfif accum_metric_dimension_1 NEQ 0 AND isNumeric(accum_metric_dimension_1)>#max(ceiling(accum_metric_dimension_1) - free_tier, 0)#</cfif></td>
<td class="r" style="font-size:120%; padding:0 1em;"><cfif final_metric_dimension_1 NEQ 0 AND isNumeric(final_metric_dimension_1) AND isNumeric(free_tier)>#max(final_metric_dimension_1 - free_tier, 0)#</cfif></td>
<td class="c">#unit#</td>
<td class="r">#gaussianRound(discounted_price,2)#</td><!--- если цена менялась в периоде, неправильно показыввать последнюю - но мы не тестировали с изменением в периоде --->
<td class="r">#gaussianRoundSafe(discounted_price,2)#</td><!--- если цена менялась в периоде, неправильно показыввать последнюю - но мы не тестировали с изменением в периоде --->
<!--- непонятно, как вычитать Free Tier для неполных месяцев. Если с 15 по 15 - вычитать 2 раза, вычитать (каким-то сложным образом) 1 раз или ни разу --->
<!--- видимо, нужно сформировать тест кейсы на неполные месяцы. Где взять биллинговые данные для этого ВПР --->
<td class="r">#cost_dimension_1#</td>
<cfset accum_cost_svc = precisionEvaluate("accum_cost_svc + cost_dimension_1")/><!--- простое сложение дает ошибку округления и лишние знаки, но и precisionEvaluate не выглядит слишком надежным --->
<td>#svc# <!--- #service_code# ---></td>
<td>#component# </td>
<td colspan="99">#component#</td>
</tr>
</cfoutput><!--- serviceStart --->
</cfoutput><!--- code --->
<cfset accum_cost_total += isNumeric(accum_cost_svc) ? accum_cost_svc : 0/>
<tr>
<td bgcolor="##eee" style="border-bottom:2px solid gray;"></td>
<td bgcolor="##eee" colspan="9" class="r" style="border-bottom:2px solid gray;">
@@ -241,6 +260,7 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<tr><td colspan="99">&nbsp;</td></tr>
</cfoutput>
</cfoutput>
<cfoutput><tr class="b"><td colspan="99">Total: #accum_cost_total# </td></tr></cfoutput>
</table>
@@ -268,7 +288,7 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<tr>
<td>#contractOutsideId#</td>
<td>#additionalAgreementName#</td>
<td class="c">#serviceType#</td>
<td class="c"<cfif serviceType EQ 3> style="background:lightgreen"</cfif>>#serviceType#</td>
<td>#serviceCustomName#</td>
<td class="c">#serviceQuantity#</td>
<td class="r">#serviceDiscount#</td>
@@ -276,11 +296,11 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<td class="c">#dateFormat(serviceEnd, "YYYY-MM-DD")#</td>
<td>#component#</td>
<td>#componentCode#</td>
<td class="r">#quantity#</td>
<td class="r">#componentQuantity#</td>
<td class="c">#measureShort#</td>
<td class="r">#gaussianRound(priceWVat,2)#</td>
<td class="r">#discount#</td>
<td class="r">#gaussianRound((100-serviceDiscount)/100*(100-discount)/100*priceWVat,4)#</td>
<td class="r">#gaussianRoundSafe(priceWVat,2)# | #priceWVat#</td>
<td class="r">#componentDiscount#</td>
<td class="r">#gaussianRoundSafe((100-serviceDiscount)/100*(100-componentDiscount)/100*priceWVat,7)#/td>
</tr>
</cfoutput>
@@ -293,6 +313,10 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
<!--- select * from s3billing.billing_per_user_fix_pl('2025-05-01 00:00:00','2025-06-01 00:00:00','1395'); --->
<cfscript>
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;