spec/specification_item_ls.cfm

229 lines
13 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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="specification_item" 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.specification_item_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 /*переделать выборку версий через group by*/
<d:field_set titleMapOut="titleMap" lengthOut="fieldCount">
<d:field title="contract_id" cfSqlType="CF_SQL_INTEGER">a.contract_id</d:field>
<d:field title="Ключ сделки">a.deal_uid</d:field>
<d:field title="Вер-ть%">a.probability_perc</d:field>
<d:field title="Сделка">a.agreement</d:field>
<d:field title="Соглашение">a.agreement_version</d:field>
<d:field title="Тип сделки">case when a.agreement_version = 0 then 'New sale' else 'Up sale' end as deal_type</d:field>
<!--- <d:field title="Дата соглашения">a.dt_specification_item</d:field> --->
<!--- <d:field title="Описание">a.descr</d:field> --->
<d:field title="Спец-я">s.specification</d:field>
<d:field>si.specification_id</d:field>
<d:field title="Договор">d.contract</d:field>
<d:field title="Дата договора">d.dt_contract</d:field>
<d:field title="Контрагент">k.contragent</d:field>
<d:field title="Ключ строки">siv.specification_item_uid</d:field>
<d:field title="Сервис">siv.specification_item_version</d:field>
<d:field title="svc_id">si.svc_id</d:field>
<d:field title="Ц/обр">si.pricing_model_id</d:field>
<d:field title="Ц/обр">p.pricing_model_short</d:field>
<d:field title="Код">svc.code</d:field>
<d:field title="Дата с">siv.dt_from</d:field>
<d:field title="Дата по">siv.dt_to</d:field>
<d:field title="Кол-во">siv.quantity</d:field>
<d:field title="Цена">siv.price</d:field>
<d:field title="Стоимость">siv.price*siv.quantity as cost</d:field>
<d:field title="Кол-во прошлое">ver.quantity as quantity_prev</d:field>
<d:field title="Цена прошлая">ver.price as price_prev</d:field>
<d:field title="Ст-ть прошлая">ver.price*ver.quantity as cost_prev</d:field>
<d:field title="Версия прошлая">ver.agreement_version as version_prev</d:field>
<d:field title="Изменение стоимости">COALESCE(siv.price*siv.quantity,0) - COALESCE(ver.price*ver.quantity,0) as cost_diff</d:field>
<d:field title="Изм-е с верoят.">(COALESCE(siv.price*siv.quantity*a.probability_perc/100,0) - COALESCE(ver.price*ver.quantity*ver.probability_perc/100,0)) as cost_diff_prob</d:field>
</d:field_set>
from specification_item_version siv
join specification_item si on (siv.specification_item_uid=si.specification_item_uid)
join specification s on (si.specification_id=s.specification_id)
join agreement a on (s.contract_id=a.contract_id AND siv.agreement_version=a.agreement_version)
join contract d on s.contract_id=d.contract_id
join contragent k on d.contragent_id=k.contragent_id
join svc on (si.svc_id=svc.svc_id)
join pricing_model p on (si.pricing_model_id=p.pricing_model_id)
left outer join (select
siv1.agreement_version
,siv1.specification_item_uid
,a1.agreement
,a1.contract_id
,a1.dt_agreement
,a1.is_actual
,a1.probability_perc
,siv1.specification_item_version
,siv1.quantity
,siv1.price
,siv1.dt_from
,siv1.dt_to
,ii1.specification_id
from specification_item_version siv1
join specification_item ii1 on (siv1.specification_item_uid=ii1.specification_item_uid)
join specification is1 on (ii1.specification_id=is1.specification_id)
join agreement a1 on (siv1.agreement_version=a1.agreement_version AND is1.contract_id=a1.contract_id)
) ver on (si.specification_item_uid=ver.specification_item_uid AND ver.specification_id=s.specification_id
AND ver.agreement_version = (select max(iiv.agreement_version)
from specification_item_version iiv
join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid)
join specification isp on (ii.specification_id=isp.specification_id)
join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version)
where iiv.specification_item_uid=si.specification_item_uid
AND ia.is_actual
AND ia.agreement_version < a.agreement_version
)
)
where a.agreement_version=(select max(iiv.agreement_version) from specification_item_version iiv
join specification_item ii on (iiv.specification_item_uid=ii.specification_item_uid)
join specification isp on (ii.specification_id=isp.specification_id)
join agreement ia on (isp.contract_id=ia.contract_id AND iiv.agreement_version=ia.agreement_version)
where iiv.specification_item_uid=si.specification_item_uid
--AND ia.is_actual
)
<!--- 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 specification_item 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: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_agreement_version')/>
<cfset titleMap.f_agreement_version=titleMap.agreement_version/>
<cfset queryAddColumn(qRead,'f_specification_item_uid')/>
<cfset titleMap.f_specification_item_uid=titleMap.specification_item_uid/>
<cfset queryAddColumn(qRead,'f_contract')/>
<cfset titleMap.f_contract=titleMap.contract/>
<cfset queryAddColumn(qRead,'f_specification')/>
<cfset titleMap.f_specification=titleMap.specification/>
<cfset queryAddColumn(qRead,'f_version_prev')/>
<cfset titleMap.f_version_prev=titleMap.version_prev/>
<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#><!--- *** Здесь некомфортное дублирование startRow, maxRows с вызовом c:table ниже, причем в c:table оно закопано в модуль, и аргументы называются по-разному... но мы хотим немного сэкономить и не обрабатывать весь резалтсет --->
<!--- *** тут можно было бы спокойно использовать суррогатный альтернативный ключ, но хочется проверить, как будет работать track на составном ключе. Кстати, я все равно его использую как ancor name --->
<cfsavecontent variable="qRead.f_link_view_edit">
<a href="specification_item_version.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#agreement_version#&#tr.fwx#" name="#specification_item_uid#" <cfif pageInfo.writePermitted()>title="редактировать" class="edit"<cfelse>title="просмотр" class="view"</cfif>></a>
</cfsavecontent>
<cfsavecontent variable="qRead.f_agreement_version">
<a href="agreement.cfm?contract_id=#contract_id#&agreement_version=#agreement_version#&#tr.fwx#">#agreement# [#agreement_version#]</a>
</cfsavecontent>
<cfsavecontent variable="qRead.f_specification_item_uid">
<a href="specification_item.cfm?specification_item_uid=#specification_item_uid#&#tr.fwx#">#specification_item_uid#</a>
</cfsavecontent>
<cfsavecontent variable="qRead.f_contract">
<a href="contract.cfm?contract_id=#contract_id#&#tr.fwx#">#contract# #dateformat(dt_contract,"YYYY-MM-DD")#</a>
</cfsavecontent>
<cfsavecontent variable="qRead.f_specification">
<a href="specification.cfm?specification_id=#specification_id#&#tr.fwx#">#specification#</a>
</cfsavecontent>
<cfsavecontent variable="qRead.f_version_prev">
<a href="specification_item_version.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#agreement_version#&#tr.fwx#">#version_prev#</a>
</cfsavecontent>
<cfsavecontent variable="qRead.f_link_del">
<cfif pageInfo.writePermitted()><a href="specification_item_version_del.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#agreement_version#&#tr.fwx#" class="del" title="удалить"></a></cfif>
</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:th><!--- <a href="specification_item.cfm?contract_id=&specification_item_version="><img src="img/add.gif"/></a> ---></c:th>
<c:td field="f_link_view_edit" class="c"/>
</c:column>
<c:column width="7%" field="contragent"/>
<c:column width="5%" field="f_contract"/>
<c:column width="2%" field="f_specification"/>
<c:column width="3%" field="f_agreement_version"/>
<c:column width="3%" field="deal_type"><c:td class="c"/></c:column>
<c:column width="8%" field="f_specification_item_uid"/>
<c:column width="3%" field="probability_perc"><c:td class="r"/></c:column>
<c:column width="7%" field="specification_item_version"/>
<c:column width="1%" field="pricing_model_short"/>
<c:column width="5%" field="dt_from" formatter=#function(dt){return dateformat(dt,"YYYY-MM-DD");}#><c:td class="c"/></c:column>
<c:column width="2%" field="dt_to" formatter=#function(dt){return dateformat(dt,"YYYY-MM-DD");}#><c:td class="c"/></c:column>
<c:column width="3%" field="quantity"><c:td class="r"/></c:column>
<c:column width="3%" field="price"><c:td class="r"/></c:column>
<c:column width="3%" field="cost"><c:td class="r"/></c:column>
<c:column width="3%" field="agreement_version"><c:td class="c"/></c:column>
<c:column width="3%" field="f_version_prev"><c:td class="c"/></c:column>
<c:column width="3%" field="quantity_prev"><c:td class="r"/></c:column>
<c:column width="3%" field="price_prev"><c:td class="r"/></c:column>
<c:column width="3%" field="cost_prev"><c:td class="r"/></c:column>
<c:column width="3%" field="cost_diff"><c:td class="r"/></c:column>
<c:column width="3%" field="cost_diff_prob"><c:td class="r"/></c:column>
<c:column width="1%" sortable="false">
<c:td field="f_link_del" class="c"/>
</c:column>
</c:table>
<cfoutput>#gridFooter#</cfoutput>
<!--- Расчета по дням тут нет.
Дата По на самом деле нигде не используется.
Важное допущение: вероятность прошлой сделки принимается за 100% (то есть изменения имеют смысл только к действующему договору) уже нет --->
</cfif>
<layout:page section="footer"/>