394 lines
19 KiB
Plaintext
394 lines
19 KiB
Plaintext
<cfsilent>
|
||
<cfimport prefix="m" taglib="lib"/>
|
||
<cfimport prefix="c" taglib="lib/controls"/>
|
||
<cfimport prefix="d" taglib="lib/data"/>
|
||
<cfimport prefix="layout" taglib="layout"/>
|
||
</cfsilent>
|
||
|
||
<m:prepare_ls entity="payg" accessObject="" pageInfoOut="pageInfo" trackOut="tr"/>
|
||
|
||
|
||
<cfparam name="dt_finish" type="date" default=#createDateTime(year(Now()),month(Now()),1,0,0,0)#/>
|
||
<cfparam name="dt_start" type="date" default=#dateAdd('m',-1,dt_finish)#/>
|
||
<cfset hours=dateDiff('h',dt_start,dt_finish)/>
|
||
|
||
|
||
|
||
|
||
|
||
<!--- Нужно еще применить политики бесплатного минимума --->
|
||
|
||
<cfquery name="qCode" datasource="dwh">
|
||
select distinct p.code
|
||
from elma.deals d
|
||
join elma.deals_services siv on (d.__id=ANY(siv.deal))
|
||
join elma.service_parametrs p on (p.__id = ANY(siv.params))
|
||
join elma.companies k on (d._companies=k.__id)
|
||
join elma.additional_agreements aa on (aa.__id = ANY(siv.additional_agreement))
|
||
join elma.aggrements a on (aa.contract_uid = a.__id)
|
||
where p.type=3 AND aa.is_actual
|
||
order by p.code
|
||
</cfquery>
|
||
<!--- <cfdump var=#qCode#/> --->
|
||
|
||
<cfquery name="qSpec" datasource="dwh">
|
||
select k.id_klienta as wz, k.__id::text as contragent_uid, p.code, p.price, p.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
|
||
,siv.date_nop as dt_from, siv.date_end as dt_to
|
||
/*,p.__name as line_key*/, p.ed_izm, aa.__name as additional_agreement, aa.__id::text as additional_agreement_uid
|
||
--, aa.is_actual
|
||
from elma.deals d
|
||
join elma.deals_services siv on (d.__id=ANY(siv.deal))
|
||
join elma.service_parametrs p on (p.__id = ANY(siv.params))
|
||
join elma.companies k on (d._companies=k.__id)
|
||
join elma.additional_agreements aa on (aa.__id = ANY(siv.additional_agreement))
|
||
join elma.aggrements a on (aa.contract_uid = a.__id)
|
||
where p.type=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)
|
||
order by k.id_klienta, p.code
|
||
</cfquery>
|
||
<cfquery name="qSivAge" datasource="dwh">
|
||
select max(dt_load) as dt_load from elma.deals_services
|
||
</cfquery>
|
||
<!--- здесь имеем список кодов с ценами и WZ. Каждому коду можно поставить в соответствие запрос, который даст по нему выборку. Изредка один запрос может вывести 2 кода, но разбить на 2 запроса легко. Кроме того, запросы можно объединить через union в один - может быть, так будет лучше читаться (быстрее выполняться не будет) --->
|
||
<cfif isDefined("DEBUG")>
|
||
<cfdump var=#qSpec#/>
|
||
<cfflush/>
|
||
</cfif>
|
||
|
||
|
||
<cfquery name="qComputing" datasource="billing-vc">
|
||
select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
|
||
case
|
||
when vdc.name like '%-v1cl1%' then 'iaas.ngc.i29'
|
||
when vdc.name like '%-v1cl2%' then 'iaas.ngc.i31'
|
||
when vdc.name like '%-v1cl4%' then 'iaas.ngc.a28'
|
||
when vdc.name like '%-v1cl6%' then 'iaas.ngc.i28'
|
||
else '['||vdc.name||']' end as code,
|
||
sum(cpu_used/cpu_speed)/4. as core_h,
|
||
sum(mem_used)/1024/4. as gb_h
|
||
from ngcloud_ru.capacity_resource
|
||
join ngcloud_ru.vdc on capacity_resource.vdc_id=vdc.id
|
||
join ngcloud_ru.tenant on tenant.id=vdc.tenant_id
|
||
where tenant.wzcode > 0
|
||
AND capacity_resource.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
||
AND capacity_resource.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
||
group by tenant.wzcode, vdc.name
|
||
order by tenant.wzcode, vdc.name;
|
||
</cfquery>
|
||
<!--- <cfdump var=#qComputing#/> --->
|
||
<cfquery name="qComputingAge" datasource="billing-vc">
|
||
select max(capacity_resource.timestamp) as dt_load from ngcloud_ru.capacity_resource
|
||
</cfquery>
|
||
|
||
<!--- переделать storage_profile_types с расшифровкой ssd, sata, можно прямо до каталожного кода --->
|
||
<cfquery name="qStorage" datasource="billing-vc">
|
||
select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
|
||
case
|
||
WHEN vdc.name LIKE '%-v1cl1%' THEN 'iaas.ngc.i29'
|
||
WHEN vdc.name LIKE '%-v1cl2%' THEN 'iaas.ngc.i31'
|
||
WHEN vdc.name LIKE '%-v1cl4%' THEN 'iaas.ngc.a28'
|
||
WHEN vdc.name LIKE '%-v1cl6%' THEN 'iaas.ngc.i28'
|
||
ELSE '['||vdc.name||']' END
|
||
|| CASE
|
||
WHEN storage_profile_types.name ILIKE '%-SSD%' THEN '.ssd-m'
|
||
WHEN storage_profile_types.name ILIKE '%-SAS' THEN '.sas-m'
|
||
WHEN storage_profile_types.name ILIKE '%-SATA' THEN '.sata-m'
|
||
ELSE '.['|| storage_profile_types.name ||']' END
|
||
as code,
|
||
storage_profile_types.name, -- *** это не тип, а профайл
|
||
sum("limit")/1024./4 as gb_h_limit, -- 4 потому, что сбор раз в 15 минут
|
||
sum(used)/1024./4 as gb_h_used
|
||
from ngcloud_ru.capacity_storage
|
||
join ngcloud_ru.vdc on capacity_storage.vdc_id=vdc.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
|
||
where tenant.wzcode > 0
|
||
AND capacity_storage.timestamp >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
||
AND capacity_storage.timestamp < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
||
group by tenant.wzcode, vdc.name, storage_profile_types.name
|
||
order by tenant.wzcode, vdc.name, storage_profile_types.name;
|
||
</cfquery>
|
||
<cfquery name="qStorageAge" datasource="billing-vc">
|
||
select max(capacity_storage.timestamp) as dt_load from ngcloud_ru.capacity_storage
|
||
</cfquery>
|
||
<!--- <cfdump var=#qStorage#/> --->
|
||
|
||
<!---
|
||
"placement" "size_gb" "get_10k" "put_10k" "bytes_sent_gb"
|
||
HOT_FREE_LIMIT 1 10 1 100
|
||
--->
|
||
<!--- надо дисконтировать не ГБ-часы а ГБ-месяцы --->
|
||
<cfquery name="qS3Vol" datasource="billing-s3">
|
||
select /* *** ниже дублирование кода агрегации - round ceil etc, обратить внимание при правке */
|
||
(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>) as vol_B
|
||
,ceil(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>/1024/1024/1024) as vol_GB
|
||
,greatest(ceil(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>
|
||
/1024/1024/1024)-
|
||
case when bucket_stat.placement_id = 1 then 1 else 0 end, 0) as vol_GB_free_tier_subtracted /*считается не в точности так, как в функции*/
|
||
,case
|
||
when bucket_stat.placement_id = 1 then 'paas.s3.ceph'
|
||
when bucket_stat.placement_id = 2 then 'paas.s3.cphc'
|
||
else '['|| TO_CHAR(bucket_stat.placement_id,'FM9') ||']' end as code
|
||
--,bucket_stat.placement_id
|
||
,'WZ'||lpad(bucket_stat.owner, 5, '0') as wz -- *** здесь не число, а строка, поэтому другая формула обратной сборки WZ
|
||
|
||
from s3billing.bucket_stat
|
||
join s3billing.placement ON s3billing.placement.id=bucket_stat.placement_id
|
||
join s3billing.bucket_info ON bucket_info.id=bucket_stat.bucket_id
|
||
where bucket_stat.placement_id in (1,2)
|
||
AND bucket_stat.timestamp_addition >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
||
AND bucket_stat.timestamp_addition < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
||
group by bucket_stat.owner, bucket_stat.placement_id
|
||
order by bucket_stat.owner, bucket_stat.placement_id;
|
||
</cfquery>
|
||
<!--- <cfdump var=#qS3Vol#/> --->
|
||
<cfquery name="qS3VolAge" datasource="billing-s3">
|
||
select max(timestamp_addition) as dt_load from s3billing.bucket_stat
|
||
</cfquery>
|
||
|
||
<cfquery name="qS3OpsTrf" datasource="billing-s3">
|
||
select
|
||
sum(
|
||
CASE WHEN
|
||
(category.name LIKE 'get%'
|
||
OR category.name LIKE 'head%'
|
||
OR category.name LIKE 'options%'
|
||
) THEN ops ELSE 0 END
|
||
) as get
|
||
,ceil(sum(
|
||
CASE WHEN
|
||
(category.name LIKE 'get%'
|
||
OR category.name LIKE 'head%'
|
||
OR category.name LIKE 'options%'
|
||
) THEN ops ELSE 0 END
|
||
)/10000) as get_10k
|
||
,greatest(ceil(sum(
|
||
CASE WHEN
|
||
(category.name LIKE 'get%'
|
||
OR category.name LIKE 'head%'
|
||
OR category.name LIKE 'options%'
|
||
) THEN ops ELSE 0 END
|
||
)/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 10 ELSE 0 END, 0
|
||
) as get_10k_free_tier_subtracted
|
||
|
||
,sum(
|
||
CASE WHEN
|
||
(category.name LIKE 'put%'
|
||
OR category.name LIKE 'post%'
|
||
OR category.name LIKE 'patch%'
|
||
OR category.name LIKE 'list%'
|
||
) THEN ops ELSE 0 END
|
||
) as put
|
||
,ceil(sum(
|
||
CASE WHEN
|
||
(category.name LIKE 'put%'
|
||
OR category.name LIKE 'post%'
|
||
OR category.name LIKE 'patch%'
|
||
OR category.name LIKE 'list%'
|
||
) THEN ops ELSE 0 END
|
||
)/10000) as put_10k
|
||
,greatest(ceil(sum(
|
||
CASE WHEN
|
||
(category.name LIKE 'put%'
|
||
OR category.name LIKE 'post%'
|
||
OR category.name LIKE 'patch%'
|
||
OR category.name LIKE 'list%'
|
||
) THEN ops ELSE 0 END
|
||
)/10000) - CASE WHEN bucket_info.placement_id = 1 THEN 1 ELSE 0 END, 0
|
||
) as put_10k_free_tier_subtracted
|
||
|
||
,(sum(bytes_sent)) as bytes_sent
|
||
,ceil(sum(bytes_sent)/1024/1024/1024) as bytes_sent_GB
|
||
,greatest(ceil(sum(bytes_sent)/1024/1024/1024) - CASE WHEN bucket_info.placement_id = 1 THEN 100 ELSE 0 END, 0
|
||
) as bytes_sent_GB_free_tier_subtracted
|
||
|
||
,case
|
||
when bucket_info.placement_id = 1 then 'paas.s3.ceph'
|
||
when bucket_info.placement_id = 2 then 'paas.s3.cphc'
|
||
else '['|| TO_CHAR(bucket_info.placement_id,'FM9') ||']' end as code --*** зачем делать там ключ bigint
|
||
,bucket_info.placement_id
|
||
--category.name, bucket_info.name
|
||
,'WZ'||lpad(user_info.name, 5, '0') as wz
|
||
from s3billing.usage_bucket_by_user
|
||
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.bucket_info on usage_bucket_by_user.bucketid=bucket_info.id
|
||
join s3billing.placement on bucket_info.placement_id=placement.id
|
||
where 1=1
|
||
AND usage_bucket_by_user.time >= <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_start#/>
|
||
AND usage_bucket_by_user.time < <cfqueryparam cfsqltype="cf_sql_timestamp" value=#dt_finish#/>
|
||
group by user_info.name, bucket_info.placement_id
|
||
order by user_info.name, bucket_info.placement_id;
|
||
</cfquery>
|
||
<cfquery name="qS3OpsTrfAge" datasource="billing-s3">
|
||
select max(time) as dt_load from s3billing.usage_bucket_by_user
|
||
</cfquery>
|
||
<!--- <cfdump var=#qS3OpsTrf#/> --->
|
||
|
||
<cfquery name="qUnifiedMetric" dbType="query">
|
||
select wz, code || '.cpu-m' as code, core_h as raw_metric, core_h as metric, core_h as chargeable_metric from qComputing
|
||
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
|
||
union all
|
||
select wz, code, gb_h_used as raw_metric, gb_h_used as metric, gb_h_used as chargeable_metric from qStorage
|
||
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
|
||
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
|
||
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
|
||
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
|
||
</cfquery>
|
||
<cfif isDefined("DEBUG")>
|
||
<cfdump var=#qUnifiedMetric#/>
|
||
<cfflush/>
|
||
</cfif>
|
||
|
||
<cfquery name="qCharge" dbType="query">
|
||
SELECT
|
||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||
<d:field title="WZ">s.wz</d:field>
|
||
<d:field title="Артикул">s.code</d:field>
|
||
<d:field title="Кол-во (метрика)" cfSqlType="CF_SQL_NUMERIC">m.chargeable_metric</d:field>
|
||
<d:field title="Ед.изм.">s.ed_izm</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="GPL с НДС" 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">m.raw_metric</d:field>
|
||
<d:field title="Приведен­ная метрика" cfSqlType="CF_SQL_NUMERIC">m.metric</d:field>
|
||
<d:field title="Контрагент">s.contragent</d:field>
|
||
<d:field title="contragent_uid">s.contragent_uid</d:field>
|
||
<d:field title="Договор">s.contract</d:field>
|
||
<d:field title="contract_uid">s.contract_uid</d:field>
|
||
<d:field title="Допник">s.additional_agreement</d:field>
|
||
<d:field title="additional_agreement_uid">s.additional_agreement_uid</d:field>
|
||
<d:field title="Сделка">s.deal</d:field>
|
||
<d:field title="deal_uid">s.deal_uid</d:field>
|
||
<d:field title="Абстрактная услуга">s.abstract_service</d:field>
|
||
<d:field title="Модификатор">s.modifier</d:field>
|
||
<d:field title="Клиентс. назв.">s.user_description</d:field>
|
||
</d:field_set>
|
||
FROM qSpec as s, qUnifiedMetric as m WHERE s.wz=m.wz AND s.code=m.code
|
||
order by s.wz, s.code
|
||
</cfquery>
|
||
<!--- looks like QoQ does not support join syntax, at least of Lucee 5.4--->
|
||
|
||
|
||
|
||
<cfif isDefined("output_xls")>
|
||
<layout:xml qRead=#qCharge# titleMap=#titleMap# filename="#pageInfo.entity#.xml"/>
|
||
<cfabort/>
|
||
</cfif><cfif isDefined("output_json")>
|
||
<layout:json qRead=#qCharge# titleMap=#titleMap# filename="#pageInfo.entity#.json"/>
|
||
<cfabort/>
|
||
</cfif><!---
|
||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||
|
||
<layout:attribute name="title">
|
||
<cfoutput><b>Отчет по PAYG</b></cfoutput>
|
||
</layout:attribute>
|
||
<layout:attribute name="controls">
|
||
<!---skip filter link, filter is not implemented--->
|
||
<!---<layout:language_switch/>--->
|
||
</layout:attribute>
|
||
</layout:page>
|
||
|
||
Внимание! округление вверх при расчете метрик get, put S3. Расчетные суммы могут содержать погрешности округления, поэтому окончательный расчет стоимости (количество * цену) должен выполняться в бухгалтерской программе.
|
||
<b>Если у клиента больше 1 действующего допника с услугами PAYG, то данные в отчете могут быть замножены, в этом случае считать вручную</b>
|
||
<br/>
|
||
Даты актуальности пока проверять вручную. Обращать внимание на замножение строк.
|
||
<cfoutput>
|
||
<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')#"/>
|
||
<input type="submit" style="cursor:pointer;"/>
|
||
<input type="submit" name="DEBUG" value="DEBUG" style="cursor:pointer;"/>
|
||
</form>
|
||
Часов в периоде: <b>#hours#</b> Строк в отчете: <b>#qCharge.recordCount#</b><br/>
|
||
Актуальность данных:
|
||
VCD Computing: <b>#dateFormat(qComputingAge.dt_load,'YYYY-MM-DD')# #timeFormat(qComputingAge.dt_load,'HH:MM:SS')#</b>
|
||
VCD Storage: <b>#dateFormat(qStorageAge.dt_load,'YYYY-MM-DD')# #timeFormat(qStorageAge.dt_load,'HH:MM:SS')#</b>
|
||
S3 хранение: <b>#dateFormat(qS3VolAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3VolAge.dt_load,'HH:MM:SS')#</b>
|
||
S3 операции и трафик: <b>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-MM-DD')# #timeFormat(qS3OpsTrfAge.dt_load,'HH:MM:SS')#</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>
|
||
|
||
<a href="#request.thisPage#?output_json" title="экспорт в json" style="margin-left:.5em; height:100%;" target="_blank"><img src="img/json.svg" style="vertical-align:text-bottom;" width="13" height="13"/></a>
|
||
</cfoutput>
|
||
<table class="worktable">
|
||
<thead>
|
||
<td width="1%"></td>
|
||
<th width="3%">WZ</th>
|
||
<th width="7%">Артикул</th>
|
||
<th width="7%">Кол-во (метрика)</th>
|
||
<th width="3%">Ед.изм.</th>
|
||
<th width="3%">Цена ₽ с НДС</th>
|
||
<th width="3%">Стоимость ₽ с НДС</th>
|
||
<td width="3%"> </td>
|
||
<td width="6%">Дата НОУ</td>
|
||
<td width="6%">Дата оконч.</td>
|
||
<td width="3%">Ключ строки</td>
|
||
<td width="3%">GPL с НДС</td>
|
||
<td width="3%">Скидка%</td>
|
||
<td width="3%">Сырая метрика</td>
|
||
<td width="3%">Приведен­ная метрика</td>
|
||
<td width="7%">Контрагент</td>
|
||
<td width="5%">Договор</td>
|
||
<td width="10%">Допник</td>
|
||
<td width="10%">Сделка</td>
|
||
<td width="10%">Услуга</td>
|
||
<td width="8%">Клиентс. назв.</td>
|
||
</thead>
|
||
|
||
<cfoutput query="qCharge" group="wz">
|
||
<cfset var acc=0/>
|
||
<cfoutput>
|
||
<cfset acc=acc+charge/>
|
||
<tr>
|
||
<td>#currentRow#</a></td>
|
||
<td><a href="contragent.cfm?__id=#contragent_uid#&#tr.fwx#">#wz#</a></td>
|
||
<td>#code#</td>
|
||
<td class="r" style="font-size:120%; padding:0 1em;">#chargeable_metric#</td>
|
||
<td class="c" style="font-size:90%;">#ed_izm#</td>
|
||
<td class="r">#discounted_price#</td>
|
||
<td class="r">#charge#</td>
|
||
<td></td>
|
||
<td class="r">#dateFormat(dt_from,'YYYY-MM-DD')#</td>
|
||
<td class="r">#dateFormat(dt_to,'YYYY-MM-DD')#</td>
|
||
<td class="r">#line_key#</td>
|
||
<td class="r">#price#</td>
|
||
<td class="r">#discount#</td>
|
||
<td class="r" style="color:lightgray">#raw_metric#</td>
|
||
<td class="r">#metric#</td>
|
||
<td><a href="contragent.cfm?__id=#contragent_uid#&#tr.fwx#">#contragent#</a></td>
|
||
<td><a href="contract.cfm?__id=#contract_uid#&#tr.fwx#">#contract#</a></td>
|
||
<td><a href="additional_agreement.cfm?__id=#additional_agreement_uid#&#tr.fwx#">#additional_agreement#</a></td>
|
||
<td><a href="deal.cfm?__id=#deal_uid#&#tr.fwx#">#deal#</a></td>
|
||
<td>#abstract_service# #modifier#</td>
|
||
<td>#user_description#</td>
|
||
</tr>
|
||
</cfoutput>
|
||
<tr>
|
||
<td bgcolor="##ccc"></td>
|
||
<td bgcolor="##ccc" colspan="5" class="b"><a href="contragent.cfm?__id=#contragent_uid#&#tr.fwx#">#wz#</a> #contragent#</td>
|
||
<td bgcolor="##ccc" colspan="1" class="r b">#NumFmt(acc,2)#</td>
|
||
<td colspan="14"></td>
|
||
</tr>
|
||
</cfoutput>
|
||
|
||
</table>
|
||
<!--- <cfdump var=#qCharge#/> --->
|
||
|
||
|
||
<layout:page section="footer"/>
|
||
|
||
<!--- select * from s3billing.billing_per_user_fix_pl('2025-05-01 00:00:00','2025-06-01 00:00:00','1395'); --->
|
||
|