278 lines
13 KiB
Plaintext
278 lines
13 KiB
Plaintext
<cfsilent>
|
||
<cfimport prefix="m" taglib="lib"/>
|
||
<cfimport prefix="c" taglib="lib/controls"/>
|
||
<cfimport prefix="d" taglib="lib/data"/>
|
||
<cfimport prefix="layout" taglib="layout"/>
|
||
</cfsilent><m: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>
|
||
|
||
Изменено
|
||
#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"/>
|