126 tenant metadata
This commit is contained in:
+1
-1
@@ -97,7 +97,7 @@
|
||||
|
||||
|
||||
<cfset request.RECORDS_PER_PAGE=500/>
|
||||
<cfset request.APP_VERSION="0.00.025"/>
|
||||
<cfset request.APP_VERSION="0.00.026"/>
|
||||
<cfset request.STAND=getStand()/>
|
||||
|
||||
<cflock scope="application" type="readonly" timeout=3>
|
||||
|
||||
@@ -1,307 +0,0 @@
|
||||
<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:silent silent="No">
|
||||
|
||||
<cffunction name="plain2HtmClean">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn request.plain2htm(request.cleanHtm(s))/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="cleanInput">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn htmlEditFormat(s)/>
|
||||
</cffunction>
|
||||
|
||||
<m:prepare_detail entity="additional_agreement" accessObject="" key="__id" pageInfoOut="pageInfo"/>
|
||||
|
||||
<d:bean readonly=true table="elma.additional_agreements" datasource="#request.DS#" output="d" status="status">
|
||||
<d:param field="__id" type="uuid" key/>
|
||||
<d:param field="__name" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<!--- <d:param field="__createdAt" type="timestamp" forNull=""/> тут нужно добавлять в селект кавычки
|
||||
<d:param field="__createdBy" type="uuid" forNull=""/>
|
||||
<d:param field="__updatedAt" type="timestamp" forNull=""/>
|
||||
<d:param field="__updatedBy" type="uuid" forNull=""/>
|
||||
<d:param field="__deletedAt" type="timestamp" forNull=""/> --->
|
||||
<d:param field="documents" type="ARRAY" forNull=""/>
|
||||
<d:param field="contract_uid" type="uuid" forNull=""/>
|
||||
<d:param field="__index" type="integer" forNull="" default="0" init="0"/>
|
||||
<d:param field="index" type="integer" forNull="" default="0" init="0"/>
|
||||
<!--- <d:param field="services" type="ARRAY" forNull=""/> --->
|
||||
<d:param field="is_actual" type="bit" forNull=""/>
|
||||
<d:param field="last_aa" type="bit" forNull=""/>
|
||||
<!--- <d:param field="services_::text as services_" type="ARRAY" forNull=""/> --->
|
||||
<d:param field="deal_uid" type="uuid" forNull=""/>
|
||||
<d:param field="base_by" type="ARRAY" forNull=""/>
|
||||
<d:param field="__index" type="integer" forNull="" default="0" init="0"/>
|
||||
<d:param field="dt_load" type="timestamp"/>
|
||||
</d:bean>
|
||||
|
||||
|
||||
<m:dispatch_detail
|
||||
usePRG="No"<!---*** --->
|
||||
pageInfo=#pageInfo#
|
||||
id="#d.__id#"
|
||||
status=#pageInfo.status#
|
||||
trackOut="tr"
|
||||
idAttributesOut="id"
|
||||
/>
|
||||
|
||||
<!--- decoration --->
|
||||
<cfquery name="qDecoration" datasource="#request.DS#">
|
||||
select
|
||||
c.__name as contract
|
||||
,c.date_of_aggrement
|
||||
,c.date_end_aggrement
|
||||
,k.__name as contragent
|
||||
,k.id_klienta as wz
|
||||
from elma.aggrements c
|
||||
left outer join elma.companies k on (c.company_uid=k.__id)
|
||||
where c.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.contract_uid# null=#!isValid("guid",d.contract_uid)#/>
|
||||
</cfquery>
|
||||
|
||||
|
||||
</m:silent><!---
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||||
<layout:attribute name="title">
|
||||
<cfoutput>
|
||||
Дополнительное соглашение
|
||||
<cfif len(d.__id)>
|
||||
<b>#d.__name#</b>
|
||||
[#d.__id#]
|
||||
</cfif>
|
||||
</cfoutput>
|
||||
</layout:attribute>
|
||||
</layout:page>
|
||||
|
||||
<!--- <cfif status.errorState GT 0>
|
||||
<cfoutput><div class="err">#status.errorMessage#</div></cfoutput>
|
||||
</cfif>
|
||||
--->
|
||||
<cfoutput>
|
||||
<input type="hidden" name="__id" value="#d.__id#"/>
|
||||
<input type="hidden" name="track" value="#tr.self#"/>
|
||||
<input type="hidden" name="pass" value=""/><!--- pass marker to prevent save on submit --->
|
||||
|
||||
<div class="detail">
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">__id</div>
|
||||
<div class="td">#d.__id# __index #d.__index#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Название</div>
|
||||
<div class="td">#d.__name#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Версия (index)</div>
|
||||
<div class="td">#d.index#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Версии</div>
|
||||
<div class="td">
|
||||
<cfquery name="qVer">
|
||||
with
|
||||
s(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select
|
||||
index
|
||||
, a.__id::text
|
||||
, d.__id::text as deal_uid
|
||||
, a.__name
|
||||
, d.__status_status
|
||||
, s.status
|
||||
, s.probability_pc
|
||||
from elma.additional_agreements a
|
||||
left outer join elma.deals d on (a.deal_uid=d.__id)
|
||||
left outer join s on (d.__status_status=s.status_id)
|
||||
where a.contract_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#d.contract_uid# null=#!isValid("guid",d.contract_uid)#/>
|
||||
order by index
|
||||
</cfquery>
|
||||
<cfloop query=#qVer#>
|
||||
<cfif __id EQ toString(d.__id)>
|
||||
#index#: #__name#
|
||||
<cfelse>
|
||||
<a href="additional_agreement.cfm?__id=#__id#&#tr.fwx#">#index#: #__name# </a>
|
||||
</cfif>
|
||||
<a href="deal.cfm?__id=#deal_uid#&#tr.fwx#">(#__status_status#: #probability_pc#%)</a>
|
||||
<cfif qVer.currentRow LT qVer.recordCount>|</cfif>
|
||||
</cfloop>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Договор</div>
|
||||
<div class="td">
|
||||
<cfif len(d.contract_uid)>
|
||||
<a href="contract.cfm?__id=#d.contract_uid#&#tr.fwx#"><b>#qDecoration.contract#</b> #dateFormat(qDecoration.date_of_aggrement,'DD.MM.YYYY')#
|
||||
[#d.contract_uid#]</a>
|
||||
#qDecoration.contragent# #qDecoration.wz#
|
||||
</cfif>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">is_actual</div>
|
||||
<div class="td">#d.is_actual#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Последнее в цепочке</div>
|
||||
<div class="td">#d.last_aa#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Сделка</div>
|
||||
<div class="td">
|
||||
<cfif len(d.deal_uid)>
|
||||
<a href="deal.cfm?__id=#d.deal_uid#&#tr.fwx#">#d.deal_uid#</a>
|
||||
<cfquery name="qDeal">
|
||||
with
|
||||
s(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select d.__id::text
|
||||
, d.__name
|
||||
, d.__status_status
|
||||
, s.status
|
||||
, s.probability_pc
|
||||
from elma.deals d
|
||||
left outer join s on (d.__status_status=s.status_id)
|
||||
where d.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.deal_uid# null=#!isValid("guid",d.deal_uid)#/>
|
||||
</cfquery>
|
||||
#qDeal.__name#
|
||||
(#qDeal.status#:
|
||||
#qDeal.probability_pc#%)
|
||||
</cfif>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Услуги</div>
|
||||
<div class="td">
|
||||
<cfquery name="qService_">
|
||||
select services_::text
|
||||
from elma.additional_agreements a
|
||||
where a.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
#qService_.services_# (обратная ссылка)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">base_by</div>
|
||||
<div class="td">
|
||||
<cfquery name="qBaseBy">
|
||||
select b.__id::text
|
||||
, b.__name
|
||||
from elma.additional_agreements a
|
||||
join elma.additional_agreements b on (b.__id = ANY(a.base_by))
|
||||
where a.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
<a href="additional_agreement.cfm?__id=#qBaseBy.__id#&#tr.fwx#">#qBaseBy.__id#</a>
|
||||
#qBaseBy.__name#
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</cfoutput>
|
||||
|
||||
<layout:page section="extension" closeForm="Yes"/>
|
||||
|
||||
<cfif len(d.__id)>
|
||||
<cfquery name="qService">
|
||||
select
|
||||
siv.__id
|
||||
,siv.__name
|
||||
,siv.user_description
|
||||
,siv.discount
|
||||
,siv.cnt
|
||||
,siv.modifier_code
|
||||
,siv.abstractive_service_code
|
||||
,siv.is_actual
|
||||
,siv.type
|
||||
,siv.hash
|
||||
,siv.version
|
||||
,siv.name_version
|
||||
,siv.date_accept
|
||||
,siv.__index
|
||||
,siv.date_nop
|
||||
,siv.date_end
|
||||
,siv.is_easy
|
||||
,siv.params::text
|
||||
from elma.deals_services siv
|
||||
where <cfqueryparam cfsqltype="cf_sql_other" value="#d.__id#" null=#!isValid("guid",d.__id)#/>=ANY(siv.additional_agreement)
|
||||
order by type
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<h4>Услуги (строки спецификации) (#qService.recordCount#)</h4>
|
||||
</cfoutput>
|
||||
|
||||
<!--- <layout:render_query query=#qService#/> --->
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__id</th>
|
||||
<!--- <th>__name</th> --->
|
||||
<th>user_description</th>
|
||||
<th>Кол-во</th>
|
||||
<th>Скидка</th>
|
||||
<th>abstractive_service_code</th>
|
||||
<th>modifier_code</th>
|
||||
<th>is_actual</th>
|
||||
<th>type</th>
|
||||
<th>hash</th>
|
||||
<th>version</th>
|
||||
<th>name_version</th>
|
||||
<th>date_accept</th>
|
||||
<th>__index</th>
|
||||
<th>date_nop</th>
|
||||
<th>date_end</th>
|
||||
<th>is_easy</th>
|
||||
<th>params</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<cfoutput query="qService">
|
||||
<tr>
|
||||
<td class="c"><a href="deal_service.cfm?__id=#__id#&#tr.fwx#">#__id#</a></td>
|
||||
<!--- <td class="c">#__name#</td> --->
|
||||
<td class="c">#user_description#</td>
|
||||
<td class="c">#cnt#</td>
|
||||
<td class="c">#discount#</td>
|
||||
<td class="c">#abstractive_service_code#</td>
|
||||
<td class="c">#modifier_code#</td>
|
||||
<td class="c">#is_actual#</td>
|
||||
<td class="c">#type#</td>
|
||||
<td class="c">#hash#</td>
|
||||
<td class="c">#version#</td>
|
||||
<td class="c">#name_version#</td>
|
||||
<td class="c">#date_accept#</td>
|
||||
<td class="c">#__index#</td>
|
||||
<td class="c">#dateFormat(date_nop,'YYYY-MM-DD')#</td>
|
||||
<td class="c">#dateFormat(date_end,'YYYY-MM-DD')#</td>
|
||||
<td class="c"><cfif is_easy GT 0>Простая<cfelse>Композитная</cfif></td>
|
||||
<td class="c">#params#</td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
</cfif>
|
||||
|
||||
|
||||
<layout:page section="footer"/>
|
||||
@@ -1,210 +0,0 @@
|
||||
<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:silent silent="No">
|
||||
|
||||
<cffunction name="plain2HtmClean">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn request.plain2htm(request.cleanHtm(s))/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="cleanInput">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn htmlEditFormat(s)/>
|
||||
</cffunction>
|
||||
|
||||
<m:prepare_detail entity="contract" accessObject="" key="__id" pageInfoOut="pageInfo"/>
|
||||
|
||||
<d:bean readonly=true table="elma.aggrements" datasource="#request.DS#" output="d" status="status">
|
||||
<d:param field="__id" type="uuid" key/>
|
||||
<d:param field="__name" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="company_uid" type="uuid"/>
|
||||
<d:param field="date_of_aggrement" type="timestamp"/>
|
||||
<d:param field="date_end_aggrement" type="timestamp"/>
|
||||
</d:bean>
|
||||
|
||||
|
||||
<m:dispatch_detail
|
||||
usePRG="No"<!---*** --->
|
||||
pageInfo=#pageInfo#
|
||||
id="#d.__id#"
|
||||
status=#pageInfo.status#
|
||||
trackOut="tr"
|
||||
idAttributesOut="id"
|
||||
/>
|
||||
|
||||
<!--- decoration --->
|
||||
<cfquery name="qDecoration" datasource="#request.DS#">
|
||||
select
|
||||
__name as contragent, id_klienta as wz
|
||||
from elma.companies k
|
||||
where k.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.company_uid# null=#!isValid('guid',d.company_uid)#/>
|
||||
</cfquery>
|
||||
|
||||
|
||||
</m:silent><!---
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||||
<layout:attribute name="title">
|
||||
<cfoutput>
|
||||
Договор
|
||||
<cfif len(d.__id)>
|
||||
<b>#d.__name#</b>
|
||||
[#d.__id#]
|
||||
</cfif>
|
||||
</cfoutput>
|
||||
</layout:attribute>
|
||||
</layout:page>
|
||||
|
||||
<!--- <cfif status.errorState GT 0>
|
||||
<cfoutput><div class="err">#status.errorMessage#</div></cfoutput>
|
||||
</cfif>
|
||||
--->
|
||||
<cfoutput>
|
||||
<input type="hidden" name="__id" value="#d.__id#"/>
|
||||
<input type="hidden" name="track" value="#tr.self#"/>
|
||||
<input type="hidden" name="pass" value=""/><!--- pass marker to prevent save on submit --->
|
||||
|
||||
<div class="detail">
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">__id</div>
|
||||
<div class="td">#d.__id#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Номер договора</div>
|
||||
<div class="td">#d.__name#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Контрагент</div>
|
||||
<div class="td">
|
||||
<a href="contragent.cfm?__id=#d.company_uid#&#tr.fwx#">
|
||||
#qDecoration.contragent# #qDecoration.wz# [#d.company_uid#]
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Дата договора</div>
|
||||
<div class="td">#dateFmt(d.date_of_aggrement)#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Дата окончания договора</div>
|
||||
<div class="td">#dateFmt(d.date_end_aggrement)#</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</cfoutput>
|
||||
|
||||
<layout:page section="extension" closeForm="Yes"/>
|
||||
|
||||
<cfif len(d.__id)>
|
||||
<cfquery name="qAdditionalAgreement">
|
||||
with
|
||||
s(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select
|
||||
a.__id::text
|
||||
,a.__name
|
||||
,a.__index
|
||||
,a.contract_uid::text
|
||||
,a.is_actual
|
||||
,a.last_aa
|
||||
,a.index
|
||||
,a.deal_uid::text
|
||||
,a.base_by[1]::text as base_by_uid
|
||||
,b.__name as base_by_name
|
||||
,b.__index as base_by_index
|
||||
,d.__name as deal
|
||||
,d.__status_status as status_id
|
||||
,s.status
|
||||
,s.probability_pc
|
||||
from elma.additional_agreements a
|
||||
left outer join elma.deals d on (a.deal_uid=d.__id)
|
||||
left outer join s on (d.__status_status=s.status_id)
|
||||
left outer join elma.additional_agreements b on (a.base_by[1]=b.__id)
|
||||
where a.contract_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#d.__id#" null=#!isValid('guid',d.__id)#/>
|
||||
order by 1
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<h4>Дополнительные соглашения (#qAdditionalAgreement.recordCount#)</h4>
|
||||
</cfoutput>
|
||||
<!--- <cfdump var=#qAdditionalAgreements#/> --->
|
||||
<!--- <layout:render_query query=#qAdditionalAgreement#/> --->
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__index</th>
|
||||
<th>__id</th>
|
||||
<th>__name</th>
|
||||
<th>версия</th>
|
||||
<!--- <th>contract_uid</th> --->
|
||||
<th>is_actual</th>
|
||||
<th>last_aa</th>
|
||||
<th>deal_uid</th>
|
||||
<th>deal</th>
|
||||
<th>status_id</th>
|
||||
<th>status</th>
|
||||
<th>вер-ть</th>
|
||||
<th>base_by_index</th>
|
||||
<th>base_by_uid</th>
|
||||
<th>base_by_name</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<cfoutput query="qAdditionalAgreement">
|
||||
<tr>
|
||||
|
||||
<td><a href="additional_agreement.cfm?__id=#__id#&#tr.fwx#">#__index#</a></td>
|
||||
<td><a href="additional_agreement.cfm?__id=#__id#&#tr.fwx#">#__id#</a></td>
|
||||
<td>#__name#</td>
|
||||
<td class="c">#index#</td>
|
||||
<!--- <td>#contract_uid#</td> --->
|
||||
<td class="c">#is_actual#</td>
|
||||
<td class="c">#last_aa#</td>
|
||||
<td><a href="deal.cfm?__id=#deal_uid#&#tr.fwx#">#deal_uid#</a></td>
|
||||
<td>#deal#</td>
|
||||
<td class="c">#status_id#</td>
|
||||
<td>#status#</td>
|
||||
<td class="r">#probability_pc#</td>
|
||||
<td><a href="additional_agreement.cfm?__id=#base_by_uid#&#tr.fwx#">#base_by_index#</a></td>
|
||||
<td><a href="additional_agreement.cfm?__id=#base_by_uid#&#tr.fwx#">#base_by_uid#</a></td>
|
||||
<td><a href="additional_agreement.cfm?__id=#base_by_uid#&#tr.fwx#">#base_by_name#</a></td>
|
||||
|
||||
<!--- <td class="c">
|
||||
#dateFormat(dt_contract,'YYYY-MM-DD')#
|
||||
</td> --->
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
</cfif>
|
||||
<br/>
|
||||
Мы не показываем тут сделки, поскольку связь со сделкой у договора не прямая и не обязательная. Сделки относятся к контрагенту, а не к договору. Сделка может быть связана с договором через дополнительное соглашение (включая нулевое соглашение, по умолчанию)
|
||||
<!--- <cfquery name="qDeal">
|
||||
select
|
||||
d.__id
|
||||
,d.__name
|
||||
,d._companies
|
||||
,d._plannedDueDate
|
||||
,d.kommentarii_k_sdelke
|
||||
,d.__status_notify
|
||||
,d.__debug
|
||||
,d.is_corrective_transaction
|
||||
,d.dt_load
|
||||
from elma.deals d limit 10
|
||||
</cfquery> --->
|
||||
|
||||
|
||||
<layout:page section="footer"/>
|
||||
@@ -1,131 +0,0 @@
|
||||
<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:silent silent="No">
|
||||
|
||||
<cffunction name="hideNonPositive">
|
||||
<cfargument name="a"/>
|
||||
<cfreturn (a GT 0)? a : ""/>
|
||||
</cffunction>
|
||||
|
||||
<m:prepare_ls entity="contract" accessObject="" pageInfoOut="pageInfo" trackOut="tr"/>
|
||||
|
||||
<!--- <m:filter_settings target="#pageInfo.entity#_ls">
|
||||
<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.contract_class_type like ?) OR (p.division like ?) OR (p.performer_short like ?))" default=""/>
|
||||
</m:filter_settings> --->
|
||||
<!--- <cfset pageInfo.settings.filter=#filter#/> --->
|
||||
|
||||
<cftry>
|
||||
<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="Внут.номер">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="Контрагент">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>
|
||||
<d:field title="Дата окончания">d.date_end_aggrement</d:field>
|
||||
<d:field title="Тип договора">d.type_of_agreement</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_set>
|
||||
from elma.aggrements d
|
||||
left outer join elma.companies k on (d.company_uid=k.__id)
|
||||
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
|
||||
order by <m:order_build sortArray=#pageInfo.settings.sort.sortArray# fieldCount=#fieldCount#/>
|
||||
</cfquery>
|
||||
|
||||
|
||||
<cfcatch type="database">
|
||||
<m:ls_catch catch=#cfcatch# status=#pageInfo.status#/>
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
|
||||
<cfquery name="qCountTotal" datasource="#request.DS#">
|
||||
select count(*) as cnt from elma.aggrements d where 1=1
|
||||
</cfquery>
|
||||
|
||||
</m:silent><!---
|
||||
-----------------------------------------------------------------------------------------
|
||||
-----------------------------------------------------------------------------------------
|
||||
-----------------------------------------------------------------------------------------
|
||||
---><cfif isDefined("output_xls")>
|
||||
<layout:xml qRead=#qRead# titleMap=#titleMap# filename="#pageInfo.entity#.xml"/>
|
||||
<cfabort/>
|
||||
</cfif><cfif isDefined("output_json")>
|
||||
<layout:json qRead=#qRead# titleMap=#titleMap# filename="#pageInfo.entity#.json"/>
|
||||
<cfabort/>
|
||||
</cfif><!---
|
||||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||||
|
||||
<layout:attribute name="title">
|
||||
<cfoutput><b>Договоры</b></cfoutput>
|
||||
</layout:attribute>
|
||||
<!--- <layout:attribute name="controls"></layout:attribute> --->
|
||||
</layout:page>
|
||||
|
||||
<cfif pageInfo.readPermitted() AND !pageInfo.status.errorState>
|
||||
|
||||
<layout:grid_summary
|
||||
recordCount=#qRead.recordCount#
|
||||
totalCount=#qCountTotal.cnt#
|
||||
footerOut="gridFooter"
|
||||
excelLink="Yes"
|
||||
jsonLink="Yes"
|
||||
/>
|
||||
|
||||
|
||||
<!--- так довольно громоздко, но можно обойтись без Dynamic Evaluation --->
|
||||
<cfset queryAddColumn(qRead,'f_link_view_edit')/>
|
||||
<cfset titleMap.f_link_view_edit={ordinal=#StructCount(titleMap)+1#}/><!--- *** Это легко забыть, потому что TitleMap никак не сцеплен с qRead. Напрашивается: упаковать их в одну обертку (но тогда обращение станет длиннее). Еще идея - назвать qRead и TitleMap так, чтобы была видна их связь. --->
|
||||
<!--- <cfdump var=#titleMap#/> --->
|
||||
|
||||
<cfset queryAddColumn(qRead,'f_contract')/>
|
||||
<cfset titleMap.f_contract=titleMap.__name/>
|
||||
|
||||
<cfset queryAddColumn(qRead,'f_contragent')/>
|
||||
<cfset titleMap.f_contragent=titleMap.contragent/>
|
||||
|
||||
<cfset queryAddColumn(qRead,'f_link_del')/>
|
||||
<cfset titleMap.f_link_del={ordinal=0}/>
|
||||
|
||||
<!--- <cfdump var=#titleMap#/> --->
|
||||
<cfoutput query=#qRead# startRow=#pageInfo.nStart# maxRows=#pageInfo.recordsPerPage#>
|
||||
<cfsavecontent variable="qRead.f_link_view_edit">
|
||||
<a href="contract.cfm?__id=#__id#&#tr.fwx#" name="#__id#" title="просмотр" class="view"></a>
|
||||
</cfsavecontent>
|
||||
|
||||
<cfsavecontent variable="qRead.f_contract">
|
||||
<a href="contract.cfm?__id=#__id#&#tr.fwx#">#__name#</a>
|
||||
</cfsavecontent>
|
||||
|
||||
<cfsavecontent variable="qRead.f_contragent">
|
||||
<a href="contragent.cfm?__id=#company_uid#&#tr.fwx#">#contragent#</a>
|
||||
</cfsavecontent>
|
||||
|
||||
</cfoutput>
|
||||
|
||||
<c:table query=#qRead# recordsPerPage=#pageInfo.recordsPerPage# nStart=#pageInfo.nStart# titleMap=#titleMap# sortArray=#pageInfo.settings.sort.sortArray# class="worktable wide">
|
||||
<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="f_contract"/>
|
||||
<c:column width="10%" field="agreement_id"/>
|
||||
<c:column width="10%" field="company_uid"/>
|
||||
<c:column width="10%" field="f_contragent"/>
|
||||
<c:column width="10%" field="wz"/>
|
||||
<c:column width="10%" field="date_of_aggrement" formatter=#function(dt){return dateformat(dt,"YYYY-MM-DD");}#/>
|
||||
<c:column width="10%" field="date_end_aggrement" formatter=#function(dt){return dateformat(dt,"YYYY-MM-DD");}#/>
|
||||
<c:column width="10%" field="type_of_agreement"><c:td class="l"/></c:column>
|
||||
<c:column width="10%" field="aa_cnt"><c:td class="c"/></c:column>
|
||||
|
||||
</c:table>
|
||||
|
||||
<cfoutput>#gridFooter#</cfoutput>
|
||||
|
||||
</cfif>
|
||||
<layout:page section="footer"/>
|
||||
@@ -1,488 +0,0 @@
|
||||
<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:silent silent="No">
|
||||
|
||||
<cffunction name="plain2HtmClean">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn request.plain2htm(request.cleanHtm(s))/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="cleanInput">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn htmlEditFormat(s)/>
|
||||
</cffunction>
|
||||
|
||||
<m:prepare_detail entity="contragent" accessObject="" key="__id" pageInfoOut="pageInfo"/>
|
||||
|
||||
<d:bean readonly=true table="elma.companies" datasource="#request.DS#" output="d" status="status">
|
||||
<d:param field="__id" type="uuid" key/>
|
||||
<d:param field="__name" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="_inn" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="_kpp" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="id_klienta" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<!--- *** билдер показывает... <d:param field="wz_id" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/> --->
|
||||
<!--- <d:param field="code_inn" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="code_kpp" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/> --->
|
||||
</d:bean>
|
||||
|
||||
|
||||
<m:dispatch_detail
|
||||
usePRG="No"<!---*** --->
|
||||
pageInfo=#pageInfo#
|
||||
id="#d.__id#"
|
||||
status=#pageInfo.status#
|
||||
trackOut="tr"
|
||||
idAttributesOut="id"
|
||||
/>
|
||||
|
||||
<!--- decoration --->
|
||||
<!--- <cfquery name="qDecoration" datasource="#request.DS#">
|
||||
select
|
||||
a.login as creator, a.shortname as creator_shortname, m.login as updater, m.shortname as updater_shortname
|
||||
from contragent g
|
||||
left outer join usr a on (g.creator_id=a.usr_id)
|
||||
left outer join usr m on (g.updater_id=m.usr_id)
|
||||
where g.contragent_id=<cfqueryparam attributeCollection=#id#/>
|
||||
</cfquery> --->
|
||||
|
||||
|
||||
</m:silent><!---
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||||
<layout:attribute name="title">
|
||||
<cfoutput>
|
||||
Контрагент
|
||||
<cfif len(d.__id)>
|
||||
<b>#d.__name#</b>
|
||||
[#d.__id#]
|
||||
</cfif>
|
||||
</cfoutput>
|
||||
</layout:attribute>
|
||||
</layout:page>
|
||||
|
||||
<!--- <cfif status.errorState GT 0>
|
||||
<cfoutput><div class="err">#status.errorMessage#</div></cfoutput>
|
||||
</cfif>
|
||||
--->
|
||||
<cfoutput>
|
||||
<input type="hidden" name="__id" value="#d.__id#"/>
|
||||
<input type="hidden" name="track" value="#tr.self#"/>
|
||||
<input type="hidden" name="pass" value=""/><!--- pass marker to prevent save on submit --->
|
||||
|
||||
<div class="detail">
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">__id</div>
|
||||
<div class="td">#d.__id#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">__name</div>
|
||||
<div class="td">#d.__name#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">_inn</div>
|
||||
<div class="td">#d._inn#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">_kpp</div>
|
||||
<div class="td">#d._kpp#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">id_klienta</div>
|
||||
<div class="td">#d.id_klienta#</div>
|
||||
</div>
|
||||
|
||||
<!--- <div class="tr">
|
||||
<div class="th">wz_id</div>
|
||||
<div class="td">#d.wz_id#"/></div>
|
||||
</div> --->
|
||||
|
||||
<!--- <div class="tr">
|
||||
<div class="th">code_inn</div>
|
||||
<div class="td">#d.code_inn#"/></div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">code_kpp</div>
|
||||
<div class="td">#d.code_kpp#"/></div>
|
||||
</div> --->
|
||||
|
||||
</div>
|
||||
|
||||
</cfoutput>
|
||||
сюда добавить сделок, договоров и т.д.
|
||||
|
||||
<layout:page section="extension" closeForm="Yes"/>
|
||||
|
||||
<cfif len(d.__id)>
|
||||
|
||||
<cfquery name="qContract">
|
||||
select
|
||||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||
<d:field title="ID" cfSqlType="CF_SQL_OTHER">d.__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="Дата договора">d.date_of_aggrement</d:field>
|
||||
<d:field title="Дата окончания">d.date_end_aggrement</d:field>
|
||||
<d:field title="Тип договора">d.type_of_agreement</d:field>
|
||||
<d:field title="__index">d.__index</d:field>
|
||||
</d:field_set>
|
||||
from elma.aggrements d
|
||||
where d.company_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#d.__id#" null=#!isValid('guid',d.__id)#/>
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<h4>Договоры (#qContract.recordCount#)</h4>
|
||||
</cfoutput>
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__id</th>
|
||||
<th>Номер</th>
|
||||
<th>Внут. номер</th>
|
||||
<th>Дата</th>
|
||||
<th>Дата оконч.</th>
|
||||
<th>Тип договора</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<cfoutput query="qContract">
|
||||
<tr>
|
||||
<td><a href="contract.cfm?__id=#__id#&#tr.fwx#">#__id#</a></td>
|
||||
<td>#__name#</td>
|
||||
<td>#agreement_id#</td>
|
||||
<td>#dateFormat(date_of_aggrement,"YYYY-MM-DD")#</td>
|
||||
<td>#dateFormat(date_end_aggrement,"YYYY-MM-DD")#</td>
|
||||
<td class="c">#type_of_agreement#</td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
|
||||
|
||||
<cfquery name="qAdditionalAgreement">
|
||||
with
|
||||
s(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
),
|
||||
component as (select siv.deal as deal_uids, siv.type, (siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))) as param_cost
|
||||
from elma.deals_services siv
|
||||
join elma.service_parametrs p on (p.__id = ANY(siv.params))
|
||||
where p."__deletedAt" IS NULL AND siv."__deletedAt" IS NULL AND siv.is_actual
|
||||
)
|
||||
select
|
||||
a.__id::text
|
||||
,a.__name as additional_agreement
|
||||
,a.__index
|
||||
,a.contract_uid::text
|
||||
,a.is_actual
|
||||
,a.last_aa
|
||||
,a.deal_uid::text
|
||||
,c.__name as contract
|
||||
,c.agreement_id
|
||||
,c.date_of_aggrement
|
||||
,d.__id as deal_uid
|
||||
,d.__name as deal
|
||||
,d.__status_status
|
||||
,s.status
|
||||
,s.probability_pc
|
||||
,u.__name as owner
|
||||
,(select sum(param_cost)
|
||||
from component p
|
||||
where d.__id = p.deal_uids[1] AND p.type IN (1)
|
||||
) as install
|
||||
,(select sum(param_cost)
|
||||
from component p
|
||||
where d.__id = p.deal_uids[1] AND p.type IN (2)
|
||||
) as periodical
|
||||
,(select sum(param_cost)
|
||||
from component p
|
||||
where d.__id = p.deal_uids[1] AND p.type IN (3)
|
||||
) as metered
|
||||
from elma.additional_agreements a
|
||||
join elma.aggrements c on (a.contract_uid=c.__id)
|
||||
join elma.deals d on (a.deal_uid=d.__id)
|
||||
left outer join s on (d.__status_status=s.status_id)
|
||||
left outer join elma.comp_users_ext u on (d._owner=c.__id)
|
||||
where c.company_uid=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
AND s.probability_pc > 0
|
||||
order by a.__index
|
||||
</cfquery>
|
||||
|
||||
|
||||
<cfoutput>
|
||||
<h4>Доп. соглашения (#qAdditionalAgreement.recordCount#)
|
||||
- исключены соглашения, сделки которых имеют нулевую вероятность
|
||||
</h4>
|
||||
</cfoutput>
|
||||
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__id</th>
|
||||
<th>__index</th>
|
||||
<th>Доп. соглашение</th>
|
||||
<th>Внут. н-р дог.</th>
|
||||
<th>Дата договора</th>
|
||||
<th>Сделка</th>
|
||||
<th>Статус сделки</th>
|
||||
<th>Вер-ть %</th>
|
||||
<th>Ответственный</th>
|
||||
<th>Инсталл</th>
|
||||
<th>Ежемес</th>
|
||||
<th>Тариф.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<cfoutput query="qAdditionalAgreement">
|
||||
<tr>
|
||||
<td><a href="additional_agreement.cfm?__id=#__id#&#tr.fwx#">#__id#</a></td>
|
||||
<td><a href="additional_agreement.cfm?__id=#__id#&#tr.fwx#">#__index#</a></td>
|
||||
<td>#additional_agreement#</td>
|
||||
<td><a href="contract.cfm?__id=#contract_uid#&#tr.fwx#">#agreement_id#</a></td>
|
||||
<td>#dateFormat(date_of_aggrement,"YYYY-MM-DD")#</td>
|
||||
<td><a href="deal.cfm?__id=#deal_uid#&#tr.fwx#">#deal#</a></td>
|
||||
<td>#status#</td>
|
||||
<td>#probability_pc#</td>
|
||||
<td>#owner#</td>
|
||||
<td class="r nw">#nFmt(install)#</td>
|
||||
<td class="r nw">#nFmt(periodical)#</td>
|
||||
<td class="r nw">#nFmt(metered)#</td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
|
||||
<!--- ----------------------------------------------------------------- --->
|
||||
<!--- ----------------------------------------------------------------- --->
|
||||
<!--- ----------------------------------------------------------------- --->
|
||||
|
||||
<cfquery name="qDeal">
|
||||
with
|
||||
status(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
),
|
||||
component as (select siv.deal as deal_uids, siv.type, (siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))) as param_cost
|
||||
from elma.deals_services siv
|
||||
join elma.service_parametrs p on (p.__id = ANY(siv.params))
|
||||
where p."__deletedAt" IS NULL AND siv."__deletedAt" IS NULL AND siv.is_actual
|
||||
)
|
||||
select
|
||||
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
|
||||
<d:field title="ID" cfSqlType="CF_SQL_OTHER">d.__id</d:field>
|
||||
<d:field title="index" cfSqlType="CF_SQL_INTEGER">d.__index</d:field>
|
||||
<d:field title="Название">d.__name</d:field>
|
||||
<d:field title="company_uid">d._companies</d:field>
|
||||
<d:field title="Создана">d."__createdAt" as __createdAt</d:field><!--- *** косяк d:field, если взять в кавычки имя поля, оно не попадает в массив полей --->
|
||||
<d:field title="Контрагент">k.__name as contragent</d:field>
|
||||
<d:field title="Контрагент">k.__id as contragent_uid</d:field>
|
||||
<d:field title="WZ">k.id_klienta as wz</d:field>
|
||||
<d:field title="status_id">d.__status_status</d:field>
|
||||
<d:field title="Статус">s.status</d:field>
|
||||
<d:field title="Вероятность%">s.probability_pc</d:field>
|
||||
<d:field title="Ответственный">c.__name as owner</d:field>
|
||||
<d:field title="Допник">a.__name as additional_agreement</d:field>
|
||||
<d:field title="Допник">a.__id as additional_agreement_uid</d:field>
|
||||
<d:field title="Договор">g.__name as contract</d:field>
|
||||
<d:field title="Договор">g.__id as contract_uid</d:field>
|
||||
<d:field title="Договор">g.date_of_aggrement</d:field>
|
||||
<d:field title="Договор">g.agreement_id</d:field>
|
||||
<d:field title="Дата дог.">g.date_of_aggrement as dt_contract</d:field>
|
||||
<d:field>(select sum(param_cost)
|
||||
from component
|
||||
where d.__id = ANY(component.deal_uids) AND component.type IN (1)
|
||||
) as install
|
||||
</d:field>
|
||||
<d:field>(select sum(param_cost)
|
||||
from component
|
||||
where d.__id = ANY(component.deal_uids) AND component.type IN (2)
|
||||
) as periodical
|
||||
</d:field>
|
||||
<d:field>(select sum(param_cost)
|
||||
from component
|
||||
where d.__id = ANY(component.deal_uids) AND component.type IN (3)
|
||||
) as metered
|
||||
</d:field>
|
||||
</d:field_set>
|
||||
from elma.deals d
|
||||
left outer join elma.companies k on (d._companies=k.__id)
|
||||
left outer join status s on (d.__status_status=s.status_id)
|
||||
left outer join elma.comp_users_ext c on (d._owner=c.__id)
|
||||
left outer join elma.additional_agreements a on (d.__id=a.deal_uid)
|
||||
left outer join elma.aggrements g on (a.contract_uid = g.__id)
|
||||
where d._companies=<cfqueryparam cfsqltype="cf_sql_other" value="#d.__id#" null=#!isValid('guid',d.__id)#/>
|
||||
AND s.probability_pc > 0
|
||||
order by d.__index
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<h4>Сделки (#qDeal.recordCount#) - исключены сделки с нулевой вероятностью</h4>
|
||||
</cfoutput>
|
||||
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__id</th>
|
||||
<th>__index</th>
|
||||
<th>Сделка</th>
|
||||
<th>Статус сделки</th>
|
||||
<th>Вер-ть %</th>
|
||||
<th>Ответственный</th>
|
||||
<th>Допник</th>
|
||||
<th>Договор</th>
|
||||
<th>Внут. н-р дог.</th>
|
||||
<th>Дата договора</th>
|
||||
<th>Инсталл</th>
|
||||
<th>Ежемес</th>
|
||||
<th>Тариф.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<cfoutput query="qDeal">
|
||||
<tr>
|
||||
<td><a href="deal.cfm?__id=#__id#&#tr.fwx#">#__id#</a></td>
|
||||
<td>#__index#</td>
|
||||
<td><a href="deal.cfm?__id=#__id#&#tr.fwx#">#__name#</a></td>
|
||||
<td>#status#</td>
|
||||
<td>#probability_pc#</td>
|
||||
<td>#owner#</td>
|
||||
<td>#additional_agreement#</td>
|
||||
<td>#contract#</td>
|
||||
<td><a href="contract.cfm?__id=#contract_uid#&#tr.fwx#">#agreement_id#</a></td>
|
||||
<td>#dateFormat(date_of_aggrement,"YYYY-MM-DD")#</td>
|
||||
<td class="r nw">#nFmt(install)#</td>
|
||||
<td class="r nw">#nFmt(periodical)#</td>
|
||||
<td class="r nw">#nFmt(metered)#</td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
|
||||
|
||||
<!--- ----------------------------------------------------- --->
|
||||
<!--- ----------------------------------------------------- --->
|
||||
<!--- ----------------------------------------------------- --->
|
||||
|
||||
<cfquery name="qService">
|
||||
with
|
||||
status(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select
|
||||
siv.__id
|
||||
,siv.__name
|
||||
,siv.user_description
|
||||
,siv.discount
|
||||
,siv.cnt
|
||||
,siv.modifier_code
|
||||
,siv.abstractive_service_code
|
||||
,siv.is_actual
|
||||
,siv.type
|
||||
,siv.hash
|
||||
,siv.version
|
||||
,siv.name_version
|
||||
,siv.date_accept
|
||||
,siv.__index
|
||||
,siv.date_nop
|
||||
,siv.date_end
|
||||
,siv.is_easy
|
||||
,siv.params::text
|
||||
,a.__id::text as additional_agreement_uid
|
||||
,a.__name as additional_agreement
|
||||
,(select
|
||||
sum(siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))/100)
|
||||
from elma.service_parametrs p
|
||||
where p.__id = ANY (siv.params)
|
||||
AND p."__deletedAt" IS NULL
|
||||
) as line_cost
|
||||
,(select count(*)
|
||||
from elma.service_parametrs p
|
||||
where p.__id = ANY (siv.params)
|
||||
AND p."__deletedAt" IS NULL
|
||||
) as param_cnt
|
||||
,s.probability_pc
|
||||
,d.__index
|
||||
,d.__id as deal_uid
|
||||
from elma.deals_services siv
|
||||
join elma.deals d on d.__id=ANY(siv.deal)
|
||||
join status s on (d.__status_status=s.status_id)
|
||||
left outer join elma.additional_agreements a on (a.__id=ANY(siv.additional_agreement))
|
||||
where d._companies=<cfqueryparam cfsqltype="cf_sql_other" value="#d.__id#" null=#!isValid("guid",d.__id)#/>
|
||||
and siv.is_actual
|
||||
order by version::int
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<h4>Услуги (версии строк спецификации, только актуальные) (#qService.recordCount#) *** здесь не учтено дублирование строк в новых версиях</h4>
|
||||
</cfoutput>
|
||||
|
||||
<!--- <layout:render_query query=#qService#/> --->
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__index</th>
|
||||
<!--- <th>__name</th> --->
|
||||
<th width="12%">user_description</th>
|
||||
<th>Кол-во</th>
|
||||
<th>Скидка%</th>
|
||||
<th width="5%">Сумма</th>
|
||||
<th>Код</th>
|
||||
<th>type</th>
|
||||
<th>is_actual</th>
|
||||
<th>hash</th>
|
||||
<th>version</th>
|
||||
<th>name_version</th>
|
||||
<th>date_accept</th>
|
||||
<th>__index</th>
|
||||
<th width="5%">date_nop</th>
|
||||
<th width="5%">date_end</th>
|
||||
<th>is_easy</th>
|
||||
<th>Компонентов</th>
|
||||
<th width="12%">additional_agreement</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<cfoutput query="qService">
|
||||
<tr>
|
||||
<td class="c"><a href="deal_service.cfm?__id=#__id#&#tr.fwx#" title="__id">#__index#</a></td>
|
||||
<!--- <td class="c">#__name#</td> --->
|
||||
<td class="l">#user_description#</td>
|
||||
<td class="c">#cnt#</td>
|
||||
<td class="c">#discount#</td>
|
||||
<td class="r">#nFmt(line_cost)#</td>
|
||||
<td class="l">
|
||||
#abstractive_service_code#.#modifier_code#<!--- <cfswitch expression=#type#>
|
||||
<cfcase value=1>-i</cfcase>
|
||||
<cfcase value=2>-f</cfcase>
|
||||
<cfcase value=3>-m</cfcase>
|
||||
</cfswitch> --->
|
||||
</td>
|
||||
<td class="c">#type#</td>
|
||||
<td class="c">#is_actual#</td>
|
||||
<td class="c">#hash#</td>
|
||||
<td class="c">#version#</td>
|
||||
<td class="c">#name_version#</td>
|
||||
<td class="c">#date_accept#</td>
|
||||
<td class="c">#__index#</td>
|
||||
<td class="c">#dateFormat(date_nop,'YYYY-MM-DD')#</td>
|
||||
<td class="c">#dateFormat(date_end,'YYYY-MM-DD')#</td>
|
||||
<td class="c">#is_easy#</td>
|
||||
<td class="c">#param_cnt#</td>
|
||||
|
||||
<!--- <td class="c">#additional_agreement_uid#</td> --->
|
||||
<td class="c"><a href="additional_agreement.cfm?__id=#additional_agreement_uid#&#tr.fwx#">#additional_agreement#</a></td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
|
||||
</cfif>
|
||||
<layout:page section="footer"/>
|
||||
-317
@@ -1,317 +0,0 @@
|
||||
<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:silent silent="No">
|
||||
|
||||
<cffunction name="plain2HtmClean">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn request.plain2htm(request.cleanHtm(s))/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="cleanInput">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn htmlEditFormat(s)/>
|
||||
</cffunction>
|
||||
|
||||
<m:prepare_detail entity="deal" accessObject="" key="__id" pageInfoOut="pageInfo"/>
|
||||
|
||||
<d:bean readonly=true table="elma.deals" datasource="#request.DS#" output="d" status="status">
|
||||
<d:param field="__id" type="uuid" key/>
|
||||
<d:param field="__name" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="_companies" type="uuid" forNull=""/>
|
||||
<!--- <d:param field="_plannedDueDate" type="timestamp" forNull=""/> ---><!--- *** не используем, потому что имя в смешанном регистре --->
|
||||
<d:param field="__index" type="integer" forNull="" default="0" init="0"/>
|
||||
<d:param field="__status_status" type="integer" forNull="" default="0" init="0"/>
|
||||
<d:param field="is_corrective_transaction" type="bit" forNull=""/>
|
||||
<d:param field="dt_load" type="timestamp"/>
|
||||
</d:bean>
|
||||
|
||||
|
||||
<m:dispatch_detail
|
||||
usePRG="No"<!---*** --->
|
||||
pageInfo=#pageInfo#
|
||||
id="#d.__id#"
|
||||
status=#pageInfo.status#
|
||||
trackOut="tr"
|
||||
idAttributesOut="id"
|
||||
/>
|
||||
|
||||
<!--- decoration --->
|
||||
<cfquery name="qDecoration" datasource="#request.DS#">
|
||||
with
|
||||
s(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
),
|
||||
component as (select siv.deal as deal_uids, siv.type, (siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))) as param_cost
|
||||
from elma.deals_services siv
|
||||
join elma.service_parametrs p on (p.__id = ANY(siv.params))
|
||||
)
|
||||
|
||||
select
|
||||
k.__name as contragent
|
||||
,k.id_klienta as wz
|
||||
,k.__index as contragent_index
|
||||
,d."_plannedDueDate" as _plannedDueDate
|
||||
,d."__createdAt"
|
||||
,d."__index" as deal_index
|
||||
,s.status
|
||||
,s.probability_pc
|
||||
,c.__name as owner
|
||||
,(select sum(param_cost)
|
||||
from component
|
||||
where d.__id = ANY(component.deal_uids) AND component.type IN (1)
|
||||
) as install
|
||||
,(select sum(param_cost)
|
||||
from component
|
||||
where d.__id = ANY(component.deal_uids) AND component.type IN (2)
|
||||
) as periodical
|
||||
,(select sum(param_cost)
|
||||
from component
|
||||
where d.__id = ANY(component.deal_uids) AND component.type IN (3)
|
||||
) as metered
|
||||
from elma.deals d
|
||||
left outer join elma.companies k on (d._companies=k.__id)
|
||||
left outer join elma.comp_users_ext c on (d._owner=c.__id)
|
||||
left outer join s on (d.__status_status=s.status_id)
|
||||
where d.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
|
||||
|
||||
</m:silent><!---
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||||
<layout:attribute name="title">
|
||||
<cfoutput>
|
||||
Сделка
|
||||
<cfif len(d.__id)>
|
||||
<b>#d.__name#</b>
|
||||
[#d.__id#]
|
||||
</cfif>
|
||||
</cfoutput>
|
||||
</layout:attribute>
|
||||
</layout:page>
|
||||
|
||||
<!--- <cfif status.errorState GT 0>
|
||||
<cfoutput><div class="err">#status.errorMessage#</div></cfoutput>
|
||||
</cfif>
|
||||
--->
|
||||
<cfoutput>
|
||||
<input type="hidden" name="__id" value="#d.__id#"/>
|
||||
<input type="hidden" name="track" value="#tr.self#"/>
|
||||
<input type="hidden" name="pass" value=""/><!--- pass marker to prevent save on submit --->
|
||||
|
||||
<div class="detail">
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">__id</div>
|
||||
<div class="td">
|
||||
#d.__id#
|
||||
index:#qDecoration.deal_index#
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Название</div>
|
||||
<div class="td">#d.__name#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Контрагент</div>
|
||||
<div class="td"><!--- <a href="contract.cfm?__id=#d.contract_uid#&#tr.fwx#"><b>#qDecoration.contract#</b> #dateFormat(qDecoration.date_of_aggrement,'DD.MM.YYYY')#
|
||||
[#d.contract_uid#]</a> --->
|
||||
<a href="contragent.cfm?__id=#d._companies#&#tr.fwx#"> #qDecoration.contragent# #qDecoration.wz#
|
||||
index:#qDecoration.contragent_index#</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">_plannedDueDate</div>
|
||||
<div class="td">#dateFormat(qDecoration._plannedDueDate,'YYYY-MM-DD')#
|
||||
Паразитное поле, не использовать в расчетах
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Статус</div>
|
||||
<div class="td">
|
||||
#d.__status_status#: #qDecoration.status# (#qDecoration.probability_pc#%)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Доп.соглашение</div>
|
||||
<div class="td">
|
||||
<cfquery name="qAgreement">
|
||||
select
|
||||
a.__id
|
||||
,a.__name
|
||||
,g.__id as contract_uid
|
||||
,g.__name as contract
|
||||
,g.date_of_aggrement
|
||||
from elma.additional_agreements a
|
||||
join elma.aggrements g on (a.contract_uid=g.__id)
|
||||
where a.deal_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#d.__id#" null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
<cfloop query=#qAgreement#>
|
||||
<a href="additional_agreement.cfm?__id=#__id#&#tr.fwx#" title="доп.соглашение">#__name#</a>
|
||||
<a href="contract.cfm?__id=#contract_uid#&#tr.fwx#" title="договор">#contract# #dateFmt(date_of_aggrement)#</a>
|
||||
</cfloop>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">is_corrective_transaction</div>
|
||||
<div class="td">#d.is_corrective_transaction#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">dt_load</div>
|
||||
<div class="td">#dateTimeFormat(d.dt_load,"yyyy-MM-dd HH:nn:ss.SSSZ")#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">__createdAt</div>
|
||||
<div class="td">#dateFormat(qDecoration.__createdAt,"YYYY-MM-DD")#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Ответственный</div>
|
||||
<div class="td">#qDecoration.owner#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Инсталл</div>
|
||||
<div class="td">#numFmt(qDecoration.install,2)#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Ежемес</div>
|
||||
<div class="td">#numFmt(qDecoration.periodical,2)#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Тарифицируемые</div>
|
||||
<div class="td">#numFmt(qDecoration.metered,2)#</div>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</cfoutput>
|
||||
|
||||
<layout:page section="extension" closeForm="Yes"/>
|
||||
|
||||
<cfif len(d.__id)>
|
||||
<cfquery name="qService">
|
||||
select
|
||||
siv.__id
|
||||
,siv.__name
|
||||
,siv.user_description
|
||||
,siv.discount
|
||||
,siv.cnt
|
||||
,siv.modifier_code
|
||||
,siv.abstractive_service_code
|
||||
,siv.is_actual
|
||||
,siv.type
|
||||
,siv.hash
|
||||
,siv.version
|
||||
,siv.name_version
|
||||
,siv.date_accept
|
||||
,siv.__index
|
||||
,siv.date_nop
|
||||
,siv.date_end
|
||||
,siv.is_easy
|
||||
,siv.params::text
|
||||
,a.__id::text as additional_agreement_uid
|
||||
,a.__name as additional_agreement
|
||||
,(select
|
||||
sum(siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))/100)
|
||||
from elma.service_parametrs p
|
||||
where p.__id = ANY (siv.params)
|
||||
) as line_cost
|
||||
,(select count(*)
|
||||
from elma.service_parametrs p
|
||||
where p.__id = ANY (siv.params)
|
||||
) as param_cnt
|
||||
from elma.deals_services siv
|
||||
left outer join elma.additional_agreements a on (a.__id=ANY(siv.additional_agreement))
|
||||
where <cfqueryparam cfsqltype="cf_sql_other" value="#d.__id#" null=#!isValid("guid",d.__id)#/>=ANY(siv.deal)
|
||||
and siv.is_actual
|
||||
order by version::int
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<h4>Услуги (версии строк спецификации, только актуальные) (#qService.recordCount#)</h4>
|
||||
</cfoutput>
|
||||
|
||||
<!--- <layout:render_query query=#qService#/> --->
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__index</th>
|
||||
<!--- <th>__name</th> --->
|
||||
<th width="12%">user_description</th>
|
||||
<th>Кол-во</th>
|
||||
<th>Скидка%</th>
|
||||
<th width="5%">Сумма</th>
|
||||
<th>Код</th>
|
||||
<th>type</th>
|
||||
<th>is_actual</th>
|
||||
<th>hash</th>
|
||||
<th>version</th>
|
||||
<th>name_version</th>
|
||||
<th>date_accept</th>
|
||||
<th width="5%">date_nop</th>
|
||||
<th width="5%">date_end</th>
|
||||
<th>is_easy</th>
|
||||
<th>Компонентов</th>
|
||||
<th width="12%">additional_agreement</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<cfoutput query="qService">
|
||||
<tr>
|
||||
<td class="c"><a href="deal_service.cfm?__id=#__id#&#tr.fwx#" title="__id">#__index#</a></td>
|
||||
<!--- <td class="c">#__name#</td> --->
|
||||
<td class="l">#user_description#</td>
|
||||
<td class="c">#cnt#</td>
|
||||
<td class="c">#discount#</td>
|
||||
<td class="r">#nFmt(line_cost)#</td>
|
||||
<td class="l">
|
||||
#abstractive_service_code#.#modifier_code#<!--- <cfswitch expression=#type#>
|
||||
<cfcase value=1>-i</cfcase>
|
||||
<cfcase value=2>-f</cfcase>
|
||||
<cfcase value=3>-m</cfcase>
|
||||
</cfswitch> --->
|
||||
</td>
|
||||
<td class="c">#type# (<cfswitch expression=#type#>
|
||||
<cfcase value=1>i</cfcase>
|
||||
<cfcase value=2>f</cfcase>
|
||||
<cfcase value=3>m</cfcase>
|
||||
</cfswitch>)</td>
|
||||
<td class="c">#is_actual#</td>
|
||||
<td class="c">#hash#</td>
|
||||
<td class="c">#version#</td>
|
||||
<td class="c">#name_version#</td>
|
||||
<td class="c">#date_accept#</td>
|
||||
<td class="c">#dateFormat(date_nop,'YYYY-MM-DD')#</td>
|
||||
<td class="c">#dateFormat(date_end,'YYYY-MM-DD')#</td>
|
||||
<td class="c"><cfif is_easy GT 0>Простая<cfelseif is_easy EQ 0>Композитная<cfelse>is_easy=#is_easy#</cfif></td>
|
||||
<td class="c">#param_cnt#</td>
|
||||
|
||||
<!--- <td class="c">#additional_agreement_uid#</td> --->
|
||||
<td class="c"><a href="additional_agreement.cfm?__id=#additional_agreement_uid#&#tr.fwx#">#additional_agreement#</a></td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
</cfif>
|
||||
|
||||
|
||||
<layout:page section="footer"/>
|
||||
@@ -1,126 +0,0 @@
|
||||
<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:silent silent="No">
|
||||
|
||||
<m:prepare_filter entity="deal" accessObject="" lsPage="deal_ls" pageInfoOut="pageInfo" trackOut="tr"/>
|
||||
|
||||
<m:filter_settings target="deal_ls"><!---*** вводит в заблуждение--->
|
||||
<m:filterparam filter=#filter# param="__name" ftype="string" compare="LIKE%" field="d.__name" default=""/>
|
||||
<m:filterparam filter=#filter# param="contragent" ftype="string" compare="LIKE%" field="k.__name" default=""/>
|
||||
<m:filterparam filter=#filter# param="contragent_id" ftype="guid" compare="EQ" field="k.__id" default=""/>
|
||||
<m:filterparam filter=#filter# param="wz" ftype="string" compare="LIKE%" field="k.id_klienta" default=""/>
|
||||
<m:filterparam filter=#filter# param="status_id" ftype="numeric" compare="EQ" field="d.__status_status" default=""/>
|
||||
</m:filter_settings>
|
||||
|
||||
<cfif isDefined("resetAndClose") or isDefined("saveAndClose")>
|
||||
<cflocation url="#tr.backUrl#" addtoken="No"/>
|
||||
</cfif>
|
||||
|
||||
</m:silent><!--- ----------------------------------------------------------------------------
|
||||
---------------------------------------------------------------------------------------------
|
||||
---------------------------------------------------------------------------------------------
|
||||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||||
<layout:attribute name="title"><cfoutput>Сделки - фильтр</cfoutput></layout:attribute>
|
||||
</layout:page>
|
||||
|
||||
<script type="text/javascript"/>
|
||||
$(document).ready(function() {
|
||||
try {
|
||||
$("#contragent_id").searchable({maxMultiMatch: 50});
|
||||
} catch (e) {alert(e)}
|
||||
});
|
||||
</script>
|
||||
|
||||
<cfoutput>
|
||||
<input type="hidden" name="track" value="#tr.self#"/>
|
||||
|
||||
<div class="detail">
|
||||
|
||||
<div class="tr">
|
||||
<div class="th"></div>
|
||||
<div class="td">
|
||||
<button type="button" name="reset" onClick="document.location.href='#request.thisPage#?reset=yes&track=#tr.self#'">#i18("Очистить","Clear")#</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Название сделки</div>
|
||||
<div class="td">
|
||||
<input type="text" name="__name" value="#__name#" size="50"/>
|
||||
<i>#i18("по вхождению подстроки","by substring")#</i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Контрагент</div>
|
||||
<div class="td">
|
||||
<input type="text" name="contragent" value="#contragent#" size="50"/>
|
||||
<i>#i18("по вхождению подстроки","by substring")#</i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">WZ</div>
|
||||
<div class="td">
|
||||
<input type="text" name="wz" value="#wz#" size="50"/>
|
||||
<i>#i18("по вхождению подстроки","by substring")#</i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Контрагент</div>
|
||||
<div class="td" style="vertical-align:top;">
|
||||
<cfquery name="qList">
|
||||
select __id::text as __id, __name, id_klienta
|
||||
from elma.companies
|
||||
order by __name
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#qList#/> --->
|
||||
|
||||
<c:combo
|
||||
query=#qList#
|
||||
combo="contragent_id"
|
||||
id="contragent_id"
|
||||
key="__id"
|
||||
displayf="##__name## ##id_klienta##"
|
||||
selected=#contragent_id#
|
||||
empty=""
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Статус</div>
|
||||
<div class="td" style="vertical-align:top;">
|
||||
<cfquery name="qStatus" datasource="#request.DS#">
|
||||
with
|
||||
status (status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select status_id, status, probability_pc
|
||||
from status
|
||||
order by status_id
|
||||
</cfquery>
|
||||
|
||||
<c:combo
|
||||
query=#qStatus#
|
||||
combo="status_id"
|
||||
id="status_id"
|
||||
key="status_id"
|
||||
displayf="##status_id## ##status## (##probability_pc##%)"
|
||||
selected=#status_id#
|
||||
empty=""
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</div><!--- detail --->
|
||||
добавить сюда множественный выбор статуса
|
||||
|
||||
</cfoutput>
|
||||
|
||||
<layout:page section="footer" closeForm="Yes"/>
|
||||
<!--- <cfdump var=#filter#> --->
|
||||
@@ -1,562 +0,0 @@
|
||||
<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:silent silent="No">
|
||||
|
||||
<cffunction name="plain2HtmClean">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn request.plain2htm(request.cleanHtm(s))/>
|
||||
</cffunction>
|
||||
|
||||
<cffunction name="cleanInput">
|
||||
<cfargument name="s" type="string"/>
|
||||
<cfreturn htmlEditFormat(s)/>
|
||||
</cffunction>
|
||||
|
||||
<m:prepare_detail entity="deals_services" accessObject="" key="__id" pageInfoOut="pageInfo"/>
|
||||
|
||||
<d:bean readonly=true table="elma.deals_services" datasource="#request.DS#" output="d" status="status">
|
||||
<d:param field="__id" type="uuid" key/>
|
||||
<d:param field="__name" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="__index" type="integer" forNull=""/>
|
||||
<d:param field="user_description" type="varchar" preprocessor=#plain2HtmClean# forNull=""/>
|
||||
<d:param field="modifier" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="modifier_code" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="cnt" type="integer" forNull="" default="0" init="0"/>
|
||||
<d:param field="type" type="integer" forNull="" default="0" init="0"/>
|
||||
<d:param field="abstractive_service_code" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="deal" type="ARRAY" forNull=""/>
|
||||
<d:param field="additional_agreement" type="ARRAY" forNull=""/>
|
||||
<d:param field="date" type="timestamp" forNull=""/>
|
||||
<d:param field="abstractive_service" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="is_actual" type="bit" forNull=""/>
|
||||
<d:param field="hash" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="discount" type="numeric" forNull=""/>
|
||||
<d:param field="version" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="name_version" type="varchar" size="255" preprocessor=#cleanInput# forNull=""/>
|
||||
<d:param field="date_nop" type="timestamp" forNull=""/>
|
||||
<d:param field="date_end" type="timestamp" forNull=""/>
|
||||
<d:param field="is_easy" type="bit" forNull=""/>
|
||||
</d:bean>
|
||||
|
||||
|
||||
<m:dispatch_detail
|
||||
usePRG="No"<!---*** --->
|
||||
pageInfo=#pageInfo#
|
||||
id="#d.__id#"
|
||||
status=#pageInfo.status#
|
||||
trackOut="tr"
|
||||
idAttributesOut="id"
|
||||
/>
|
||||
|
||||
<!--- decoration --->
|
||||
<cfquery name="qDecoration" datasource="#request.DS#">
|
||||
select
|
||||
ds."__createdAt"
|
||||
from elma.deals_services ds
|
||||
where ds.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
|
||||
|
||||
</m:silent><!---
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
------------------------------------------------------------------------------------------------------------------------
|
||||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||||
<layout:attribute name="title">
|
||||
<cfoutput>
|
||||
Версия строки спецификации
|
||||
<cfif len(d.__id)>
|
||||
<b>#d.__name#</b>
|
||||
[#d.__id#]
|
||||
</cfif>
|
||||
</cfoutput>
|
||||
</layout:attribute>
|
||||
</layout:page>
|
||||
|
||||
<!--- <cfif status.errorState GT 0>
|
||||
<cfoutput><div class="err">#status.errorMessage#</div></cfoutput>
|
||||
</cfif>
|
||||
--->
|
||||
<cfoutput>
|
||||
<input type="hidden" name="__id" value="#d.__id#"/>
|
||||
<input type="hidden" name="track" value="#tr.self#"/>
|
||||
<input type="hidden" name="pass" value=""/><!--- pass marker to prevent save on submit --->
|
||||
|
||||
<div class="detail">
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">__id</div>
|
||||
<div class="td">
|
||||
#d.__id#
|
||||
|
||||
<span style="background-color:##e0e0e0">__index </span> #d.__index#
|
||||
|
||||
<span style="background-color:##e0e0e0">__createdAt </span> #dateTimeFormat(qDecoration.__createdAt,"yyyy-MM-dd HH:nn:ss.SSSZ")#
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th"></div>
|
||||
<div class="td"></div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Ключ строки</div>
|
||||
<div class="td">#d.hash#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Тип периодичности</div>
|
||||
<div class="td">#d.type#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Код</div>
|
||||
<div class="td">#d.abstractive_service_code#.#d.modifier_code#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Пользовательское описание</div>
|
||||
<div class="td">#d.user_description#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Количество</div>
|
||||
<div class="td">#d.cnt#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Скидка</div>
|
||||
<div class="td">#d.discount# %</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Сумма</div>
|
||||
<div class="td">
|
||||
<cfquery name="qParamCost">
|
||||
select
|
||||
sum(p.price*p.cnt*(100-COALESCE(p.discount,0))/100) as param_cost
|
||||
,sum(siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))/100) as line_cost
|
||||
from elma.service_parametrs p
|
||||
join elma.deals_services siv on (p.__id = ANY (siv.params))
|
||||
where siv.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
AND p."__deletedAt" IS NULL
|
||||
</cfquery>
|
||||
<b>#nFmt(qParamCost.line_cost)#</b> по строке, с количеством и скидкой (<b>#nFmt(qParamCost.param_cost)#</b> по компонентам)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Версия</div>
|
||||
<div class="td">
|
||||
#d.version# <i>вообще не понимаю, какой смысл вкладывается в эту цифру...</i>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Версии</div>
|
||||
<div class="td">
|
||||
|
||||
<cfquery name="qV">
|
||||
with
|
||||
status(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select siv.__id::text, siv.__index, siv.version
|
||||
, siv.date_nop, siv.date_end, siv.user_description
|
||||
, siv.type, siv.is_easy, siv.cnt, siv.discount
|
||||
, siv.is_actual, siv."__createdAt"
|
||||
, d.__id::text as deal_uid, d.__index as deal_index, d.__name as deal, d.__status_status
|
||||
, a.__id::text as aa_uid, a.index as aa_version, a.__name as additional_agreement
|
||||
, status.status, status.probability_pc
|
||||
,(select
|
||||
sum(siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))/100)
|
||||
from elma.service_parametrs p
|
||||
where p.__id = ANY (siv.params)
|
||||
) as line_cost
|
||||
from elma.deals_services siv
|
||||
left outer join elma.additional_agreements a on (a.__id = ANY(siv.additional_agreement))
|
||||
join elma.deals d on (d.__id = ANY(siv.deal))
|
||||
left outer join status on (d.__status_status = status.status_id)
|
||||
where hash=<cfqueryparam cfsqltype="cf_sql_varchar" value=#d.hash#/>
|
||||
AND siv.is_actual
|
||||
order by d.__index --siv.__index, siv.version
|
||||
</cfquery>
|
||||
<cfloop query=#qV#>
|
||||
<cfif __id EQ toString(d.__id)>
|
||||
<b>#aa_version#:#version#[#__index#]</b>
|
||||
<cfelse>
|
||||
<a href="deal_service.cfm?__id=#__id#&#tr.fwx#" title="версия_дс : версия_строки [индекс_сделки]">#aa_version#:#version#[#__index#]</a>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
(версия_дс : версия_строки [индекс_сделки], только актуальные и со сделкой)
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">is_actual</div>
|
||||
<div class="td">#d.is_actual#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Начало тарификации</div>
|
||||
<div class="td">#dateFormat(d.date_nop,'DD.MM.YYYY')#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Окончание тарификации</div>
|
||||
<div class="td">#dateFormat(d.date_end,'DD.MM.YYYY')#</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Сделка</div>
|
||||
<div class="td">
|
||||
<cfquery name="qDeal">
|
||||
with
|
||||
s(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select
|
||||
d.__id::text
|
||||
,d.__name
|
||||
,c.__name as contragent
|
||||
,c.__id as contragent_uid
|
||||
,d."_plannedDueDate"
|
||||
,d.__index
|
||||
,d.__status_status
|
||||
,c.id_klienta as wz
|
||||
,s.status
|
||||
,s.probability_pc
|
||||
from elma.deals_services siv
|
||||
join elma.deals d on (d.__id = ANY(siv.deal))
|
||||
left outer join elma.companies c on (d._companies=c.__id)
|
||||
left outer join s on (d.__status_status=s.status_id)
|
||||
where siv.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#qDeal#/> --->
|
||||
<cfif qDeal.recordCount>
|
||||
<a href="deal.cfm?__id=#qDeal.__id#&#tr.fwx#">#qDeal.__index# #qDeal.__id#</a> |
|
||||
<a href="contragent.cfm?__id=#qDeal.contragent_uid#&#tr.fwx#">#qDeal.contragent# #qDeal.wz#</a> |
|
||||
#qDeal.__name# |
|
||||
<!--- _plannedDueDate: <cfif len(qDeal._plannedDueDate)><b>#dateFormat(qDeal._plannedDueDate,'DD.MM.YYYY')#</b><cfelse>--</cfif> --->
|
||||
<b>#qDeal.__status_status#: #qDeal.status# (#qDeal.probability_pc#%)</b>
|
||||
</cfif>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="tr">
|
||||
<div class="th">Доп. соглашение</div>
|
||||
<div class="td">
|
||||
<cfquery name="qAdditionalAgreement">
|
||||
select
|
||||
a.__id::text
|
||||
,a.__index
|
||||
,a.__name as additional_agreement
|
||||
,a2.__id::text as base_by_uid
|
||||
,a2.__index
|
||||
,a2.__name as base_by
|
||||
,a.contract_uid::text
|
||||
,a.is_actual
|
||||
,a.last_aa
|
||||
,a.deal_uid::text
|
||||
,a2.deal_uid::text as deal2_uid
|
||||
,d2.__name as deal2
|
||||
,c.__name as contract
|
||||
,c.agreement_id
|
||||
,c.date_of_aggrement
|
||||
,z.__name as contragent
|
||||
,z.__id as contragent_uid
|
||||
,z.id_klienta as wz
|
||||
from elma.deals_services siv
|
||||
join elma.additional_agreements a on (a.__id = ANY(siv.additional_agreement))
|
||||
left outer join elma.additional_agreements a2 on (a2.__id = ANY(a.base_by))
|
||||
left outer join elma.deals d2 on (a2.deal_uid = d2.__id)
|
||||
left outer join elma.aggrements c on (a.contract_uid=c.__id)
|
||||
left outer join elma.companies z on (c.company_uid=z.__id)
|
||||
where siv.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#qAdditionalAgreement#/> --->
|
||||
<cfif len(qAdditionalAgreement.__id)>
|
||||
<a href="additional_agreement.cfm?__id=#qAdditionalAgreement.__id#&#tr.fwx#">
|
||||
#qAdditionalAgreement.__index# #qAdditionalAgreement.__id# #qAdditionalAgreement.additional_agreement#
|
||||
</a> |
|
||||
<a href="contragent.cfm?__id=#qAdditionalAgreement.contragent_uid#&#tr.fwx#">
|
||||
#qAdditionalAgreement.contragent# #qAdditionalAgreement.wz#
|
||||
</a> |
|
||||
Договор
|
||||
<a href="contract.cfm?__id=#qAdditionalAgreement.contract_uid#&#tr.fwx#">
|
||||
#qAdditionalAgreement.contract# (#qAdditionalAgreement.agreement_id#)
|
||||
#dateFormat(qAdditionalAgreement.date_of_aggrement,"YYYY-MM-DD")#
|
||||
</a>
|
||||
|
||||
<br/>
|
||||
is_actual: <b>#qAdditionalAgreement.is_actual#</b>
|
||||
last_aa: <b>#qAdditionalAgreement.last_aa#</b>
|
||||
base_by: <a href="additional_agreement.cfm?__id=#qAdditionalAgreement.base_by_uid#&#tr.fwx#">
|
||||
#qAdditionalAgreement.base_by_uid#
|
||||
#qAdditionalAgreement.base_by#
|
||||
</a>
|
||||
(<a href="deal.cfm?__id=#qAdditionalAgreement.deal2_uid#&#tr.fwx#" title="сделка base_by">
|
||||
#qAdditionalAgreement.deal2_uid#
|
||||
#qAdditionalAgreement.deal2#
|
||||
</a>)
|
||||
</cfif>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
<!--- <div class="tr">
|
||||
<div class="th">Параметры</div>
|
||||
<div class="td">
|
||||
<cfquery name="qParam">
|
||||
select params::text
|
||||
from elma.deals_services siv
|
||||
where siv.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
</cfquery>
|
||||
#qParam.params# (обратная ссылка)
|
||||
</div>
|
||||
</div> --->
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</cfoutput>
|
||||
|
||||
<layout:page section="extension" closeForm="Yes"/>
|
||||
|
||||
<cfif len(d.__id)>
|
||||
<cfquery name="qParam">
|
||||
select
|
||||
p.__id
|
||||
,p.__index
|
||||
,p.__name
|
||||
,p.type
|
||||
,p.price
|
||||
,p.code
|
||||
,p.cnt
|
||||
,p.name
|
||||
,p.ed_izm
|
||||
,p.discount
|
||||
,p.deal::text
|
||||
,p.__index
|
||||
,(p.price*p.cnt*(100-COALESCE(p.discount,0))/100) as param_cost
|
||||
from elma.service_parametrs p
|
||||
join elma.deals_services siv on (p.__id = ANY (siv.params))
|
||||
where siv.__id=<cfqueryparam cfsqltype="cf_sql_other" value=#d.__id# null=#!isValid("guid",d.__id)#/>
|
||||
order by type
|
||||
</cfquery>
|
||||
<cfquery name="qParamTotal" dbtype="query">
|
||||
select
|
||||
sum(param_cost) as total_cost
|
||||
from qParam
|
||||
</cfquery>
|
||||
|
||||
<cfoutput>
|
||||
<h4>Параметры (компоненты) (#qParam.recordCount#)</h4>
|
||||
</cfoutput>
|
||||
|
||||
<!--- <layout:render_query query=#qService#/> --->
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>__index</th>
|
||||
<!--- <th>__name</th> --->
|
||||
<th>type</th>
|
||||
<th>code</th>
|
||||
<th>name</th>
|
||||
<th>Кол-во</th>
|
||||
<th>Ед.изм.</th>
|
||||
<th>Цена</th>
|
||||
<th>Скидка %</th>
|
||||
<th>Ст-ть</th>
|
||||
<!--- <th>deal</th> --->
|
||||
<th>__id</th>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<cfoutput query="qParam">
|
||||
<tr>
|
||||
<td class="c">#__index#</td>
|
||||
<!--- <td class="c">#__name#</td> --->
|
||||
<td class="c">#type#</td>
|
||||
<td class="c">#code#</td>
|
||||
<td class="c">#name#</td>
|
||||
<td class="r">#cnt#</td>
|
||||
<td class="c">#ed_izm#</td>
|
||||
<td class="r">#price#</td>
|
||||
<td class="c">#discount#</td>
|
||||
<td class="r">#nFmt(param_cost)#</td>
|
||||
<!--- <td class="c">#deal#</td> --->
|
||||
<td class="c">#__id#</td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
<cfoutput query="qParamTotal">
|
||||
<tr>
|
||||
<td class="r b" colspan="8">Итого</td>
|
||||
<td class="r b">#nFmt(total_cost)#</td>
|
||||
<td colspan="2"></td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
</cfif>
|
||||
|
||||
|
||||
<cfquery name="qVer">
|
||||
with
|
||||
status(status, status_id, probability_pc) as (VALUES
|
||||
('Закрыта неуспешно',7,0),('Закрыта успешно',6,100),('Договор подписан',5,100),('Договор на подписании',15,90),('Договор на согласовании',12,70),
|
||||
('Тестирование',8,50),('Отправлено ТКП',10,20),('Внутреннее согласование',37,10),('Проработка решения',4,10),('Сбор потребностей',1,0)
|
||||
)
|
||||
select siv.__id::text, siv.__index, siv.version
|
||||
, siv.date_nop, siv.date_end, siv.user_description
|
||||
, siv.type, siv.is_easy, siv.cnt, siv.discount
|
||||
, siv.is_actual, siv."__createdAt"
|
||||
, d.__id::text as deal_uid, d.__index as deal_index, d.__name as deal, d.__status_status
|
||||
, a.__id::text as aa_uid, a.index as aa_version, a.__name as additional_agreement
|
||||
, status.status, status.probability_pc
|
||||
,(select
|
||||
sum(siv.cnt*(100-COALESCE(siv.discount,0))/100*p.price*p.cnt*(100-COALESCE(p.discount,0))/100)
|
||||
from elma.service_parametrs p
|
||||
where p.__id = ANY (siv.params)
|
||||
) as line_cost
|
||||
from elma.deals_services siv
|
||||
left outer join elma.additional_agreements a on (a.__id = ANY(siv.additional_agreement))
|
||||
left outer join elma.deals d on (d.__id = ANY(siv.deal))
|
||||
left outer join status on (d.__status_status = status.status_id)
|
||||
where hash=<cfqueryparam cfsqltype="cf_sql_varchar" value=#d.hash#/>
|
||||
order by d.__index
|
||||
</cfquery>
|
||||
|
||||
<cfquery name="qVerActual" dbtype="query">
|
||||
select * from qVer where is_actual > 0
|
||||
</cfquery> <!--- не повторяем сортировку, хотя это некорректно --->
|
||||
|
||||
<cfquery name="qVerDraft" dbtype="query">
|
||||
select * from qVer where is_actual = 0 OR is_actual IS NULL
|
||||
</cfquery><!--- не повторяем сортировку, хотя это некорректно --->
|
||||
|
||||
|
||||
<cfoutput>
|
||||
<h4>Версии строки без черновиков (#qVerActual.recordCount#)</h4>
|
||||
</cfoutput>
|
||||
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Индекс версии</th>
|
||||
<th>Создана</th>
|
||||
<th>Верс. доп.с.</th>
|
||||
<th>Версия строки</th>
|
||||
<th>is actual</th>
|
||||
<th>НОУ</th>
|
||||
<th>КОУ</th>
|
||||
<th>User Description</th>
|
||||
<th>type</th>
|
||||
<th>Кол-во</th>
|
||||
<th>Скид­ка%</th>
|
||||
<th>Ст-ть</th>
|
||||
<th>Сделка</th>
|
||||
<th>Статус</th>
|
||||
<th>Вер.</th>
|
||||
<th>Доп.с.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<cfoutput query="qVerActual">
|
||||
<tr>
|
||||
<td class="c">
|
||||
<cfif __id EQ toString(d.__id)>
|
||||
<b>#__index#</b>
|
||||
<cfelse>
|
||||
<a href="deal_service.cfm?__id=#__id#&#tr.fwx#" title="#__id#">#__index#</a>
|
||||
</cfif>
|
||||
</td>
|
||||
<td class="c nw">#dateFormat(__createdAt,"YYYY-MM-DD")#</td>
|
||||
<td class="c">#aa_version#</td>
|
||||
<td class="c">#version#</td>
|
||||
<td class="c">#is_actual#</td>
|
||||
<td class="c nw">#dateFormat(date_nop,"YYYY-MM-DD")#</td>
|
||||
<td class="c nw">#dateFormat(date_end,"YYYY-MM-DD")#</td>
|
||||
<td>#user_description#</td>
|
||||
<td class="r">#type#</td>
|
||||
<td class="c">#cnt#</td>
|
||||
<td class="c">#discount#</td>
|
||||
<td class="r nw">#nFmt(line_cost)#</td>
|
||||
<td class="l"><a href="deal.cfm?__id=#deal_uid#&#tr.fwx#" title="#deal_uid#">#deal#</a></td>
|
||||
<td class="c">#__status_status#</td>
|
||||
<td class="c">#probability_pc#</td>
|
||||
<td class="l"><a href="additional_agreement.cfm?__id=#aa_uid#&#tr.fwx#" title="#aa_uid#">#additional_agreement#</a></td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
|
||||
|
||||
<cfoutput>
|
||||
<h4>Версии строки - черновики (#qVerDraft.recordCount#)</h4>
|
||||
</cfoutput>
|
||||
|
||||
<table class="worktable">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Индекс версии</th>
|
||||
<th>Создана</th>
|
||||
<th>Верс. доп.с.</th>
|
||||
<th>Версия строки</th>
|
||||
<th>is actual</th>
|
||||
<th>НОУ</th>
|
||||
<th>КОУ</th>
|
||||
<th>User Description</th>
|
||||
<th>type</th>
|
||||
<th>Кол-во</th>
|
||||
<th>Скид­ка%</th>
|
||||
<th>Ст-ть</th>
|
||||
<th>Сделка</th>
|
||||
<th>Статус</th>
|
||||
<th>Вер.</th>
|
||||
<th>Доп.с.</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<cfoutput query="qVerDraft">
|
||||
<tr>
|
||||
<td class="c">
|
||||
<cfif __id EQ toString(d.__id)>
|
||||
<b>#__index#</b>
|
||||
<cfelse>
|
||||
<a href="deal_service.cfm?__id=#__id#&#tr.fwx#" title="#__id#">#__index#</a>
|
||||
</cfif>
|
||||
</td>
|
||||
<td class="c nw">#dateFormat(__createdAt,"YYYY-MM-DD")#</td>
|
||||
<td class="c">#aa_version#</td>
|
||||
<td class="c">#version#</td>
|
||||
<td class="c">#is_actual#</td>
|
||||
<td class="c nw">#dateFormat(date_nop,"YYYY-MM-DD")#</td>
|
||||
<td class="c nw">#dateFormat(date_end,"YYYY-MM-DD")#</td>
|
||||
<td class="l">#user_description#</td>
|
||||
<td class="r">#type#</td>
|
||||
<td class="c">#cnt#</td>
|
||||
<td class="c">#discount#</td>
|
||||
<td class="r nw">#nFmt(line_cost)#</td>
|
||||
<td class="l"><a href="deal.cfm?__id=#deal_uid#&#tr.fwx#" title="#deal_uid#">#deal#</a></td>
|
||||
<td class="c">#__status_status#</td>
|
||||
<td class="c">#probability_pc#</td>
|
||||
<td class="l"><a href="additional_agreement.cfm?__id=#aa_uid#&#tr.fwx#" title="#aa_uid#">#additional_agreement#</a></td>
|
||||
</tr>
|
||||
</cfoutput>
|
||||
</table>
|
||||
|
||||
|
||||
|
||||
|
||||
<!--- <cfdump var=#qVer#/> --->
|
||||
|
||||
|
||||
<layout:page section="footer"/>
|
||||
-456
@@ -1,456 +0,0 @@
|
||||
|
||||
<cfset dt_finish=createDateTime(year(Now()),month(Now()),1,0,0,0)/>
|
||||
<cfset dt_start=dateAdd('m',-1,dt_finish)/>
|
||||
<cfset hours=dateDiff('h',dt_start,dt_finish)/>
|
||||
|
||||
Внимание! округление вверх при расчете метрик
|
||||
|
||||
<cfdump var=#dt_start#/>
|
||||
<cfdump var=#dt_finish#/>
|
||||
<cfdump var=#hours#/>
|
||||
|
||||
<!--- Нужно еще применить политики бесплатного минимума --->
|
||||
|
||||
<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, p.code, p.price, p.discount, k.__name as contragent, a.__name as contract, d.__name as deal, siv.abstractive_service as abstract_service, siv.modifier, siv.user_description
|
||||
,p.__name as metric, p.ed_izm
|
||||
--, 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
|
||||
order by k.id_klienta, p.code
|
||||
</cfquery>
|
||||
<!--- здесь имеем список кодов с ценами и WZ. Каждому коду можно поставить в соответствие запрос, который даст по нему выборку. Изредка один запрос может вывести 2 кода, но разбить на 2 запроса легко. Кроме того, запросы можно объединить через union в один - может быть, так будет лучше читаться (быстрее выполняться не будет) --->
|
||||
<cfdump var=#qSpec#/>
|
||||
|
||||
|
||||
<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#/> --->
|
||||
|
||||
<!--- переделать 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>
|
||||
<!--- <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
|
||||
,round(sum(bucket_stat.usage_rgw_main_size_actual)/<cfqueryparam cfsqltype="cf_sql_integer" value=#hours#/>/1024/1024/1024) as vol_GB
|
||||
,greatest(round(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="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>
|
||||
<!--- <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', 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', get as raw_metric, get_10k as metric, get_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.put', put as raw_metric, put_10k as metric, put_10k_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
union all
|
||||
select wz, code || '.trf', bytes_sent as raw_metric, bytes_sent_gb as metric, bytes_sent_gb_free_tier_subtracted as chargeable_metric from qS3OpsTrf
|
||||
</cfquery>
|
||||
<cfdump var=#qUnifiedMetric#/>
|
||||
|
||||
<cfquery name="qCharge" dbType="query">
|
||||
SELECT
|
||||
wz
|
||||
,code
|
||||
,price
|
||||
,discount
|
||||
,contragent
|
||||
,contract
|
||||
,deal
|
||||
,abstract_service
|
||||
,modifier
|
||||
,user_description
|
||||
,ed_izm
|
||||
FROM qSpec as s, qUnifiedMetric as m WHERE s.wz=m.wz AND s.code=m.code
|
||||
</cfquery>
|
||||
<!--- looks like QoQ does not support join syntax, at least of Lucee 5.4--->
|
||||
<cfdump var=#qCharge#/>
|
||||
<!---
|
||||
--->
|
||||
<!--- --,m.*
|
||||
--,s.price*(100-s.discount)/100 as discounted_price
|
||||
--,s.price*(100-s.discount)/100*m.chargeable_metric as charge --->
|
||||
<!--- В одном месте user_id int в другом owner varchar --->
|
||||
|
||||
<!---
|
||||
задача (вызванная сыростью базы биллинга)
|
||||
смапить код параметра с VDC (1:n)
|
||||
iaas.ngc.i31.ram-m
|
||||
iaas.ngc.a28.ram-m
|
||||
|
||||
cl01:
|
||||
7 хостов Lenovo ThinkSystem SR650 -[7X06CTO1WW]-
|
||||
2 процессора Xeon(R) Gold 6226R 16 ядер 32 потока каждый 2.9 ГГц
|
||||
1.25тб озу в каждом.
|
||||
В 4 из 7 есть по 4 GPU NVIDIA A16 16GB в каждом.
|
||||
|
||||
cl01-vsan:
|
||||
16 хостов Lenovo ThinkSystem SR650 -[7X06CTO1WW]-
|
||||
2 процессора Xeon(R) Gold 6226R 16 ядер 32 потока каждый 2.9 ГГц
|
||||
1.25тб озу в каждом.
|
||||
В 9 из 16 есть по 4 GPU NVIDIA A16 16GB в каждом.
|
||||
|
||||
cl02:
|
||||
10 Huawei 2488H V5
|
||||
4 процессора Xeon(R) Gold 6254 18 ядер 36 потоков каждый. 3.1 ГГц
|
||||
2тб озу в каждом.
|
||||
|
||||
5 Huawei Atlas 800 (Model 3010)
|
||||
2 процессора Xeon(R) Gold 6254 18 ядер 36 потоков каждый. 3.1 ГГц
|
||||
1.5тб озу в каждом.
|
||||
|
||||
cl04-vsan:
|
||||
10 Apex AR320-12
|
||||
2 процессора AMD EPYC 7543 32 ядра 64 потока каждый. 2.8 ГГц
|
||||
2тб озу в каждом.
|
||||
18 Apex AR320-12-E7543
|
||||
2 процессора AMD EPYC 7543 32 ядра 64 потока каждый. 2.8 ГГц
|
||||
2тб озу в каждом.
|
||||
|
||||
cl05-1c:
|
||||
1 Asus RS720A-E12-RS24U
|
||||
2 процессора AMD EPYC 9274F 24 ядра 48 потоков каждый. 4.05 ГГц
|
||||
1тб озу.
|
||||
|
||||
7 ручная сборка
|
||||
MB Asus ProArt B650-Creator
|
||||
Процессор AMD Ryzen 9 7950X 16 ядер 32 потока каждый. 4.5 ГГц
|
||||
192гб озу каждый.
|
||||
|
||||
1 ручная сборка
|
||||
процессор AMD Ryzen Threadripper PRO 5995WX 64 ядра 128 потоков каждый. 2.7 ГГц
|
||||
512гб озу.
|
||||
|
||||
cl06-vsan:
|
||||
15 R320
|
||||
2 процессора Xeon(R) Gold 6342 24 ядра 48 потоков каждый. 2.8 ГГц
|
||||
1тб озу каждый.
|
||||
|
||||
Xeon(R) Gold 6226R 2.9 ГГц
|
||||
Xeon(R) Gold 6254 3.1 ГГц
|
||||
AMD EPYC 7543 2.8 ГГц
|
||||
AMD EPYC 9274F 4.05 ГГц
|
||||
AMD Ryzen 9 7950X 4.5 ГГц
|
||||
AMD Ryzen Threadripper PRO 5995WX 2.7 ГГц
|
||||
Xeon(R) Gold 6342 2.8 ГГц --->
|
||||
|
||||
<!--- 2025-08-15 20:47:44 *** Операции S3 считаются не так, как написано в тарифе. Например, считается list. В тарифе вообще не описан минимальный лимит --->
|
||||
|
||||
<!--- BEGIN
|
||||
RETURN QUERY
|
||||
(
|
||||
select
|
||||
billing_per_user_fix_pl.placement as placement,
|
||||
(CASE
|
||||
WHEN ( billing_per_user_fix_pl.placement = 'HOT'
|
||||
) THEN greatest(ceil(sum(size)/1024/1024/1024)-1,0)
|
||||
WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
|
||||
) THEN ceil(sum(size)/1024/1024/1024)
|
||||
END) AS size_GB,
|
||||
(CASE
|
||||
WHEN ( billing_per_user_fix_pl.placement = 'HOT'
|
||||
) THEN greatest(ceil(sum(get)/10000)-10,0)
|
||||
WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
|
||||
) THEN ceil(sum(get)/10000)
|
||||
END) AS get_10k,
|
||||
(CASE
|
||||
WHEN ( billing_per_user_fix_pl.placement = 'HOT'
|
||||
) THEN greatest(ceil(sum(put)/10000)-1,0)
|
||||
WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
|
||||
) THEN ceil(sum(put)/10000)
|
||||
END) AS put_10k,
|
||||
(CASE
|
||||
WHEN ( billing_per_user_fix_pl.placement = 'HOT'
|
||||
) then greatest(ceil(sum(bytes_sent)/1024/1024/1024)-100,0)
|
||||
WHEN ( not billing_per_user_fix_pl.placement = 'HOT'
|
||||
) THEN ceil(sum(bytes_sent)/1024/1024/1024)
|
||||
END) AS bytes_sent_GB
|
||||
from s3billing.billing_per_user_fix_pl(_ds,_df,_user)
|
||||
group by billing_per_user_fix_pl.placement
|
||||
UNION all
|
||||
select
|
||||
'HOT_FREE_LIMIT' as placement,
|
||||
'1' AS size_GB,
|
||||
'10' AS get_10k,
|
||||
'1' AS put_10k,
|
||||
'100' AS bytes_sent_GB
|
||||
);
|
||||
END; --->
|
||||
|
||||
<!---
|
||||
BEGIN
|
||||
RETURN QUERY
|
||||
|
||||
SELECT
|
||||
s3billing.bucket_info.name AS bucket_name,
|
||||
(case
|
||||
when ( s3billing.placement.name = 'default-placement') then 'HOT'
|
||||
WHEN ( not s3billing.placement.name = 'default-placement' ) THEN s3billing.placement.name
|
||||
end
|
||||
) as placement,
|
||||
coalesce(round(sum(usage_rgw_main_size_actual)/
|
||||
(SELECT (DATE_PART('day',
|
||||
((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
|
||||
-TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
|
||||
)*24+
|
||||
DATE_PART('hour',
|
||||
((TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS'))
|
||||
-TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS'))
|
||||
)))
|
||||
|
||||
)::numeric,0) AS size
|
||||
,coalesce(s2.get, 0) AS get
|
||||
,coalesce(s2.put, 0) AS put
|
||||
,coalesce(s2.bytes_sent, 0) as bytes_sent
|
||||
FROM s3billing.bucket_stat
|
||||
INNER JOIN s3billing.placement ON s3billing.bucket_stat.placement_id=s3billing.placement.id
|
||||
INNER JOIN s3billing.bucket_info ON s3billing.bucket_stat.bucket_id=s3billing.bucket_info.id
|
||||
LEFT JOIN (
|
||||
SELECT
|
||||
s1.bucket_id AS bucket_id
|
||||
,s1.bucket_name AS bucket_name,
|
||||
(case
|
||||
when ( s1.placement = 'default-placement') then 'HOT'
|
||||
WHEN ( not s1.placement = 'default-placement' ) THEN s1.placement
|
||||
end
|
||||
) as placement
|
||||
,coalesce(sum(s1.get) ,0) AS get
|
||||
,coalesce(sum(s1.put) ,0) AS put
|
||||
,coalesce(sum(s1.bytes_sent), 0) AS bytes_sent
|
||||
FROM (
|
||||
SELECT
|
||||
s3billing.bucket_info.id AS bucket_id
|
||||
,s3billing.bucket_info.name AS bucket_name
|
||||
,(case
|
||||
when ( s3billing.placement.name = 'default-placement') then 'HOT'
|
||||
WHEN ( not s3billing.placement.name = 'default-placement' ) THEN s3billing.placement.name
|
||||
end
|
||||
) as placement
|
||||
,(CASE
|
||||
WHEN ( s3billing.category.name LIKE 'get%'
|
||||
OR s3billing.category.name LIKE 'head%'
|
||||
OR s3billing.category.name LIKE 'options%'
|
||||
) THEN coalesce(sum(ops), 0)
|
||||
END) AS get
|
||||
,(CASE
|
||||
WHEN ( s3billing.category.name LIKE 'put%'
|
||||
OR s3billing.category.name LIKE 'post%'
|
||||
OR s3billing.category.name LIKE 'patch%'
|
||||
OR s3billing.category.name LIKE 'list%'
|
||||
) THEN coalesce(sum(ops), 0)
|
||||
END) AS put
|
||||
,coalesce(sum(usage_bucket_by_user.bytes_sent), 0) AS bytes_sent
|
||||
|
||||
FROM
|
||||
s3billing.usage_bucket_by_user
|
||||
INNER JOIN s3billing.bucket_info ON s3billing.usage_bucket_by_user.bucketid = s3billing.bucket_info.id
|
||||
INNER JOIN s3billing.placement ON s3billing.bucket_info.placement_id = s3billing.placement.id
|
||||
INNER JOIN s3billing.user_info ON s3billing.usage_bucket_by_user.user_id = s3billing.user_info.id
|
||||
INNER JOIN s3billing.category ON s3billing.usage_bucket_by_user.category_id = s3billing.category.id
|
||||
|
||||
WHERE
|
||||
s3billing.user_info.name=_user
|
||||
AND s3billing.usage_bucket_by_user.time >=TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
|
||||
AND s3billing.usage_bucket_by_user.time < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
|
||||
GROUP BY
|
||||
s3billing.bucket_info.name
|
||||
,s3billing.placement.name
|
||||
,s3billing.category.name
|
||||
,s3billing.bucket_info.id
|
||||
) AS s1
|
||||
|
||||
GROUP BY
|
||||
s1.bucket_name
|
||||
,s1.bucket_id
|
||||
,s1.placement
|
||||
|
||||
ORDER BY
|
||||
s1.placement
|
||||
,s1.bucket_name
|
||||
|
||||
) AS s2 ON s2.bucket_id = s3billing.bucket_stat.bucket_id
|
||||
WHERE owner=_user
|
||||
AND timestamp_addition >= TO_TIMESTAMP(_ds, 'YYYY-MM-DD HH24:MI:SS')
|
||||
AND timestamp_addition < TO_TIMESTAMP(_df, 'YYYY-MM-DD HH24:MI:SS')
|
||||
GROUP BY
|
||||
s3billing.bucket_info.name
|
||||
,s3billing.placement.name
|
||||
,s3billing.bucket_stat.bucket_id
|
||||
,s2.get
|
||||
,s2.put
|
||||
,s2.bytes_sent
|
||||
ORDER BY
|
||||
s3billing.placement.name
|
||||
,s3billing.bucket_info.name
|
||||
;
|
||||
END; --->
|
||||
<!--- select * from s3billing.billing_per_user_fix_pl('2025-05-01 00:00:00','2025-06-01 00:00:00','1395'); --->
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
|
||||
|
||||
<!--- Нужно еще применить политики бесплатного минимума --->
|
||||
|
||||
<!--- *** коды лучше взять из каталога --->
|
||||
<cfquery name="qCode" datasource="dwh">
|
||||
select distinct p.code
|
||||
from elma.deals d
|
||||
@@ -30,7 +30,13 @@
|
||||
order by p.code
|
||||
</cfquery>
|
||||
<!--- <cfdump var=#qCode#/> --->
|
||||
<cfquery name="qContragent" datasource="dwh">
|
||||
select k.id_klienta as wz, k.__id::text as contragent_uid, k.__name as contragent
|
||||
from elma.companies k
|
||||
where k."__deletedAt" IS NULL
|
||||
</cfquery>
|
||||
|
||||
<!--- нужны компании, которые есть в пейге --->
|
||||
<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
|
||||
@@ -47,6 +53,7 @@
|
||||
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>
|
||||
<!--- siv means specification item version --->
|
||||
<cfquery name="qSivAge" datasource="dwh">
|
||||
select max(dt_load) as dt_load from elma.deals_services
|
||||
</cfquery>
|
||||
@@ -58,7 +65,7 @@
|
||||
|
||||
|
||||
<cfquery name="qComputing" datasource="billing-vc">
|
||||
select 'WZ'||to_char(tenant.wzcode,'FM00000') as wz, vdc.name as vdc_name,
|
||||
select m.clientid 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'
|
||||
@@ -69,12 +76,18 @@
|
||||
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
|
||||
join ngcloud_ru.tenant t on (t.id=vdc.tenant_id)
|
||||
left outer join
|
||||
(select tenant_id, ts, metadata_id,
|
||||
ROW_NUMBER() OVER (PARTITION BY tenant_id ORDER BY ts desc, metadata_id desc) as rn
|
||||
from ngcloud_ru.tenant_metadata
|
||||
) tm on (t.id = tm.tenant_id AND tm.rn = 1)
|
||||
left outer join ngcloud_ru.metadata m on (tm.metadata_id=m.id)
|
||||
where length(m.clientid) > 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;
|
||||
group by m.clientid, vdc.name
|
||||
order by m.clientid, vdc.name;
|
||||
</cfquery>
|
||||
|
||||
<cfif isDefined("DEBUG")>
|
||||
@@ -89,7 +102,7 @@
|
||||
|
||||
<!--- переделать 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,
|
||||
select m.clientid 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'
|
||||
@@ -107,13 +120,19 @@
|
||||
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.tenant t on t.id=vdc.tenant_id
|
||||
left outer join
|
||||
(select tenant_id, ts, metadata_id,
|
||||
ROW_NUMBER() OVER (PARTITION BY tenant_id ORDER BY ts desc, metadata_id desc) as rn
|
||||
from ngcloud_ru.tenant_metadata
|
||||
) tm on (t.id = tm.tenant_id AND tm.rn = 1)
|
||||
left outer join ngcloud_ru.metadata m on (tm.metadata_id=m.id)
|
||||
join ngcloud_ru.storage_profile_types on capacity_storage.storage_profile_types_id=storage_profile_types.id
|
||||
where tenant.wzcode > 0
|
||||
where length(m.clientid) > 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;
|
||||
group by m.clientid, vdc.name, storage_profile_types.name
|
||||
order by m.clientid, 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
|
||||
@@ -267,11 +286,11 @@ select wz, code || '.trf-m', bytes_sent as raw_metric, bytes_sent_gb as metric,
|
||||
<cfflush/>
|
||||
</cfif>
|
||||
|
||||
<cfquery name="qCharge" dbType="query">
|
||||
<cfquery name="qChargeInner" 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="WZ">c.wz</d:field>
|
||||
<d:field title="Артикул">m.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>
|
||||
@@ -283,8 +302,8 @@ SELECT
|
||||
<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="Контрагент">c.contragent</d:field>
|
||||
<d:field title="contragent_uid">c.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>
|
||||
@@ -296,10 +315,48 @@ SELECT
|
||||
<d:field title="Компонент">s.component</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
|
||||
FROM qUnifiedMetric m, qContragent c, qSpec s WHERE m.wz=c.wz AND m.wz=s.wz AND m.code=s.code
|
||||
</cfquery>
|
||||
<!--- looks like QoQ does not support join syntax, at least of Lucee 5.4--->
|
||||
|
||||
<cfquery name="qChargeOuter" dbType="query">
|
||||
SELECT
|
||||
<d:field_set titleMapOut="titleMap_" lengthOut="fieldCount_">
|
||||
<d:field title="WZ">c.wz</d:field>
|
||||
<d:field title="Артикул">m.code</d:field>
|
||||
<d:field title="Кол-во (метрика)" cfSqlType="CF_SQL_NUMERIC">m.chargeable_metric</d:field>
|
||||
<d:field title="Ед.изм.">null as ed_izm</d:field>
|
||||
<d:field title="Цена &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">null discounted_price</d:field>
|
||||
<d:field title="Стоимость &##8381; с НДС" cfSqlType="CF_SQL_NUMERIC">0 as charge</d:field>
|
||||
<d:field title="Дата НОУ" cfSqlType="CF_SQL_TIMESTAMP">null as dt_from</d:field>
|
||||
<d:field title="Дата оконч." cfSqlType="CF_SQL_TIMESTAMP">null as dt_to</d:field>
|
||||
<d:field title="Ключ строки">null as line_key</d:field>
|
||||
<d:field title="GPL с НДС" cfSqlType="CF_SQL_NUMERIC">null as price</d:field>
|
||||
<d:field title="Скидка%" cfSqlType="CF_SQL_NUMERIC">null as 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="Контрагент">c.contragent</d:field>
|
||||
<d:field title="contragent_uid">c.contragent_uid</d:field>
|
||||
<d:field title="Договор">null as contract</d:field>
|
||||
<d:field title="contract_uid">null as contract_uid</d:field>
|
||||
<d:field title="Допник">null as additional_agreement</d:field>
|
||||
<d:field title="additional_agreement_uid">null as additional_agreement_uid</d:field>
|
||||
<d:field title="Сделка">null as deal</d:field>
|
||||
<d:field title="deal_uid">null as deal_uid</d:field>
|
||||
<d:field title="Абстрактная услуга">null as abstract_service</d:field>
|
||||
<d:field title="Модификатор">null as modifier</d:field>
|
||||
<d:field title="Компонент">null as component</d:field>
|
||||
<d:field title="Клиентс. назв.">null as user_description</d:field>
|
||||
</d:field_set>
|
||||
FROM qUnifiedMetric m, qContragent c WHERE m.wz=c.wz AND m.wz NOT IN (#listQualify(listRemoveDuplicates(ValueList(qChargeInner.wz)),"'")#)
|
||||
</cfquery>
|
||||
|
||||
<cfquery name="qCharge" dbType="query">
|
||||
select * from qChargeInner
|
||||
union
|
||||
select * from qChargeOuter
|
||||
order by wz,code
|
||||
</cfquery>
|
||||
<!--- QoQ does not support join syntax, at least of Lucee 5.4--->
|
||||
|
||||
|
||||
|
||||
@@ -408,7 +465,7 @@ S3 операции и трафик: <b>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M
|
||||
<td class="r">#dateFormat(dt_to,'YYYY-MM-DD')#</td>
|
||||
|
||||
<td class="r">#line_key#</td>
|
||||
<td class="r" style="color:lightgray">#raw_metric#</td>
|
||||
<td class="r" style="color:##bbb">#raw_metric#</td>
|
||||
<td class="r">#metric#</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>
|
||||
@@ -431,3 +488,12 @@ S3 операции и трафик: <b>#dateFormat(qS3OpsTrfAge.dt_load,'YYYY-M
|
||||
|
||||
<!--- select * from s3billing.billing_per_user_fix_pl('2025-05-01 00:00:00','2025-06-01 00:00:00','1395'); --->
|
||||
|
||||
<!--- select t.id as tenant_id,
|
||||
from ngcloud_ru.tenant t
|
||||
left outer join
|
||||
(select tenant_id, ts, metadata_id,
|
||||
ROW_NUMBER() OVER (PARTITION BY tenant_id ORDER BY ts desc, metadata_id desc)
|
||||
as rn
|
||||
from ngcloud_ru.tenant_metadata) tm
|
||||
on (t.id = tm.tenant_id AND tm.rn = 1)
|
||||
left outer join ngcloud_ru.metadata m on (tm.metadata_id=m.id) --->
|
||||
Reference in New Issue
Block a user