<!--- проблема: пустой чек-бокс не передается, невозможно отличить "чек-бокс очищен" от "параметров нет, использовать дефолт" (например, при обращении к странице по GET)
решение: если передается форма, то отсутствие чек-бокса однозначно означает, что он очищен.
Передачу формы можно надежно обозначить скрытым полем. Можно для экономии использовать имя кнопки, но кнопок у меня 2, сабмит и дебаг
NB при передаче формы GET структура FORM пустая
мне подсказывают, что удобно передавать qwery or filter гетом, тогда можно урлу сохранить --->
<cfparam name="submit" default=""/>
<cfparam name="debug" default=""/>
<cfif len(submit) or len(debug)>
<!--- считаем, что отправлена форма и отсутствие чекбокса нужно трактовать как FALSE --->
<cfparam name="only_articles_in_spec" default=0/>
<cfparam name="inner_join" default=0/>
<cfelse>
<!--- это обращение по неквалифицированному URL и отсутствие чекбокса означает USE DEFAULT --->
<!--- <cfparam name="local.only_articles_in_spec" type="boolean" default=#structIsEmpty(form)? true : (form?.only_articles_in_spec GT 0)# /> <!--- не вполне корректный способ определить наличие формы, если там все чекбоксы и ни один не выбран... --->
select upper(trim(k.id_klienta)) as wz, k.__id::text as contragent_uid,
line as (
select
upper(trim(k.id_klienta)) as wz,
k.__id::text as contragent_uid,
p.code,
p.code,
SUBSTRING(p.code FROM 1 FOR LENGTH(p.code) - 2) as sku_code,
SUBSTRING(p.code FROM 1 FOR LENGTH(p.code) - 2) as sku_code, --оказывается, есть ошибки в данных, когда суффикс потерян, на этот случай надо парсить код
p.price, p.discount as component_discount, k.__name as contragent, a.__name as contract, a.__id::text as contract_uid, d.__name as deal, d.__id::text as deal_uid, siv.abstractive_service as abstract_service, siv.modifier, siv.user_description, siv.hash as line_key
p.price,
,siv.date_nop as serviceStart, siv.date_end as serviceEnd, siv.discount as service_discount, siv.cnt as service_quantity
p.discount as component_discount,
/*,p.__name as line_key*/, p.ed_izm, p.name as component, p.type, p.cnt*coalesce(siv.cnt,1) as component_quantity,
k.__name as contragent,
a.__name as contract,
a.__id::text as contract_uid,
d.__name as deal,
d.__id::text as deal_uid,
d.__index AS deal_index,
siv.abstractive_service as abstract_service,
siv.modifier, siv.user_description,
siv.hash as line_key
,siv.date_nop as serviceStart,
siv.date_end as serviceEnd,
siv.discount as service_discount,
siv.cnt as service_quantity
, p.ed_izm, p.name as component, p.type, p.cnt*coalesce(siv.cnt,1) as component_quantity,
aa.__name as additional_agreement, aa.__id::text as additional_agreement_uid
aa.__name as additional_agreement, aa.__id::text as additional_agreement_uid
--, aa.is_actual
,siv.end_customer::text as end_customer_uid
,siv.end_customer as end_customer_uid
,z.id_klienta as end_customer_wz
,z.id_klienta as end_customer_wz
,z.__name as end_customer_name
,z.__name as end_customer_name
--,ft.free_tier
,s.probability_pc
,s.probability_pc
,siv.__id::text as siv_uid
,siv.__id::text as siv_uid
,CASE WHEN p.type=3 THEN coalesce(siv.cnt*(100.-siv.discount)/100.*p.price*(100.-p.discount)/100., 0.) ELSE NULL END as discounted_price
from elma.deals d
from elma.deals d
JOIN STATUS s ON (d.__status_status = s.status_id)
JOIN STATUS s ON (d.__status_status = s.status_id)
join elma.deals_services siv on (d.__id=ANY(siv.deal))
join elma.deals_services siv on (d.__id=ANY(siv.deal))
--join elma.service_parametrs p on (p.__id = ANY(siv.params))
LEFT JOIN LATERAL unnest(siv.params) AS arr(param_id) ON TRUE
LEFT JOIN LATERAL unnest(siv.params) AS arr(param_id) ON TRUE
JOIN elma.service_parametrs p ON (p.__id = arr.param_id)
JOIN elma.service_parametrs p ON (p.__id = arr.param_id)
join elma.companies k on (d._companies=k.__id)
join elma.companies k on (d._companies=k.__id)
join elma.additional_agreements aa on (aa.__id = ANY(siv.additional_agreement))
join elma.additional_agreements aa on (aa.__id = ANY(siv.additional_agreement))
join elma.aggrements a on (aa.contract_uid = a.__id)
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 elma.companies z on (siv.end_customer=z.__id)
WHERE p.type IN (2,3) AND aa.is_actual
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)/*****/
AND aa."__deletedAt" IS NULL
AND aa."__deletedAt" IS NULL
AND a."__deletedAt" IS NULL
AND a."__deletedAt" IS NULL
AND d."__deletedAt" IS NULL
AND d."__deletedAt" IS NULL
@@ -103,17 +122,43 @@
</cfif>
</cfif>
<cfif len(code)>
<cfif len(code)>
AND p.code like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
AND p.code like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
</cfif>
<cfif only_articles_in_spec>
AND p.type=3
</cfif>
</cfif>
--AND k.id_klienta='WZ01031'
),
--AND k.id_klienta='WZ01112'
stair
order by k.id_klienta, p.code
AS (
SELECT *
FROM (
SELECT *
,MIN(serviceStart) OVER (
PARTITION BY line_key ORDER BY deal_index DESC
) running_min_dt
,COALESCE((
LEAD(serviceStart) OVER (
PARTITION BY line_key ORDER BY serviceStart
,deal_index
)
), (
SELECT CURRENT_TIMESTAMP + INTERVAL '1 day' --*** not sure
)) dt_next
FROM line
WHERE probability_pc = 100
) t
WHERE t.serviceStart = t.running_min_dt
)
select d.* from stair d
WHERE d.serviceStart < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
AND (d.serviceEnd > <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/> OR d.serviceEnd IS NULL)
order by wz, type DESC, code
</cfquery>
</cfquery>
<!--- select * from elma.deals_services where __id='019edf9c-c1e8-7acd-8b63-5369e5be5bf5'
<!--- select * from elma.deals_services where __id='019edf9c-c1e8-7acd-8b63-5369e5be5bf5'
union all
union all
select * from elma.deals_services where __id='019edf9c-c23d-7ad6-a990-643dd09579b8' --->
select * from elma.deals_services where __id='019edf9c-c23d-7ad6-a990-643dd09579b8' --->
<!--- здесь имеем список кодов с ценами и WZ. Каждому коду можно поставить в соответствие запрос, который даст по нему выборку. Изредка один запрос может вывести 2 кода, но разбить на 2 запроса легко. Кроме того, запросы можно объединить через union в один - может быть, так будет лучше читаться (быстрее выполняться не будет) --->
<!--- здесь имеем список кодов с ценами и WZ. Каждому коду можно поставить в соответствие запрос, который даст по нему выборку. Изредка один запрос может вывести 2 кода, но разбить на 2 запроса легко. Кроме того, запросы можно объединить через union в один - может быть, так будет лучше читаться (быстрее выполняться не будет) --->
<cfoutput>qSpec:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qSpec:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif isDefined("DEBUG")>
<cfif len(debug)>
<cfdump var=#qSpec#/>
<cfdump var=#qSpec#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
</cfif>
</cfif>
@@ -162,7 +207,7 @@ select * from elma.deals_services where __id='019edf9c-c23d-7ad6-a990-643dd09579
<cfoutput>qComputing:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qComputing:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif isDefined("DEBUG")>
<cfif len(debug)>
<cfdump var=#qComputing#/>
<cfdump var=#qComputing#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
</cfif>
</cfif>
@@ -219,7 +264,7 @@ select * from elma.deals_services where __id='019edf9c-c23d-7ad6-a990-643dd09579
<cfoutput>qStorage:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qStorage:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif isDefined("DEBUG")>
<cfif len(debug)>
<cfdump var=#qStorage#/>
<cfdump var=#qStorage#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
</cfif>
</cfif>
@@ -262,7 +307,7 @@ HOT_FREE_LIMIT 1 10 1 100
<cfoutput>qS3Vol:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qS3Vol:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif isDefined("DEBUG")>
<cfif len(debug)>
<cfdump var=#qS3Vol#/>
<cfdump var=#qS3Vol#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
</cfif>
</cfif>
@@ -333,7 +378,7 @@ select
<cfoutput>qS3OpsTrf:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qS3OpsTrf:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif isDefined("DEBUG")>
<cfif len(debug)>
<cfdump var=#qS3OpsTrf#/>
<cfdump var=#qS3OpsTrf#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
</cfif>
</cfif>
@@ -344,7 +389,8 @@ select
<cfoutput>qS3OpsTrfAge:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qS3OpsTrfAge:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
,SUM(m.completion_tokens)*c.weight_out/1e6 as cred_out
,SUM(m.cached_tokens)*c.weight_cached/1e6 as cred_cached
,SUM(m.audio_seconds)*c.weight_audio_sec/60e6 as cred_audio_minutes
FROM aillm.usage_metric m join cred c on (m.model_name=c.model_name)
WHERE 1=1
AND m.interval_start >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
AND m.interval_start < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dateAdd("d",1,dt_finish)#/> <!--- *** может быть, краевое уточнение для 15 мин --->
<cfif len(wz)>
AND m.organization_name ilike <cfqueryparam cfsqltype="cf_sql_varchar" value="%#wz#%"/>
</cfif>
GROUP BY m.organization_id, m.organization_name, m.model_name, c.weight_in, c.weight_out, c.weight_cached, c.weight_audio_sec
ORDER BY m.organization_id, m.organization_name, m.model_name;
</cfquery>
<cfoutput>qLlm:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif len(debug)>
<cfdump var=#qLlm#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
select wz, code || '.vcpu' as code, core_h as raw_metric, core_h as metric, 'core-h' as unit, vdc as dimension1
select wz, code || '.vcpu' as code, core_h as raw_metric, core_h as metric, 'core-h' as unit, vdc as dimension1
@@ -474,6 +575,34 @@ select
<cfif len(code)>
<cfif len(code)>
where code like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
where code like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
</cfif>
</cfif>
union all
select organization_name as wz, 'tokens_in', tokens_in as raw_metric, cred_in as metric, 'cred' as unit, model_name as dimension1
from qLlm
<cfif len(code)>
where 'tokens_in' like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
</cfif>
union all
select organization_name as wz, 'tokens_out', tokens_out as raw_metric, cred_out as metric, 'cred' as unit, model_name as dimension1
from qLlm
<cfif len(code)>
where 'tokens_out' like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
</cfif>
union all
select organization_name as wz, 'tokens_cached', tokens_cached as raw_metric, cred_cached as metric, 'cred' as unit, model_name as dimension1
from qLlm
<cfif len(code)>
where 'tokens_cached' like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
</cfif>
union all
select organization_name as wz, 'audio_minutes', audio_seconds as raw_metric, cred_audio_minutes as metric, 'cred' as unit, model_name as dimension1
from qLlm
<cfif len(code)>
where 'audio_minutes' like <cfqueryparam cfsqltype="cf_sql_varchar" value="%#code#%"/>
</cfif>
order by wz, code
order by wz, code
</cfquery>
</cfquery>
@@ -482,7 +611,7 @@ select
<cfoutput>qUnifiedMetric:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qUnifiedMetric:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif isDefined("DEBUG")>
<cfif len(debug)>
<cfdump var=#qUnifiedMetric#/>
<cfdump var=#qUnifiedMetric#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
</cfif>
</cfif>
@@ -515,39 +644,87 @@ FULL JOIN, потому что нам нужны бесхозные записи
<cfquery name="qCharge" datasource="inmem">
<cfquery name="qCharge" datasource="inmem">
/*EXPLAIN PLAN FOR*/
/*EXPLAIN PLAN FOR*/
WITH
metric as (select count(*) as cnt, wz, code, dimension1, max(unit) as unit, max(raw_metric) as raw_metric, max(metric) as metric
from qUnifiedMetric
group by wz,code, dimension1
),
spec as (select count(*) as cnt, wz, sku_code,
max(end_customer_wz) as wze,
max(code) as code,
max(component_quantity) as component_quantity,
max(service_quantity) as service_quantity,
max(service_discount) as service_discount,
max(discounted_price) as discounted_price,
max(type) as type,
max(ed_izm) as ed_izm,
--max(coalesce(service_quantity*(100.-service_discount)/100.*price*(100.-component_discount)/100., 0.)) as discounted_price,
max(serviceStart) as serviceStart,
max(serviceEnd) as serviceEnd,
max(line_key) as line_key,
max(price) as price,
max(component_discount) as component_discount,
max(contract) as contract,
max(contract_uid) as contract_uid,
max(additional_agreement) as additional_agreement,
max(additional_agreement_uid) as additional_agreement_uid,
max(deal) as deal,
max(deal_uid) as deal_uid,
max(abstract_service) as abstract_service,
max(modifier) as modifier,
max(component) as component,
max(user_description) as user_description,
max(CASE type WHEN 1 THEN 'install' WHEN 2 THEN 'fix' WHEN 3 THEN 'payg' ELSE NULL END) as pricing_model
<d:field title="Точное соотв. специф. - метр.">CASE WHEN (m.cnt=1 AND s.cnt=1) THEN 1 ELSE 0 END as exact_match</d:field>
<d:field title="Диагностика">
CASE
WHEN (m.cnt=1 AND s.cnt=1) THEN 'EXACT MATCH'
WHEN (m.cnt>1 AND s.cnt>1) THEN 'CRITICAL: Many-to-Many Explosion (Duplicates on BOTH sides)'
WHEN (s.cnt>1) THEN 'DUP: Multiple entries in Spec'
WHEN (m.cnt>1) THEN 'DUP: Multiple entries in Metrics'
WHEN (coalesce(m.cnt,0)=0 AND s.cnt>0) THEN 'ORPHAN: Only in Spec'
WHEN (m.cnt>0 AND coalesce(s.cnt,0)=0) THEN 'ORPHAN: Only in Metrics'
ELSE 'Other Discrepancy'
END as diag
</d:field>
<d:field title="WZ">coalesce(coalesce(c.wz, m.wz), s.wz) as wz</d:field>
<d:field title="WZ">coalesce(coalesce(c.wz, m.wz), s.wz) as wz</d:field>
<d:field title="WZ spec">s.wz as wzs</d:field>
<d:field title="WZ spec">s.wz as wzs</d:field>
<d:field title="WZ contragent">c.wz as wzc</d:field>
<d:field title="WZ contragent">c.wz as wzc</d:field>
<d:field title="WZ metric">m.wz as wzm</d:field>
<d:field title="WZ metric">m.wz as wzm</d:field>
<d:field title="WZ конечника">s.end_customer_wz as wze</d:field>
<d:field title="WZ конечника">s.wze</d:field>
<d:field title="Артикул">coalesce(s.sku_code, m.code) as code</d:field>
<d:field title="Артикул">coalesce(s.sku_code, m.code) as code</d:field>
<d:field title="Артикул по специф.">s.code as s_code</d:field><!--- содержит суффикс типа тарификации --->
<d:field title="Артикул по специф.">s.code as s_code</d:field><!--- содержит суффикс типа тарификации --->
<d:field title="SKU code по специф.">s.sku_code as sku_code</d:field><!--- без суффикса --->
<d:field title="SKU code по специф.">s.sku_code as sku_code</d:field><!--- без суффикса --->
<d:field title="Артикул по метрикам">m.code as m_code</d:field><!--- без суффикса --->
<d:field title="Кол-во компонента по спец." cfSqlType="CF_SQL_NUMERIC">s.component_quantity</d:field>
<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_quantity</d:field>
<d:field title="Скидка на сервис" cfSqlType="CF_SQL_NUMERIC">s.service_discount</d:field>
<!--- <d:field title="Скидка на сервис" cfSqlType="CF_SQL_NUMERIC">s.service_discount</d:field> --->
<d:field title="Free Tier" cfSqlType="CF_SQL_NUMERIC">coalesce(ft.free_tier,0) as free_tier</d:field>
<d:field title="Тип по спец.">s.type</d:field>
<d:field>m.dimension1</d:field>
<d:field title="Тип по спец.">s.type</d:field>
<d:field title="Ед.изм.">m.unit</d:field>
<d:field title="Ед.изм.">s.ed_izm</d:field>
<d:field title="Ед.изм.">s.ed_izm</d:field>
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">coalesce(s.service_quantity*(100.-s.service_discount)/100.*s.price*(100.-s.component_discount)/100., 0.) as discounted_price</d:field>
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">
CASE --inline implementation of gaussian round to 2 decimal places
-- Isolate the 3rd decimal place using MOD instead of %, hsql syntax
WHEN ABS(MOD(TRUNCATE(s.discounted_price * 1000, 0), 10)) = 5
AND ABS(MOD(TRUNCATE(s.discounted_price * 100, 0), 2)) = 0
-- If it's a perfect .xx5 tie and the 2nd digit is EVEN, shave off the 5
THEN TRUNCATE(s.discounted_price, 2)
-- In all other cases, standard mathematical rounding applies safely
JOIN qSpec s ON (m.wz=s.wz AND m.code=s.sku_code) -- сервис или компонент, но не цена с типом тарификации, суффикс типа тарификации отрезан
JOIN spec 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-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 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 стоили нескольких часов работы
LEFT JOIN qContragent c ON ((coalesce(s.wz,m.wz))=(c.wz)) -- пробелы в составе WZ стоили нескольких часов работы
--(поскольку trim слева в джойне катастрофически замедляет работу, делаем чистку выше при формировании исходных резалтсетов)
<!--- --(поскольку trim слева в джойне катастрофически замедляет работу, делаем чистку выше при формировании исходных резалтсетов) --->
WHERE 1=1
WHERE 1=1
<cfif only_articles_in_spec>
<cfif only_articles_in_spec>
AND EXISTS(select * from qSpec qs where qs.wz=m.wz AND qs.type=3)
AND EXISTS(select * from spec qs where qs.wz=m.wz AND qs.type=3)
<!--- вообще-то есть смысл добавить и все строки, где что-то намеряли --->
<!--- вообще-то есть смысл добавить и все строки, где что-то намеряли --->
</cfif>
</cfif>
<cfif len(wz)>
<cfif len(wz)>
@@ -595,7 +789,7 @@ ORDER BY coalesce(coalesce(c.wz, m.wz), s.wz), coalesce(s.code, m.code)
<!--- <cfdump var=#qCharge#/> --->
<!--- <cfdump var=#qCharge#/> --->
<cfoutput>qCharge:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfoutput>qCharge:#getTickCount()-request.startTickCount#</cfoutput><cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif isDefined("DEBUG")>
<cfif len(debug)>
<cfdump var=#qCharge#/>
<cfdump var=#qCharge#/>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
<cfif !isDefined("output_xls") AND !isDefined("output_json")><cfflush/></cfif>
</cfif>
</cfif>
@@ -626,40 +820,42 @@ ORDER BY coalesce(coalesce(c.wz, m.wz), s.wz), coalesce(s.code, m.code)
<br/>
<br/>
Даты актуальности пока проверять вручную. Обращать внимание на замножение строк.
Даты актуальности пока проверять вручную. Обращать внимание на замножение строк.
<cfoutput>
<cfoutput>
<form method="post" action="">
<form method="get" action="">
Период с <input type="text" name="dt_start" value="#dateFormat(dt_start,'YYYY-MM-DD')#"/>
Период с <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')#"/>
по <input type="text" name="dt_finish" value="#dateFormat(dt_finish,'YYYY-MM-DD')#"/>
<i><b>(перед выгрузкой отчета на произвольную дату или с параметрами сначала просмотрите его в браузере)</b></i>
<i><b>(перед выгрузкой отчета на произвольную дату или с параметрами сначала просмотрите его в браузере)</b></i>
<br/>
<span class="gray">серая строка</span> - нет метрик; <span class="err">красное</span> число в поле "Кол-во специф." - для PAYG в спецификации кол-во не 1
</cfoutput>
</cfoutput>
<table class="worktable">
<table class="worktable">
<thead>
<thead>
<td width="1%"></td>
<td width="1%"></td>
<!--- <th width="3%">WZ</th> --->
<th width="3%">Match</th>
<th width="7%">Услуга</th>
<th width="7%">Услуга</th>
<th width="7%">Артикул специф.</th>
<th width="7%">Артикул специф.</th>
<th width="5%">Кол-во специф.</th>
<th width="5%">Кол-во специф.</th>
@@ -668,36 +864,35 @@ S3 операции и трафик: <b<cfif datediff("h",qS3OpsTrfAge.dt_load,
<th width="5%">Кол-во метр.</th>
<th width="5%">Кол-во метр.</th>
<th width="5%">Free Tier.</th>
<th width="5%">Free Tier.</th>
<th width="5%">Опл. объем</th>
<th width="5%">Опл. объем</th>
<th width="3%">Ед.изм.</th>
<th width="2%">Ед.изм.</th>
<th width="3%">Цена ₽ со скид., с НДС</th>
<th width="3%">Цена ₽ со скид., с НДС</th>
<th width="3%">Стоимость ₽ с НДС</th>
<th width="3%">Стоимость ₽ с НДС</th>
<td width="3%"> </td>
<td width="10%">Сделка</td>
<td width="3%">Конечник</td>
<td width="10%">Компонент</td>
<td width="10%">Компонент</td>
<td width="15%">Польз. наим.</td>
<td width="15%">Польз. наим.</td>
<td width="3%">GPL с НДС</td>
<!--- <td width="3%">GPL с НДС</td>
<td width="3%">Скидка%</td>
<td width="3%">Скидка%</td> --->
<td width="3%">Дата НОУ</td>
<td width="3%">Дата НОУ</td>
<td width="3%">Дата КОУ</td>
<td width="3%">Дата КОУ</td>
<td width="5%">Ключ строки</td>
<!--- <td width="5%">Ключ строки</td> --->
<td width="3%">Сырая метрика</td>
<td width="3%">Сырая метрика</td>
<td width="3%">Приведен­ная метрика</td>
<td width="3%">Приведен­ная метрика</td>
<td width="3%">Цена ₽ до ск. с НДС</td>
<!--- <td width="3%">Цена ₽ до ск. с НДС</td>
<td width="3%">Цена ₽ co ск. с НДС без окр.</td>
<td width="3%">Цена ₽ co ск. с НДС без окр.</td> --->
<td width="3%">Service Quantity</td>
<!--- <td width="3%">Кол-во сервиса</td> --->
<td width="3%">Service Discount</td>
<!--- <td width="3%">Скидка на сервис</td> --->
<td width="3%">Component Quantity</td>
<!--- <td width="3%">Кол-во комп-та</td> --->
<td width="3%">Component Discount</td>
<!--- <td width="3%">Скидка на комп-т %</td> --->
<td width="5%">Договор</td>
<!--- <td width="5%">Договор</td>
<td width="10%">Допник</td>
<td width="10%">Допник</td> --->
<td width="10%">Сделка</td>
<td width="3%">Конечник</td>
</thead>
</thead>
@@ -722,11 +917,11 @@ S3 операции и трафик: <b<cfif datediff("h",qS3OpsTrfAge.dt_load,
<cfset accum_cost_svc = precisionEvaluate("accum_cost_svc + cost_dimension_1")/><!--- простое сложение дает ошибку округления и лишние знаки, но и precisionEvaluate не выглядит слишком надежным --->
<cfset accum_cost_svc = precisionEvaluate("accum_cost_svc + cost_dimension_1")/><!--- простое сложение дает ошибку округления и лишние знаки, но и precisionEvaluate не выглядит слишком надежным --->
<td class="b r" title="сумма корректна, если нет замножения строк из-за наличия PAYG и FIX по одному артикулу"><!--- #request.roundSafe(accum_metric_dimension_1_all,3)# --->#final_metric_dimension_1_all#</td>
<td class="b r" title="сумма корректна, если нет замножения строк из-за наличия PAYG и FIX по одному артикулу">#request.roundSafe(accum_metric_dimension_1_all,3)#<!--- #final_metric_dimension_1_all# ---></td>
<m:filterparam filter=#filter# param="quickfilter" ftype="string" prefix="%" suffix="%" expression="((p.project like ?) OR (p.customer like ?) OR (p.customer_alias like ?) OR (p.contragent_class_type like ?) OR (p.division like ?) OR (p.performer_short like ?))" default=""/>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.