spec/abstract_service_param_class.cfm
2025-06-02 16:16:51 +03:00

278 lines
13 KiB
Plaintext
Raw 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="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="abstract_service_param_class" key="abstract_service_param_class_id" pageInfoOut="pageInfo"/>
<d:bean readonly=#!pageInfo.writePermitted()# table="#pageInfo.entity#" datasource="#request.DS#" output="d" status="status">
<d:param field="abstract_service_param_class_id" type="integer" key autoincrement/>
<d:param field="abstract_service_id" type="integer" required/>
<d:param field="param_class_id" type="integer" forNull=""/>
<d:param field="is_multiple" type="bit" init="0" default="0"/>
<d:param field="sort" type="integer" forNull=""/>
<d:param field="descr" type="varchar" preprocessor=#plain2HtmClean#/>
<d:param field="creator_id" type="integer" value="#request.usr_id#" skipUpdate/>
<d:param field="updater_id" type="integer" value="#request.usr_id#" />
<d:param field="dt_created" type="timestamp" value="#Now()#" skipUpdate/>
<d:param field="dt_updated" type="timestamp" value="#Now()#"/>
</d:bean>
<!--- <cfdump var=#form#/>
<cfdump var=#d#/> --->
<m:dispatch_detail
usePRG="No"<!---*** --->
pageInfo=#pageInfo#
id="#d.abstract_service_param_class_id#"
status=#pageInfo.status#
trackOut="tr"
idAttributesOut="id"
/>
<cfquery name="qAbstractService" datasource="#request.DS#">
select
a.abstract_service
,a.abstract_service_id
,a.code
from abstract_service a
where a.abstract_service_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.abstract_service_id#" null=#!isNumeric(d.abstract_service_id)#/>
</cfquery>
<!---*** Имена запросов ниже по тексту переопределяются--->
<cfquery name="qParamClass" datasource="#request.DS#">
select p.param_class, m.measure_id, m.measure
from param_class p
left outer join measure m on m.measure_id=p.measure_id
where param_class_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.param_class_id#" null=#!isNumeric(d.param_class_id)#/>
</cfquery>
<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 #pageInfo.entity# e
left outer join usr a on (e.creator_id=a.usr_id)
left outer join usr m on (e.updater_id=m.usr_id)
where e.#pageInfo.key#=<cfqueryparam attributeCollection=#id#/>
</cfquery>
</m:silent><!---
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------
---><layout:page section="header" pageInfo=#pageInfo#>
<layout:attribute name="title">
<cfoutput>
Компонент [#d.abstract_service_param_class_id#]
<cfif d.param_class_id GT 0>
<b>#qParamClass.param_class#</b> [#d.param_class_id#]
</cfif>
абстрактной услуги
<cfif d.abstract_service_id GT 0>
<b>#qAbstractService.abstract_service#</b> [#d.abstract_service_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="abstract_service_param_class_id" value="#d.abstract_service_param_class_id#"/>
<input type="hidden" name="abstract_service_id" value="#d.abstract_service_id#"/>
<!--- <input type="hidden" name="param_class_id" value="#d.param_class_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">Абстрактная услуга</div>
<div class="td">
<a href="abstract_service.cfm?abstract_service_id=#qAbstractService.abstract_service_id#&#tr.fwx#">#qAbstractService.code# <b>#qAbstractService.abstract_service#</b> </a>
</div>
</div>
<div class="tr">
<div class="th">Компонент</div>
<div class="td">
<cfquery name="qList" datasource="#request.DS#">
select c.param_class_id, c.param_class, m.measure_short
from param_class c
left outer join measure m on (c.measure_id=m.measure_id)
order by 2
</cfquery>
<c:combo
query=#qList#
combo="param_class_id"
id="param_class_id"
key="param_class_id"
selected="#d.param_class_id#"
displayf="##param_class## ##measure_short##"
empty=""
class=""
<!--- onchange="documen t.getElementById('param_id').selectedIndex=0; /*document.getElementById('base_price').value='';*/ --->
onchange="submit();"
/>
<cfif d.param_class_id GT 0>
<a href="param_class.cfm?param_class_id=#d.param_class_id#&#tr.fwx#">
<img src="img/edit.gif"/>
</a>
</cfif>
<a href="param_class.cfm?param_class_id=-1&#tr.fwx#">
<img src="img/add.gif"/>
</a>
<cfif d.param_class_id GT 0>
Единица измерения:
<b><cfif qParamClass.measure_id GT 0>#qParamClass.measure#<cfelse>(нет)</cfif></b>
</cfif>
<i>Вариант компонента либо фиксируется в варианте услуги, либо выбирается при формировании спецификации</i>
</div>
</div>
<div class="tr">
<div class="th">Множественный</div>
<div class="td">
<input type="checkbox" name="is_multiple" id="is_multiple" value="1"<cfif d.is_multiple> checked</cfif> />
<i>Если отметка стоит, то для экземпляра услуги можно выбирать несколько вариантов компонента, например, несколько типов диска</i>
</div>
</div>
<div class="tr">
<div class="th">Сортировка</div>
<div class="td">
<input type="text" name="sort" id="sort" value="#d.sort#" size="2"/>
<i>Целое число - порядок, в котором Компонент будет выводиться в составе данной услуги. Рекомендуется ставить через 100, чтобы потом удобнее было тасовать</i>
</div>
</div>
<div class="tr">
<div class="th">Описание</div>
<div class="td">
<textarea name="descr" rows="10" cols="100">#request.htm2plain(d.descr)#</textarea>
</div>
</div>
<div class="tr">
<div class="th">Создано</div>
<div class="td">
#dateFormat(d.dt_created,'DD.MM.YYYY')# #timeFormat(d.dt_created,'HH:MM')#
#qDecoration.creator# <cfif len(qDecoration.creator_shortname)>(#qDecoration.creator_shortname#)</cfif>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Изменено
#dateFormat(d.dt_updated,'DD.MM.YYYY')# #timeFormat(d.dt_updated,'HH:MM')#
#qDecoration.updater# <cfif len(qDecoration.updater_shortname)>(#qDecoration.updater_shortname#)</cfif>
</div>
</div>
</div>
Это шаблон для компонента экземпляра услуги (строки спецификации). Если в компонентах услуги определен Компонент, а не конкретный вариант компонента, то нужно присвоить цены всем компонентам этого класса, которые актуальны для данной услуги. Это требуется не только для назначения цен, но и для ограничения списка возможных вариантов выбора компонента для данной услуги. *** Может быть, вместо "компонент" нужно ввести термин "тип компонента", потому что это не экземпляр. Например, Компонент - дисковое пространство, а компонент - дисковое пространство SSD, это уточнение класса компонента, но не конкретный объем на конкретном СХД, и даже не конкретная дисковая квота в рамках контракта (спецификации)
<br/>
</cfoutput>
<layout:page section="extension" closeForm="Yes"/>
<cfif d.abstract_service_param_class_id GT 0>
<h4>Реализации (конкретные параметры вариантов услуг), использующих данный компонент</h4>
<cfquery name="qServiceParam" datasource="#request.DS#">
select
ac.abstract_service_param_class_id
,g.area_code
,s.abstract_service_id
,s.service_id
,a.abstract_service
,a.code
,sp.service_param_id
,ac.param_class_id
,pc.param_class
,p.param_id
,p.param
,p.code as param_code
,p.sort
,s.modifier_id /*всегда берем ключ от той таблицы, к которой присоединяем - если нарушена ссылка, останется больше информации*/
,m.modifier
,a.modifier_class_id
,mc.modifier_class
,m.code as modifier_code
,u.measure_short
from abstract_service_param_class ac
left outer join param_class pc on (ac.param_class_id=pc.param_class_id)
left outer join service_param sp on (ac.abstract_service_param_class_id=sp.abstract_service_param_class_id)
left outer join param p on (ac.param_class_id=p.param_class_id AND sp.param_id=p.param_id)/***условие выглядит избыточно жестким, сразу из класса и экземпляра, а зачем*/
left outer join service s on (sp.service_id=s.service_id)
left outer join abstract_service a on (s.abstract_service_id=a.abstract_service_id) /*** тут снова развилка, можно взять из шаблона, а можно из экземпляра... нельзя ли устранить неоднозначность*/
left outer join area g on (a.area_id=g.area_id)
left outer join modifier m on (s.modifier_id=m.modifier_id)
/*** тут еще можно присоединить класс модификатора, и тоже варианты - из шаблона или экземпляра... но экземпляр бывает пустым*/
left outer join modifier_class mc on (mc.modifier_class_id=m.modifier_class_id) /*кажется, в данном случае правильно по шаблону*/
left outer join measure u on (pc.measure_id=u.measure_id)/***единица измерения из класса может быть переопределена - может, здесь вообще без нее обойтись... цены-то нет. А в цене единица должна быть зафиксирована*/
where ac.abstract_service_param_class_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.abstract_service_param_class_id#"/>
order by p.sort, ac.abstract_service_param_class_id
</cfquery>
<!---<cfdump var=#qServiceParam#/>--->
<cfoutput>
</cfoutput>
<table class="worktable">
<thead>
<tr>
<th></th>
<th>ID</th>
<th>Вариант услуги</th>
<th>Код</th>
<th>Компонент</th>
<th>Ед.изм.</th>
<th>Сортировка</th>
</tr>
</thead>
<cfoutput query="qServiceParam">
<tr>
<td>
<c:link_view_edit canWrite=#pageInfo.writePermitted()# entity="service_param" id=#service_param_id# fwx=#tr.fwx#/>
</td>
<td>#service_param_id#</td>
<td><a href="service.cfm?service_id=#service_id#&#tr.fwx#">#abstract_service# #modifier#</a></td>
<td>
<a href="service_param.cfm?service_param_id=#service_param_id#&#tr.fwx#"/>#request.skuCode(area_code, code, modifier_code, param_code)#</a>
</td>
<td>
<cfif param_id GT 0><a href="param_class.cfm?param_class_id=#param_class_id#&#tr.fwx#">#param_class#</a><cfif len(param)>: <a href="param.cfm?param_id=#param_id#&#tr.fwx#">#param#</a></cfif></cfif>
</td>
<td class="c">#measure_short#</td>
<td class="c">#sort#</td>
</tr>
</cfoutput>
</table>
<!---
При формировании спецификации доступны только компоненты (компоненты, параметры), для которых указаны базовые цены. Термин не вполне корректный, точнее было бы - вариант компонента.
--->
</cfif>
<layout:page section="footer"/>