20 prices from contract
This commit is contained in:
+1
-1
@@ -77,7 +77,7 @@
|
|||||||
|
|
||||||
<!--- global settings --->
|
<!--- global settings --->
|
||||||
<cfset request.RECORDS_PER_PAGE=500/>
|
<cfset request.RECORDS_PER_PAGE=500/>
|
||||||
<cfset request.APP_VERSION="0.00.019"/>
|
<cfset request.APP_VERSION="0.00.020"/>
|
||||||
<cfheader name="X-Application-Version" value=#request.APP_VERSION#/>
|
<cfheader name="X-Application-Version" value=#request.APP_VERSION#/>
|
||||||
<cfset request.STAND=getStand()/>
|
<cfset request.STAND=getStand()/>
|
||||||
|
|
||||||
|
|||||||
+113
-53
@@ -26,7 +26,7 @@
|
|||||||
<!--- QoQ does not support join syntax, and of course outer joins, at least of Lucee 5.4--->
|
<!--- QoQ does not support join syntax, and of course outer joins, at least of Lucee 5.4--->
|
||||||
<!--- а внешние джойны хорошо подсвечивают ошибки, особенно помогает full --->
|
<!--- а внешние джойны хорошо подсвечивают ошибки, особенно помогает full --->
|
||||||
|
|
||||||
<cfmodule template="crm_contract.cfm" wz="WZ01348" out="qSpecification"/>
|
<cfmodule template="crm_contract.cfm" wz="WZ01348" out="qSpecification"/><!--- WZ01200 --->
|
||||||
<cfif (ATTRIBUTES.debug)>
|
<cfif (ATTRIBUTES.debug)>
|
||||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||||
<cfdump var=#qSpecification#/>
|
<cfdump var=#qSpecification#/>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
|
|
||||||
<cfif (ATTRIBUTES.debug)>
|
<cfif (ATTRIBUTES.debug)>
|
||||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||||
<cfdump var=#qStorage#/>
|
<cfdump var=#qStorageAge#/>
|
||||||
<cfflush/>
|
<cfflush/>
|
||||||
</cfif>
|
</cfif>
|
||||||
|
|
||||||
@@ -71,22 +71,34 @@
|
|||||||
</cfif>
|
</cfif>
|
||||||
|
|
||||||
|
|
||||||
|
<cfset qFreeTier=queryNew("code,free_tier","CF_SQL_VARCHAR,CF_SQL_NUMERIC",[['paas.s3.ceph.vol-m',1],['paas.s3.ceph.get-m',10],['paas.s3.ceph.put-m',1],['paas.s3.ceph.trf-m',100]])/>
|
||||||
|
<!--- -- все-таки пришлось прибить гвоздями - в каталоге нет даже бесплатного лимита, не то что скидочной политики
|
||||||
|
-- придется добавить в каталог
|
||||||
|
-- бесплатный лимит есть только для S3 HOT (в месяц в единицах измерения) --->
|
||||||
|
|
||||||
|
|
||||||
<!--- здесь нужно организовать пересечение версионной спецификации с анализируемым диапазоном дат --->
|
<!--- здесь нужно организовать пересечение версионной спецификации с анализируемым диапазоном дат --->
|
||||||
<cfquery name="qSpec" dbtype="query">
|
<cfquery name="qSpec" dbtype="query">
|
||||||
select catalogName as svc, component, fullCode as code, measureShort as unit
|
select s.catalogName as svc, s.component, s.fullCode as code, s.measureShort as unit
|
||||||
, priceWVat as price, (discount + serviceDiscount - discount*serviceDiscount/100) as discount
|
, s.priceWVat as price, (s.discount + s.serviceDiscount - s.discount*s.serviceDiscount/100) as discount
|
||||||
,serviceStart, serviceEnd, serviceHash
|
,s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, f.free_tier
|
||||||
from qSpecification
|
from qSpecification s, qFreeTier f
|
||||||
|
WHERE s.fullCode=f.code
|
||||||
|
|
||||||
|
UNION
|
||||||
|
|
||||||
|
select s.catalogName as svc, s.component, s.fullCode as code, s.measureShort as unit
|
||||||
|
, s.priceWVat as price, (s.discount + s.serviceDiscount - s.discount*s.serviceDiscount/100) as discount
|
||||||
|
,s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, 0
|
||||||
|
from qSpecification s
|
||||||
|
WHERE s.fullCode NOT IN (<cfqueryparam value="#ValueList(qFreeTier.code)#" cfsqltype="cf_sql_varchar" list="true">)
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
|
<!--- <cfdump var=#qSpec# abort=true/> --->
|
||||||
|
|
||||||
<cfset qTotal=""/>
|
|
||||||
|
|
||||||
<cfloop from=#attributes.dt_start# to=#attributes.dt_finish# step="#CreateTimeSpan( 1, 0, 0, 0 )#" index="local.dt">
|
<!--- <cfloop from=#attributes.dt_start# to=#attributes.dt_finish# step="#CreateTimeSpan( 1, 0, 0, 0 )#" index="local.dt">
|
||||||
<cfdump var=#dateFormat(local.dt,"YYYY-MM-DD")#/>
|
<cfdump var=#dateFormat(local.dt,"YYYY-MM-DD")#/>--->
|
||||||
|
|
||||||
<!--- *** Нужно еще реализовать в модели данных политики бесплатного минимума, сейчас пробито гвоздями --->
|
<!--- *** Нужно еще реализовать в модели данных политики бесплатного минимума, сейчас пробито гвоздями --->
|
||||||
<cfquery name="qComputing">
|
<cfquery name="qComputing">
|
||||||
@@ -98,15 +110,16 @@ from qSpecification
|
|||||||
when vdc.name like '%-v1cl6%' then 'iaas.ngc.i28'
|
when vdc.name like '%-v1cl6%' then 'iaas.ngc.i28'
|
||||||
else '['||vdc.name||']' end as code,
|
else '['||vdc.name||']' end as code,
|
||||||
sum(cpu_used/cpu_speed)/4. as core_h,
|
sum(cpu_used/cpu_speed)/4. as core_h,
|
||||||
sum(mem_used)/1024/4. as gb_h
|
sum(mem_used)/1024/4. as gb_h,
|
||||||
|
capacity_resource.timestamp::date as dt
|
||||||
from ngcloud_ru.capacity_resource
|
from ngcloud_ru.capacity_resource
|
||||||
join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
|
join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
|
||||||
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
||||||
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||||
AND capacity_resource.timestamp::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
AND capacity_resource.timestamp::date >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_start#/>
|
||||||
|
AND capacity_resource.timestamp::date <= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_finish#/>
|
||||||
group by tenant.wzcode, vdc.name
|
group by tenant.wzcode, vdc.name, capacity_resource.timestamp::date
|
||||||
order by tenant.wzcode, vdc.name;
|
order by tenant.wzcode, vdc.name, capacity_resource.timestamp::date;
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
<cfif (ATTRIBUTES.debug)>
|
<cfif (ATTRIBUTES.debug)>
|
||||||
@@ -132,15 +145,17 @@ from qSpecification
|
|||||||
as code,
|
as code,
|
||||||
storage_profile_types.name, -- *** это не тип, а профайл
|
storage_profile_types.name, -- *** это не тип, а профайл
|
||||||
sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
|
sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
|
||||||
sum(used)/1024./4 as gb_h_used
|
sum(used)/1024./4 as gb_h_used,
|
||||||
|
capacity_storage.timestamp::date as dt
|
||||||
from ngcloud_ru.capacity_storage
|
from ngcloud_ru.capacity_storage
|
||||||
join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.id
|
join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.id
|
||||||
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
||||||
join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
|
join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
|
||||||
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
where tenant.wzcode = <cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||||
AND capacity_storage.timestamp ::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
AND capacity_storage.timestamp::date >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_start#/>
|
||||||
group by tenant.wzcode, vdc.name, storage_profile_types.name
|
AND capacity_storage.timestamp::date <= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_finish#/>
|
||||||
order by tenant.wzcode, vdc.name, storage_profile_types.name;
|
group by tenant.wzcode, vdc.name, storage_profile_types.name, capacity_storage.timestamp::date
|
||||||
|
order by tenant.wzcode, vdc.name, storage_profile_types.name, capacity_storage.timestamp::date;
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
|
|
||||||
@@ -162,16 +177,16 @@ from qSpecification
|
|||||||
else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code
|
else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code
|
||||||
--,bucket_stat.placement_id
|
--,bucket_stat.placement_id
|
||||||
,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ
|
,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ
|
||||||
|
,bucket_stat.timestamp_addition::date as dt
|
||||||
from s3billing.bucket_stat
|
from s3billing.bucket_stat
|
||||||
join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
|
join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
|
||||||
join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
|
join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
|
||||||
where bucket_stat.placement_id in (1,2)
|
where bucket_stat.placement_id in (1,2)
|
||||||
AND bucket_stat.owner = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
AND bucket_stat.owner = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||||
AND bucket_stat.timestamp_addition::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
AND bucket_stat.timestamp_addition::date >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_start#/>
|
||||||
|
AND bucket_stat.timestamp_addition::date <= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_finish#/>
|
||||||
group by bucket_stat.owner, bucket_stat.placement_id
|
group by bucket_stat.owner, bucket_stat.placement_id, bucket_stat.timestamp_addition::date
|
||||||
order by bucket_stat.owner, bucket_stat.placement_id;
|
order by bucket_stat.owner, bucket_stat.placement_id, bucket_stat.timestamp_addition::date;
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
<cfif (ATTRIBUTES.debug)>
|
<cfif (ATTRIBUTES.debug)>
|
||||||
@@ -243,6 +258,7 @@ from qSpecification
|
|||||||
,bucket_info.placement_id
|
,bucket_info.placement_id
|
||||||
--category.name, bucket_info.name
|
--category.name, bucket_info.name
|
||||||
,'WZ'||lpad(user_info.name, 5, '0') as wz
|
,'WZ'||lpad(user_info.name, 5, '0') as wz
|
||||||
|
,usage_bucket_by_user.time::date as dt
|
||||||
from s3billing.usage_bucket_by_user
|
from s3billing.usage_bucket_by_user
|
||||||
join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id
|
join s3billing.user_info on usage_bucket_by_user.user_id=user_info.id
|
||||||
join s3billing.category on usage_bucket_by_user.category_id=category.id
|
join s3billing.category on usage_bucket_by_user.category_id=category.id
|
||||||
@@ -250,9 +266,10 @@ from qSpecification
|
|||||||
join s3billing.placement on bucket_info.placement_id=placement.id
|
join s3billing.placement on bucket_info.placement_id=placement.id
|
||||||
where 1=1
|
where 1=1
|
||||||
AND user_info.name = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
AND user_info.name = <cfqueryparam cfsqltype="cf_sql_varchar" value=#ATTRIBUTES.tenant_wz_index#/>
|
||||||
AND usage_bucket_by_user.time::date = <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
AND usage_bucket_by_user.time::date >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_start#/>
|
||||||
group by user_info.name, bucket_info.placement_id
|
AND usage_bucket_by_user.time::date <= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#attributes.dt_finish#/>
|
||||||
order by user_info.name, bucket_info.placement_id;
|
group by user_info.name, bucket_info.placement_id, usage_bucket_by_user.time::date
|
||||||
|
order by user_info.name, bucket_info.placement_id, usage_bucket_by_user.time::date;
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
<cfif (ATTRIBUTES.debug)>
|
<cfif (ATTRIBUTES.debug)>
|
||||||
@@ -263,22 +280,24 @@ from qSpecification
|
|||||||
|
|
||||||
<!--- собрали все метрики в один резалтсет --->
|
<!--- собрали все метрики в один резалтсет --->
|
||||||
<cfquery name="qUnifiedMetric" dbType="query">
|
<cfquery name="qUnifiedMetric" dbType="query">
|
||||||
select wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
|
select dt, wz, code || '.vcpu-m' as code, core_h as raw_metric, core_h as metric from qComputing
|
||||||
union all
|
union all
|
||||||
select wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric, gb_h as chargeable_metric from qComputing
|
select dt, wz, code || '.ram-m' as code, gb_h as raw_metric, gb_h as metric from qComputing
|
||||||
union all
|
union all
|
||||||
select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
|
select dt, wz, code, gb_h_used as raw_metric, gb_h_used as metric from qStorage
|
||||||
union all
|
union all
|
||||||
select wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric, vol_GB_free_tier_subtracted as chargeable_metric from qS3Vol
|
select dt, wz, code || '.vol-m', vol_b as raw_metric, vol_gb as metric from qS3Vol
|
||||||
union all
|
union all
|
||||||
select wz, code || '.get-m', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
select dt, wz, code || '.get-m', get as raw_metric, get_10k as metric from qS3OpsTrf
|
||||||
union all
|
union all
|
||||||
select wz, code || '.put-m', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
select dt, wz, code || '.put-m', put as raw_metric, put_10k as metric from qS3OpsTrf
|
||||||
union all
|
union all
|
||||||
select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
select dt, wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric from qS3OpsTrf
|
||||||
|
|
||||||
|
order by dt, code
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
<cfdump var=#qUnifiedMetric#/>
|
<!--- <cfdump var=#qUnifiedMetric#/> --->
|
||||||
<cfif (ATTRIBUTES.debug)>
|
<cfif (ATTRIBUTES.debug)>
|
||||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||||
<cfdump var=#qUnifiedMetric#/>
|
<cfdump var=#qUnifiedMetric#/>
|
||||||
@@ -296,20 +315,18 @@ from qSpecification
|
|||||||
|
|
||||||
<!--- Для декомпозиции на более мелкие объекты мы можем как полумеру - профильтровать по конкретному бакету или ВМ-ВДЦ
|
<!--- Для декомпозиции на более мелкие объекты мы можем как полумеру - профильтровать по конкретному бакету или ВМ-ВДЦ
|
||||||
Что не нравится - для ВМ у нас может быть целое дерево нижележащих объектов вместо линейного списка бакетов --->
|
Что не нравится - для ВМ у нас может быть целое дерево нижележащих объектов вместо линейного списка бакетов --->
|
||||||
<cfquery name="qCharge" dbType="query">
|
|
||||||
|
<!--- Вычитание Free Tier можно начинать с начала месяца - для этого можно сгруппировать по месяцам --->
|
||||||
|
<!--- Кажется, здесь еще рано агрегировать, если мы хотим OUTER JOIN --->
|
||||||
|
<cfquery name="qChargeDaily" dbType="query">
|
||||||
SELECT
|
SELECT
|
||||||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||||
<d:field title="Артикул">s.code</d:field>
|
<d:field title="Артикул">s.code</d:field>
|
||||||
<d:field title="Артикул">m.code as m_code</d:field>
|
<d:field title="Артикул">m.code as m_code</d:field>
|
||||||
<d:field title="Услуга">s.svc</d:field>
|
<d:field title="Услуга">s.svc</d:field>
|
||||||
<d:field title="Компонент">s.component</d:field>
|
<d:field title="Компонент">s.component</d:field>
|
||||||
<d:field title="Кол-во (метрика)" cfSqlType="CF_SQL_NUMERIC">m.chargeable_metric</d:field>
|
|
||||||
<d:field title="Ед.изм.">s.unit</d:field>
|
<d:field title="Ед.изм.">s.unit</d:field>
|
||||||
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">s.price*(100-s.discount)/100 as discounted_price</d:field>
|
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">s.price*(100-s.discount)/100 as discounted_price</d:field>
|
||||||
<d:field title="Стоимость &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">s.price*(100-s.discount)/100*m.chargeable_metric as charge</d:field>
|
|
||||||
<!--- <d:field title="Дата НОУ" cfSqlType="CF_SQL_TIMESTAMP">s.dt_from</d:field> --->
|
|
||||||
<!--- <d:field title="Дата оконч." cfSqlType="CF_SQL_TIMESTAMP">s.dt_to</d:field>
|
|
||||||
<d:field title="Ключ строки">s.line_key</d:field> --->
|
|
||||||
<d:field title="Цена с НДС" cfSqlType="CF_SQL_NUMERIC">s.price</d:field>
|
<d:field title="Цена с НДС" cfSqlType="CF_SQL_NUMERIC">s.price</d:field>
|
||||||
<d:field title="Скидка%" cfSqlType="CF_SQL_NUMERIC">s.discount</d:field>
|
<d:field title="Скидка%" cfSqlType="CF_SQL_NUMERIC">s.discount</d:field>
|
||||||
<d:field title="Сырая метрика" cfSqlType="CF_SQL_NUMERIC">m.raw_metric</d:field>
|
<d:field title="Сырая метрика" cfSqlType="CF_SQL_NUMERIC">m.raw_metric</d:field>
|
||||||
@@ -317,18 +334,61 @@ from qSpecification
|
|||||||
<d:field title="serviceStart" cfSqlType="CF_SQL_TIMESTAMP">s.serviceStart</d:field>
|
<d:field title="serviceStart" cfSqlType="CF_SQL_TIMESTAMP">s.serviceStart</d:field>
|
||||||
<d:field title="serviceEnd" cfSqlType="CF_SQL_TIMESTAMP">s.serviceEnd</d:field>
|
<d:field title="serviceEnd" cfSqlType="CF_SQL_TIMESTAMP">s.serviceEnd</d:field>
|
||||||
<d:field title="serviceHash">s.serviceHash</d:field>
|
<d:field title="serviceHash">s.serviceHash</d:field>
|
||||||
<d:field title="dt" cfSqlType="CF_SQL_TIMESTAMP"><cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>as dt</d:field>
|
<d:field title="serviceCustomName">s.serviceCustomName</d:field>
|
||||||
<!--- <d:field title="Клиентс. назв.">s.user_description</d:field> --->
|
<d:field title="dt" cfSqlType="CF_SQL_TIMESTAMP">m.dt</d:field>
|
||||||
|
<d:field title="free tier" cfSqlType="CF_SQL_NUMERIC">s.free_tier</d:field>
|
||||||
</d:field_set>
|
</d:field_set>
|
||||||
FROM qSpec as s, qUnifiedMetric as m
|
FROM qSpec as s, qUnifiedMetric as m
|
||||||
WHERE m.wz=<cfqueryparam cfsqltype="cf_sql_varchar" value=#request.auth.wz#/> AND s.code=m.code
|
WHERE m.wz=<cfqueryparam cfsqltype="cf_sql_varchar" value=#request.auth.wz#/>
|
||||||
AND s.serviceStart <= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/>
|
AND s.code=m.code
|
||||||
AND (<cfqueryparam cfsqltype="cf_sql_timestamp" value=#local.dt#/> <= s.serviceEnd OR s.serviceEnd IS NULL)
|
AND s.serviceStart <= m.dt
|
||||||
order by s.code
|
AND (m.dt <= s.serviceEnd OR s.serviceEnd IS NULL)
|
||||||
|
<!--- таким замысловатым способом мы реализуем FULL JOIN --->
|
||||||
|
UNION
|
||||||
|
SELECT NULL, m.code, NULL, NULL, NULL, NULL, NULL, NULL, m.raw_metric, m.metric, NULL, NULL, NULL, NULL, m.dt, 0
|
||||||
|
FROM qUnifiedMetric as m where m.code NOT IN (<cfqueryparam value="#ValueList(qSpec.code)#" cfsqltype="cf_sql_varchar" list="true">)
|
||||||
|
|
||||||
|
UNION
|
||||||
|
SELECT s.code, NULL, s.svc, s.component, s.unit, s.price*(100-s.discount)/100, s.price, s.discount, NULL, NULL, s.serviceStart, s.serviceEnd, s.serviceHash, s.serviceCustomName, NULL, 0
|
||||||
|
FROM qSpec as s where s.code NOT IN (<cfqueryparam value="#listRemoveDuplicates(ValueList(qUnifiedMetric.code))#" cfsqltype="cf_sql_varchar" list="true">)
|
||||||
|
|
||||||
|
order by m.dt, s.code
|
||||||
</cfquery>
|
</cfquery>
|
||||||
|
|
||||||
|
<cfquery name="qChargeMonthly" dbType="query">
|
||||||
|
SELECT
|
||||||
|
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||||
|
<d:field title="Артикул по договору">code</d:field>
|
||||||
|
<d:field title="Артикул по системам">m_code</d:field>
|
||||||
|
<d:field title="Услуга по каталогу">svc</d:field><!--- *** добавить пользовательское --->
|
||||||
|
<d:field title="Компонент">component</d:field>
|
||||||
|
<d:field title="Ед.изм.">unit</d:field>
|
||||||
|
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">discounted_price</d:field>
|
||||||
|
<d:field title="Сырая метрика" cfSqlType="CF_SQL_NUMERIC">sum(raw_metric) as raw_metric</d:field>
|
||||||
|
<d:field title="Приведенный объем" cfSqlType="CF_SQL_NUMERIC">sum(metric) as metric</d:field>
|
||||||
|
<d:field title="Объем к оплате" cfSqlType="CF_SQL_NUMERIC">sum(metric) - free_tier as chargeable_metric</d:field>
|
||||||
|
<d:field title="Сумма к оплате" cfSqlType="CF_SQL_NUMERIC">(sum(metric) - free_tier)*discounted_price as charge</d:field>
|
||||||
|
<d:field title="serviceStart" cfSqlType="CF_SQL_TIMESTAMP">serviceStart</d:field>
|
||||||
|
<d:field title="serviceEnd" cfSqlType="CF_SQL_TIMESTAMP">serviceEnd</d:field>
|
||||||
|
<d:field title="serviceHash">serviceHash</d:field>
|
||||||
|
<d:field title="serviceCustomName">serviceCustomName</d:field>
|
||||||
|
<d:field title="free tier" cfSqlType="CF_SQL_NUMERIC">free_tier</d:field>
|
||||||
|
<d:field title="Год" cfSqlType="CF_SQL_INTEGER">year(dt) as year</d:field>
|
||||||
|
<d:field title="Месяц" cfSqlType="CF_SQL_INTEGER">month(dt) as month</d:field>
|
||||||
|
</d:field_set>
|
||||||
|
from qChargeDaily
|
||||||
|
group by code, m_code, svc, serviceCustomName, component, unit, discounted_price, serviceStart, ServiceEnd, serviceHash, free_tier, year(dt), month(dt)
|
||||||
|
order by year(dt), month(dt), code, m_code
|
||||||
|
</cfquery>
|
||||||
|
<!--- в связи с бедностью языка QoQ (нет CASE) грубо патчим резалтсет --->
|
||||||
|
<cfloop query="qChargeMonthly">
|
||||||
|
<cfset qChargeMonthly.chargeable_metric = (chargeable_metric GT 0) ? chargeable_metric : 0/> <!--- имя в левой части должно быть квалифицировано запросом (резалтсетом) --->
|
||||||
|
<cfset qChargeMonthly.charge = (charge GT 0) ? charge : 0/>
|
||||||
|
</cfloop>
|
||||||
|
|
||||||
|
|
||||||
<!--- тут могут быть подводные камни с копированием и переиспользованием объектов --->
|
<!--- тут могут быть подводные камни с копированием и переиспользованием объектов --->
|
||||||
<cfif isQuery(qTotal)>
|
<!--- <cfif isQuery(qTotal)>
|
||||||
<cfquery name="qTotalNew" dbType="query">
|
<cfquery name="qTotalNew" dbType="query">
|
||||||
select * from qTotal
|
select * from qTotal
|
||||||
union all
|
union all
|
||||||
@@ -338,19 +398,19 @@ from qSpecification
|
|||||||
<cfelse>
|
<cfelse>
|
||||||
<cfset qTotal = qCharge/>
|
<cfset qTotal = qCharge/>
|
||||||
</cfif>
|
</cfif>
|
||||||
<cfdump var=#qTotal#/>
|
<cfdump var=#qTotal#/> --->
|
||||||
|
|
||||||
|
<!--- <cfdump var=#qChargeMonthly#/> --->
|
||||||
<!--- *** проверить краевые даты --->
|
<!--- *** проверить краевые даты --->
|
||||||
<cfif (ATTRIBUTES.debug)>
|
<cfif (ATTRIBUTES.debug)>
|
||||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||||
<cfdump var=#qCharge#/>
|
<cfdump var=#qChargeMonthly#/>
|
||||||
<cfflush/>
|
<cfflush/>
|
||||||
</cfif>
|
</cfif>
|
||||||
|
|
||||||
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
<cfoutput>#getTickCount() - request.startTickCount#</cfoutput>
|
||||||
<cfflush/>
|
<cfflush/>
|
||||||
</cfloop>
|
|
||||||
|
|
||||||
<cfdump var=#qTotal#/>
|
|
||||||
|
|
||||||
|
|
||||||
<cfset var report={}/>
|
<cfset var report={}/>
|
||||||
@@ -359,7 +419,7 @@ from qSpecification
|
|||||||
<cfset report.qStorageAge = qStorageAge/>
|
<cfset report.qStorageAge = qStorageAge/>
|
||||||
<cfset report.qS3VolAge = qS3VolAge/>
|
<cfset report.qS3VolAge = qS3VolAge/>
|
||||||
<cfset report.qS3OpsTrfAge = qS3OpsTrfAge/>
|
<cfset report.qS3OpsTrfAge = qS3OpsTrfAge/>
|
||||||
<cfset report.qCharge = qCharge/>
|
<cfset report.qCharge = qChargeMonthly/>
|
||||||
<cfset report.chargeTitleMap = titleMap/>
|
<cfset report.chargeTitleMap = titleMap/>
|
||||||
<cfset report.chargeFieldCount = fieldCount/>
|
<cfset report.chargeFieldCount = fieldCount/>
|
||||||
|
|
||||||
|
|||||||
@@ -85,14 +85,15 @@ S3 операции и трафик: <b>#dateFormat(report.qS3OpsTrfAge.dt_load,
|
|||||||
<th width="7%">Артикул</th>
|
<th width="7%">Артикул</th>
|
||||||
<th width="3%">Кол-во (метрика)</td>
|
<th width="3%">Кол-во (метрика)</td>
|
||||||
<th width="7%">Оплачиваемый объем</th>
|
<th width="7%">Оплачиваемый объем</th>
|
||||||
<th width="3%">Ед.изм.</th>
|
|
||||||
<th width="3%">Цена ₽ с НДС</th>
|
<th width="3%">Цена ₽ с НДС</th>
|
||||||
<th width="3%">Стоимость ₽ с НДС</th>
|
<th width="3%">Стоимость ₽ с НДС</th>
|
||||||
|
|
||||||
<td width="3%"> </td>
|
<th width="3%"> </th>
|
||||||
|
|
||||||
<td width="10%">Услуга</td>
|
<th width="10%">Услуга</th>
|
||||||
<td width="10%">Компонент</td>
|
<th width="10%">Компонент</th>
|
||||||
|
<th width="3%">Ед.изм.</th>
|
||||||
<!--- <td width="10%">Клиентс. назв.</td> --->
|
<!--- <td width="10%">Клиентс. назв.</td> --->
|
||||||
|
|
||||||
<!--- <td width="3%">GPL с НДС</td>
|
<!--- <td width="3%">GPL с НДС</td>
|
||||||
@@ -111,46 +112,57 @@ S3 операции и трафик: <b>#dateFormat(report.qS3OpsTrfAge.dt_load,
|
|||||||
|
|
||||||
</thead>
|
</thead>
|
||||||
|
|
||||||
<cfoutput query="report.qCharge" group="svc">
|
<!--- видимо, Free Tier и единицу измерения нужно брать и для строк, которые не найдены в договоре
|
||||||
<cfset var acc=0/>
|
(еше можно было бы туда для полноты добавлять GPL цену, но для этого нужен каталог)
|
||||||
|
Добавить реквизиты договора? --->
|
||||||
|
<cfoutput query="report.qCharge" group="year">
|
||||||
|
<cfoutput group="month">
|
||||||
|
<tr><td colspan="99"><b>#year#-#numberFormat(month,"00")#</b></td></tr>
|
||||||
|
<cfoutput group="svc">
|
||||||
|
<cfset var acc = 0/>
|
||||||
<tr>
|
<tr>
|
||||||
<td bgcolor="##ccc"></td>
|
<td bgcolor="##ccc"></td>
|
||||||
<td bgcolor="##ccc" colspan="5" class="b"> #svc#</td>
|
<td bgcolor="##ccc" colspan="9">
|
||||||
<td></td>
|
<b>#svc#</b>
|
||||||
<td bgcolor="##ccc" colspan="99"></td>
|
<cfif len(serviceCustomName)>(#serviceCustomName#)</cfif>
|
||||||
|
<cfif serviceHash EQ "">(не найдено в договоре)</cfif>
|
||||||
|
</td>
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
<cfoutput>
|
<cfoutput>
|
||||||
<cfset acc=acc+charge/>
|
|
||||||
|
<cfset acc += isNumeric(charge) ? charge : 0/>
|
||||||
<tr>
|
<tr>
|
||||||
<td>#currentRow#</a></td>
|
<td>#currentRow#</a></td>
|
||||||
|
|
||||||
<td>#code#</td>
|
<td>#code# <cfif code EQ "">(#m_code#)</cfif></td>
|
||||||
<td class="r">#metric#</td>
|
<td class="r">#metric#</td>
|
||||||
<td class="r" style="font-size:120%; padding:0 1em;">#chargeable_metric#</td>
|
<td class="r" style="font-size:120%; padding:0 1em;">#chargeable_metric#</td>
|
||||||
<td class="c" style="font-size:90%;">#unit#</td>
|
|
||||||
<td class="r">#discounted_price#</td>
|
|
||||||
<td class="r">#charge#</td>
|
|
||||||
|
|
||||||
<td></td>
|
<td class="r">#discounted_price#</td>
|
||||||
|
<td class="r">#numberFormat(charge,".00")#</td>
|
||||||
|
|
||||||
|
<td><!--- #acc# ---></td>
|
||||||
|
|
||||||
<td>#svc#</td>
|
<td>#svc#</td>
|
||||||
<td>#component#</td>
|
<td>#component#</td>
|
||||||
<!--- <td>#user_description#</td> --->
|
<td class="c">#unit#</td>
|
||||||
|
<!--- <td>#user_description#</td> --->
|
||||||
|
|
||||||
<!--- <td class="r">#price#</td>
|
<!--- <td class="r">#price#</td>
|
||||||
<td class="r">#discount#</td> --->
|
<td class="r">#discount#</td> --->
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</tr>
|
</tr>
|
||||||
</cfoutput>
|
</cfoutput>
|
||||||
<tr>
|
<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="4" class="r" style="border-bottom:2px solid gray;"><b>Итого</b> #svc#:</td>
|
<td bgcolor="##eee" colspan="4" class="r" style="border-bottom:2px solid gray;"><b>Итого</b> #svc#:</td>
|
||||||
<td bgcolor="##eee" colspan="1" class="r b" style="border-bottom:2px solid gray;">#NumFmt(acc,2)#</td>
|
<td bgcolor="##eee" colspan="1" class="r b" style="border-bottom:2px solid gray;">#NumFmt(acc,2)#</td>
|
||||||
<td colspan="14" style="border-bottom:2px solid gray;"></td>
|
<td colspan="12" style="border-bottom:2px solid gray;"></td>
|
||||||
</tr >
|
</tr >
|
||||||
</cfoutput>
|
</cfoutput>
|
||||||
|
</cfoutput>
|
||||||
|
</cfoutput>
|
||||||
|
|
||||||
</table>
|
</table>
|
||||||
<!--- <cfdump var=#qCharge#/> --->
|
<!--- <cfdump var=#qCharge#/> --->
|
||||||
|
|||||||
Reference in New Issue
Block a user