071 deep debug
This commit is contained in:
@@ -130,6 +130,14 @@ S3 операции и трафик: <b<cfif datediff("h",report.qS3OpsTrfAge.dt
|
||||
<th width="10%">Услуга</th>
|
||||
<th width="10%">Компонент</th>
|
||||
|
||||
<td width="3%">Цена ₽ до ск. с НДС</td>
|
||||
<td width="3%">Цена ₽ co ск. с НДС без окр.</td>
|
||||
<!--- <td width="3%">Цена ₽ 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"> </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;
|
||||
|
||||
Reference in New Issue
Block a user