83 intermediate metric sum in payg and performance improvement
This commit is contained in:
+1
-1
@@ -87,7 +87,7 @@
|
||||
|
||||
<!--- global settings --->
|
||||
<!--- *************************************************************************************************** --->
|
||||
<cfset request.APP_VERSION="0.00.081"/> <!--- *********************************************************** --->
|
||||
<cfset request.APP_VERSION="0.00.083"/> <!--- *********************************************************** --->
|
||||
<!--- *************************************************************************************************** --->
|
||||
<cfset request.STAND=getStand()/>
|
||||
<cfset request.RECORDS_PER_PAGE=500/>
|
||||
|
||||
+13
-5
@@ -21,10 +21,10 @@
|
||||
<cfquery name="qRead" datasource="#request.DS#">
|
||||
select
|
||||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||
<d:field title="ID" cfSqlType="CF_SQL_OTHER">d.__id</d:field>
|
||||
<d:field title="ID" cfSqlType="CF_SQL_OTHER">d.__id::text as __id</d:field>
|
||||
<d:field title="Внут.номер">d.agreement_id</d:field>
|
||||
<d:field title="Договор">d.__name</d:field>
|
||||
<d:field title="company_uid">d.company_uid</d:field>
|
||||
<d:field title="company_uid">d.company_uid::text as company_uid</d:field>
|
||||
<d:field title="Контрагент">k.__name as contragent</d:field>
|
||||
<d:field title="WZ">k.id_klienta as wz</d:field>
|
||||
<d:field title="Дата договора">d.date_of_aggrement</d:field>
|
||||
@@ -33,15 +33,23 @@
|
||||
<d:field title="Ответственный за к/а">c.__name as responsible</d:field>
|
||||
<d:field title="Email отв-го">c.email as responsible_email</d:field>
|
||||
<d:field title="Статус">c.__status_status as responsible_status</d:field>
|
||||
<d:field title="Доп. соглашений">(select count(*) from elma.additional_agreements a where a.contract_uid=d.__id AND a."__deletedAt" IS NULL) as aa_cnt</d:field>
|
||||
<!--- <d:field title="Доп. соглашений">COALESCE(a.aa_cnt, 0) AS aa_cnt</d:field> --->
|
||||
<d:field title="Доп. соглашений">a.aa_cnt</d:field>нас null вместо 0 совершенно устраивает
|
||||
</d:field_set>
|
||||
from elma.aggrements d
|
||||
LEFT OUTER JOIN elma.companies k ON (d.company_uid=k.__id)
|
||||
LEFT OUTER JOIN elma.comp_users_ext c ON (k.responsible=c.__id)
|
||||
LEFT OUTER JOIN (
|
||||
SELECT contract_uid, count(*) AS aa_cnt
|
||||
FROM elma.additional_agreements
|
||||
WHERE "__deletedAt" IS NULL
|
||||
GROUP BY contract_uid
|
||||
) a ON (a.contract_uid = d.__id)
|
||||
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
|
||||
order by <m:order_build sortArray=#pageInfo.settings.sort.sortArray# fieldCount=#fieldCount#/>
|
||||
</cfquery>
|
||||
|
||||
<!--- <cfdump var=#qRead#/> --->
|
||||
|
||||
<cfcatch type="database">
|
||||
<m:ls_catch catch=#cfcatch# status=#pageInfo.status#/>
|
||||
@@ -116,10 +124,10 @@ select count(*) as cnt from elma.aggrements d where 1=1
|
||||
<c:column width="1%" sortable="false"><!---*** class="c" не пробрасывается --->
|
||||
<c:td field="f_link_view_edit" class="c"/>
|
||||
</c:column>
|
||||
<c:column width="10%" field="__id"><c:td class="l"/></c:column>
|
||||
<c:column width="10%" field="__id" sortable=false><c:td class="l"/></c:column>
|
||||
<c:column width="10%" field="f_contract"/>
|
||||
<c:column width="10%" field="agreement_id"/>
|
||||
<c:column width="10%" field="company_uid"/>
|
||||
<c:column width="10%" field="company_uid" sortable=false/>
|
||||
<c:column width="10%" field="f_contragent"/>
|
||||
<c:column width="10%" field="wz"/>
|
||||
<c:column width="10%" field="responsible"/>
|
||||
|
||||
+22
-4
@@ -31,12 +31,30 @@
|
||||
<d:field title="Создано">k."__createdAt" as __createdAt</d:field>
|
||||
<d:field title="Обновлено">k."__updatedAt" as __updatedAt</d:field>
|
||||
<d:field title="Удалено">k."__deletedAt" as __deletedAt</d:field>
|
||||
<d:field title="Сделок">(select count(*) from elma.deals d where d._companies=k.__id) as deal_cnt</d:field>
|
||||
<d:field title="Договоров">(select count(*) from elma.aggrements d where d.company_uid=k.__id) as contract_cnt</d:field>
|
||||
<d:field title="Допников">(select count(*) from elma.additional_agreements g join elma.aggrements d on (g.contract_uid=d.__id) where d.company_uid=k.__id) as aa_cnt</d:field>
|
||||
<d:field title="Сделок">COALESCE(dc.deal_cnt, 0) AS deal_cnt</d:field>
|
||||
<d:field title="Договоров">COALESCE(cc.contract_cnt, 0) AS contract_cnt</d:field>
|
||||
<d:field title="Допников">COALESCE(aac.aa_cnt, 0) AS aa_cnt</d:field>
|
||||
</d:field_set>
|
||||
from elma.companies k
|
||||
LEFT OUTER JOIN elma.comp_users_ext c on (k.responsible=c.__id)
|
||||
LEFT JOIN (
|
||||
SELECT _companies AS company_id, count(*) AS deal_cnt
|
||||
FROM elma.deals
|
||||
GROUP BY _companies
|
||||
) dc ON dc.company_id = k.__id
|
||||
-- Считаем договоры
|
||||
LEFT JOIN (
|
||||
SELECT company_uid, count(*) AS contract_cnt
|
||||
FROM elma.aggrements
|
||||
GROUP BY company_uid
|
||||
) cc ON cc.company_uid = k.__id
|
||||
-- Считаем доп. соглашения
|
||||
LEFT JOIN (
|
||||
SELECT d.company_uid, count(*) AS aa_cnt
|
||||
FROM elma.additional_agreements g
|
||||
JOIN elma.aggrements d ON g.contract_uid = d.__id
|
||||
GROUP BY d.company_uid
|
||||
) aac ON aac.company_uid = k.__id
|
||||
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
|
||||
--AND exists (select * from elma.deals d where d._companies=k.__id)
|
||||
order by <m:order_build sortArray=#pageInfo.settings.sort.sortArray# fieldCount=#fieldCount#/>
|
||||
@@ -109,7 +127,7 @@ select count(*) as cnt from elma.companies where 1=1
|
||||
<c:column width="1%" sortable="false">
|
||||
<c:td field="f_link_view_edit" class="c"/>
|
||||
</c:column>
|
||||
<c:column width="10%" field="__id"/>
|
||||
<c:column width="10%" field="__id" sortable="false"/>
|
||||
<c:column width="3%" field="__index"><c:td class="c"/></c:column>
|
||||
<c:column width="20%" field="f_contragent"/>
|
||||
<c:column width="5%" field="wz"/>
|
||||
|
||||
@@ -13,8 +13,12 @@
|
||||
<cfparam name="dt_finish" type="date" default=#dateAdd('d',-1,createDateTime(year(Now()),month(Now()),1,0,0,0))#/>
|
||||
<cfparam name="dt_start" type="date" default=#dateAdd('m',-1,createDateTime(year(Now()),month(Now()),1,0,0,0))#/>
|
||||
<cfset hours=dateDiff('h', dt_start, dateAdd('d', 1, dt_finish))/>
|
||||
<cfparam name="only_articles_in_spec" type="boolean" default=false/>
|
||||
<cfparam name="wz" default=""/>
|
||||
|
||||
<cfparam name="local.only_articles_in_spec" type="boolean" default=#structIsEmpty(form)? true : (form?.only_articles_in_spec GT 0)# /> <!--- не вполне корректный способ определить наличие формы, если там все чекбоксы и ни один не выбран... --->
|
||||
<cfparam name="local.inner_join" type="boolean" default=#structIsEmpty(form)? true : (form?.inner_join GT 0)# />
|
||||
|
||||
|
||||
<cfparam name="code" default=""/>
|
||||
|
||||
<!--- *** коды лучше взять из каталога --->
|
||||
@@ -65,7 +69,7 @@
|
||||
,siv.end_customer as end_customer_uid
|
||||
,z.id_klienta as end_customer_wz
|
||||
,z.__name as end_customer_name
|
||||
,ft.free_tier
|
||||
--,ft.free_tier
|
||||
,s.probability_pc
|
||||
,siv.__id::text as siv_uid
|
||||
from elma.deals d
|
||||
@@ -78,7 +82,7 @@
|
||||
join elma.additional_agreements aa on (aa.__id = ANY(siv.additional_agreement))
|
||||
join elma.aggrements a on (aa.contract_uid = a.__id)
|
||||
left outer join elma.companies z on (siv.end_customer=z.__id)
|
||||
left outer join (values ('paas.s3.ceph.vol-m',1),('paas.s3.ceph.get-m',10),('paas.s3.ceph.put-m',1),('paas.s3.ceph.trf-m',100)) as ft(code,free_tier) ON (p.code=ft.code)
|
||||
|
||||
where p.type IN (2,3) AND aa.is_actual
|
||||
AND siv.date_nop < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
||||
AND (siv.date_end > <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/> OR siv.date_end IS NULL)/*****/
|
||||
@@ -487,7 +491,7 @@ SELECT
|
||||
<d:field title="Кол-во компонента по спец." cfSqlType="CF_SQL_NUMERIC">s.component_quantity</d:field>
|
||||
<d:field title="Кол-во сервиса по спец." cfSqlType="CF_SQL_NUMERIC">s.service_quantity</d:field>
|
||||
<d:field title="Скидка на сервис" cfSqlType="CF_SQL_NUMERIC">s.service_discount</d:field>
|
||||
<d:field title="Free Tier" cfSqlType="CF_SQL_NUMERIC">coalesce(s.free_tier,0) as free_tier</d:field>
|
||||
<d:field title="Free Tier" cfSqlType="CF_SQL_NUMERIC">coalesce(ft.free_tier,0) as free_tier</d:field>
|
||||
<d:field>m.dimension1</d:field>
|
||||
<d:field title="Тип по спец.">s.type</d:field>
|
||||
<d:field title="Ед.изм.">m.unit</d:field>
|
||||
@@ -519,7 +523,13 @@ SELECT
|
||||
<d:field title="Pricing Model">CASE s.type WHEN 1 THEN 'install' WHEN 2 THEN 'fix' WHEN 3 THEN 'payg' ELSE NULL END as pricing_model</d:field>
|
||||
</d:field_set>
|
||||
FROM qUnifiedMetric m
|
||||
FULL JOIN qSpec s ON (m.wz=s.wz AND m.code=s.sku_code) -- сервис или компонент, но не цена с типом тарификации, суффикс типа тарификации отрезан
|
||||
<cfif local.inner_join>
|
||||
<cfelse>
|
||||
FULL
|
||||
</cfif>
|
||||
JOIN qSpec s ON (m.wz=s.wz AND m.code=s.sku_code) -- сервис или компонент, но не цена с типом тарификации, суффикс типа тарификации отрезан
|
||||
--left outer join (values ('paas.s3.ceph.vol-m',1),('paas.s3.ceph.get-m',10),('paas.s3.ceph.put-m',1),('paas.s3.ceph.trf-m',100)) as ft(code,free_tier) ON (m.code=ft.code)
|
||||
left outer join (values ('paas.s3.ceph.vol',1),('paas.s3.ceph.get',10),('paas.s3.ceph.put',1),('paas.s3.ceph.trf',100)) as ft(code,free_tier) ON (m.code=ft.code)
|
||||
LEFT JOIN qContragent c ON ((coalesce(s.wz,m.wz))=(c.wz)) -- пробелы в составе WZ стоили нескольких часов работы
|
||||
--(поскольку trim слева в джойне катастрофически замедляет работу, делаем чистку выше при формировании исходных резалтсетов)
|
||||
WHERE 1=1
|
||||
@@ -579,18 +589,22 @@ ORDER BY coalesce(coalesce(c.wz, m.wz), s.wz), coalesce(s.code, m.code)
|
||||
<form method="post" action="">
|
||||
Период с <input type="text" name="dt_start" value="#dateFormat(dt_start,'YYYY-MM-DD')#"/>
|
||||
по <input type="text" name="dt_finish" value="#dateFormat(dt_finish,'YYYY-MM-DD')#"/>
|
||||
Только PAYG <input type="checkbox" name="only_articles_in_spec" value="1"<cfif only_articles_in_spec> checked</cfif>/>
|
||||
<input type="checkbox" name="only_articles_in_spec" id="only_articles_in_spec" value="1"<cfif local.only_articles_in_spec> checked</cfif>/><label for="only_articles_in_spec">Только PAYG </label>
|
||||
<input type="checkbox" name="inner_join" id="inner_join" value="1"<cfif local.inner_join> checked</cfif>/><label for="inner_join">Только найденные в договоре</label>
|
||||
|
||||
WZ <input type="text" name="wz" value="#wz#"/>по вхождению, с регистром
|
||||
|
||||
Код <input type="text" name="code" value="#code#"/>по вхождению
|
||||
|
||||
<input type="submit" style="cursor:pointer;"/>
|
||||
<input type="submit" name="DEBUG" value="DEBUG" style="cursor:pointer;"/><!--- #dateFormat( input, "yyyy-mm-dd" )#T#timeFormat( input, "HH:mm:ss.lXX" )# --->
|
||||
</form>
|
||||
Часов в периоде: <b>#hours#</b> Строк в отчете: <b>#qCharge.recordCount#</b><br/>
|
||||
Актуальность данных:
|
||||
VCD Computing: <b<cfif datediff("h",qComputingAge.dt_load, Now()) GT 24> class="err"</cfif>>>#dateFormat(qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(qComputingAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
VCD Storage: <b<cfif datediff("h",qStorageAge.dt_load, Now()) GT 24> class="err"</cfif>>>#dateFormat(qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(qStorageAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
S3 хранение: <b<cfif datediff("h",qS3VolAge.dt_load, Now()) GT 24> class="err"</cfif>>>#dateFormat(qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3VolAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
S3 операции и трафик: <b<cfif datediff("h",qS3OpsTrfAge.dt_load, Now()) GT 24> class="err"</cfif>>>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3OpsTrfAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
VCD Computing: <b<cfif datediff("h",qComputingAge.dt_load, Now()) GT 24> class="err"</cfif>>#dateFormat(qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(qComputingAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
VCD Storage: <b<cfif datediff("h",qStorageAge.dt_load, Now()) GT 24> class="err"</cfif>>#dateFormat(qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(qStorageAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
S3 хранение: <b<cfif datediff("h",qS3VolAge.dt_load, Now()) GT 24> class="err"</cfif>>#dateFormat(qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3VolAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
S3 операции и трафик: <b<cfif datediff("h",qS3OpsTrfAge.dt_load, Now()) GT 24> class="err"</cfif>>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3OpsTrfAge.dt_load,'HH:mm:ss.lXX')#</b>
|
||||
|
||||
<br/>
|
||||
<a href="#request.thisPage#?output_xls" title="экспорт в Excel" style="margin-left:.5em; height:100%;" target="_blank"><img src="img/xls.gif" style="vertical-align:text-bottom;"/></a>
|
||||
@@ -665,14 +679,15 @@ S3 операции и трафик: <b<cfif datediff("h",qS3OpsTrfAge.dt_load,
|
||||
|
||||
<cfset accum_metric_svc += isNumeric(metric) ? metric : 0/>
|
||||
<cfset accum_metric_dimension_1 = 0/>
|
||||
<cfset accum_metric_dimension_1_all = 0/><!--- не различая PAYG/FIX --->
|
||||
<cfset current_price=0/>
|
||||
|
||||
<cfoutput><!--- dimensions --->
|
||||
|
||||
<cfoutput><!--- dimensions --->
|
||||
<cfif type EQ 3>
|
||||
<cfset accum_metric_dimension_1 += isNumeric(metric) ? metric : 0/>
|
||||
<cfset current_price=gaussianRound(discounted_price, 2)/>
|
||||
</cfif>
|
||||
<cfset accum_metric_dimension_1_all += isNumeric(metric) ? metric : 0/>
|
||||
<!--- детализация --->
|
||||
<tr<cfif !len(unit)> class="gray"</cfif>>
|
||||
<td>#currentRow#</a></td>
|
||||
@@ -718,25 +733,28 @@ S3 операции и трафик: <b<cfif datediff("h",qS3OpsTrfAge.dt_load,
|
||||
</tr>
|
||||
</cfoutput>
|
||||
<cfset final_metric_dimension_1 = ceiling(accum_metric_dimension_1)/>
|
||||
<cfset final_metric_dimension_1_all = ceiling(accum_metric_dimension_1_all)/>
|
||||
<cfset cost_dimension_1 = precisionEvaluate("gaussianRound(max(final_metric_dimension_1 - free_tier, 0)*current_price, 2)")/>
|
||||
<cfset accum_cost_svc = precisionEvaluate("accum_cost_svc + cost_dimension_1")/><!--- простое сложение дает ошибку округления и лишние знаки, но и precisionEvaluate не выглядит слишком надежным --->
|
||||
<tr>
|
||||
<td colspan="4"></td>
|
||||
<td colspan="2" class="b r">Итого #code#:</td>
|
||||
<td class="b r" style="font-size:110%; padding:0 1em;"><cfif final_metric_dimension_1 NEQ 0 AND isNumeric(final_metric_dimension_1)>#round(final_metric_dimension_1,3)#</cfif></td>
|
||||
<td class="b r" style="font-size:110%; padding:0 1em;">#accum_metric_dimension_1#<cfif final_metric_dimension_1 NEQ 0 AND isNumeric(final_metric_dimension_1)>#round(final_metric_dimension_1,3)#</cfif></td>
|
||||
<td class="b r">#free_tier#</td>
|
||||
<td class="b r" style="font-size:120%; padding:0 1em;"><cfif final_metric_dimension_1 NEQ 0 AND isNumeric(final_metric_dimension_1)>#max(ceiling(final_metric_dimension_1) - free_tier, 0)#</cfif></td>
|
||||
<td class="b c">#unit# <cfif len(ed_izm)>[#ed_izm#]</cfif></td>
|
||||
<td class="b r">#current_price#</td>
|
||||
<td class="b r">#gaussianRoundSafe(cost_dimension_1,2)#</td>
|
||||
<td></td>
|
||||
<td colspan="8"></td>
|
||||
<td class="b r" title="сумма корректна, если нет замножения строк из-за наличия PAYG и FIX по одному артикулу">#request.roundSafe(accum_metric_dimension_1_all,3)#<!--- #final_metric_dimension_1_all# ---></td>
|
||||
<td colspan="100"></td>
|
||||
</tr>
|
||||
</cfoutput><!--- serviceStart --->
|
||||
</cfoutput><!--- code --->
|
||||
|
||||
<tr>
|
||||
<td bgcolor="##eee" style="border-bottom:2px solid gray;"></td>
|
||||
<td bgcolor="##eee" style="border-bottom:2px solid gray;"></td>и
|
||||
<td bgcolor="##eee" colspan="10" class="r b" style="border-bottom:2px solid gray;">Итого <a href="contragent.cfm?__id=#contragent_uid#&#tr.fwx#">#wz#</a> #contragent#:</td>
|
||||
<td bgcolor="##eee" class="r b nw" style="border-bottom:2px solid gray; font-size:130%;">#accum_cost_svc#</td>
|
||||
<td bgcolor="##eee" style="border-bottom:2px solid gray;"></td>
|
||||
|
||||
Reference in New Issue
Block a user