313 lines
15 KiB
Plaintext
313 lines
15 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>
|
||
|
||
<cffunction name="wrapGUID">
|
||
<cfargument name="s" type="string"/>
|
||
<cfreturn "cast(#request.cleanHtm(s)# as UUID)"/>
|
||
</cffunction>
|
||
|
||
|
||
<!--- <cfoutput>*** #isValid('UUID','7b4f10f5-e36a-40ed-9f464c30f43da3b4')#</cfoutput><cfabort/> --->
|
||
|
||
<m:prepare_detail entity="service_param_price" key="service_param_price_id" pageInfoOut="pageInfo"/>
|
||
|
||
<d:bean readonly=#!pageInfo.writePermitted()# table="service_param_price" datasource="#request.DS#" output="d" status="status">
|
||
<d:param field="service_param_price_id" type="integer" key autoincrement/>
|
||
<d:param field="service_param_id" type="integer" required/>
|
||
<d:param field="pricing_model_id" type="integer" required init="2"/>
|
||
<d:param field="pricing_period" type="varchar" size="31" preprocessor=#cleanInput# forNull="" init="m"/>
|
||
<d:param field="rating_period" type="varchar" size="31" preprocessor=#cleanInput# forNull="" init="m"/>
|
||
<!--- <d:param field="discount_policy_id" type="integer" forNull=""/> --->
|
||
<d:param field="dt_from" type="timestamp" format="yyyy-MM-dd" preprocessor=#cleanInput# forNull=""/><!--- !!! Important yyyy-MM-dd NOT YYYY-MM-DD --->
|
||
<d:param field="dt_to" type="timestamp" format="yyyy-MM-dd" preprocessor=#cleanInput# forNull=""/><!--- !!! Important yyyy-MM-dd NOT YYYY-MM-DD --->
|
||
<d:param field="status" type="varchar" size="255" preprocessor=#cleanInput# init="draft"/>
|
||
<d:param field="price" type="numeric" forNull=""/>
|
||
<d:param field="min_price" type="numeric" forNull=""/>
|
||
<d:param field="cost" type="numeric" 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.service_param_price_id#"
|
||
status=#pageInfo.status#
|
||
trackOut="tr"
|
||
idAttributesOut="id"
|
||
/>
|
||
|
||
<cfparam name="service_param_id" default="#d.service_param_id#"/>
|
||
<cfset service_param_id=(isValid('integer',service_param_id)? service_param_id: -1)/>
|
||
<!--- *** тянет на паттерн. Мы берем из ссылки по неосновному внешнему ключу, а потом доопределяем этот ключ из бина.
|
||
Если нужен qDecoration, мы включим в него только те поля, которые не попадают сюда
|
||
А если можно зайти по 2 разным ключам (актуально только при создании записи, когда определена часть ключей - то есть сущность, для которой мы создаем зависимую запись, на самом деле один из внешних ключей, потому что мы заходим только с одной записи... но потом можем зафиксировать и второй ключ на вторую верхнюю сущность)? В этом случае поля могут быть определены по разным ключам, если в графе есть циклы, что бывает - лучше тогда определиться, с кого начинать, потому что это все нужно для красоты (иначе попадаем на селектор - какой ключ определен, от того и поля)
|
||
Но именовать переменную service_param_id небезопасно, в запросе она будет переопределена, и легко спутать с d.service_param_id - безопасно только, если декларирована рядом, тогда не ошибешься --->
|
||
<cfquery name="qServiceParam" datasource="#request.DS#">
|
||
select
|
||
sp.service_param_id, sp.service_id, sp.param_id, ac.abstract_service_param_class_id
|
||
,p.param_id, p.param_class_id, p.param, p.param_short, p.code as param_code
|
||
,pc.param_class
|
||
,m.measure_id, m.measure , m.measure_short
|
||
,s.service_id
|
||
,a.abstract_service_id, a.abstract_service, a.code as abstract_service_code
|
||
,g.area_code
|
||
,sm.modifier_id, sm.modifier, sm.code as modifier_code
|
||
from service_param sp
|
||
left outer join abstract_service_param_class ac on sp.abstract_service_param_class_id=ac.abstract_service_param_class_id
|
||
left outer join param p on sp.param_id=p.param_id
|
||
--left outer join param_class pc on ac.param_class_id=pc.param_class_id
|
||
left outer join param_class pc on p.param_class_id=pc.param_class_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 /*** can be obtained also from abstract_service_param_class*/
|
||
left outer join area g on a.area_id=g.area_id
|
||
left outer join modifier sm on s.modifier_id=sm.modifier_id
|
||
left outer join measure m on pc.measure_id=m.measure_id /*** we can override measure from param_class in param*/
|
||
where sp.service_param_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#service_param_id#" null=#!isNumeric(service_param_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>
|
||
Цена компонента
|
||
<b>#qServiceParam.abstract_service#</b>
|
||
[#qServiceParam.abstract_service_id#]
|
||
<b><cfif len(qServiceParam.modifier) GT 0>#qServiceParam.modifier#<cfelse>(основной вариант)</cfif></b>
|
||
[#qServiceParam.service_id#]
|
||
:
|
||
<b>#qServiceParam.param_class#</b>
|
||
[#qServiceParam.param_class_id#]
|
||
<b><cfif len(qServiceParam.param) GT 0>#qServiceParam.param#<cfelse>(основной вариант)</cfif></b>
|
||
[#qServiceParam.param_id#]
|
||
<b>#request.skuCode(qServiceParam.area_code,qServiceParam.abstract_service_code,
|
||
qServiceParam.modifier_code,qServiceParam.param_code)#</b>
|
||
<cfif len(d.service_param_price_id) GT 0>
|
||
[#d.service_param_price_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="service_param_price_id" value="#d.service_param_price_id#"/>
|
||
<input type="hidden" name="service_param_id" value="#d.service_param_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="service.cfm?service_id=#qServiceParam.service_id#&#tr.fwx#" title="Вариант услуги"/>
|
||
<b>#request.skuCode(qServiceParam.area_code,qServiceParam.abstract_service_code,qServiceParam.modifier_code)#</b>
|
||
</a>
|
||
<a href="abstract_service.cfm?abstract_service_id=#qServiceParam.abstract_service_id#&#tr.fwx#" title="Абстрактная услуга"/>#qServiceParam.abstract_service#</a><cfif #qServiceParam.modifier_id# GT 0>:</cfif>
|
||
<a href="modifier.cfm?modifier_id=#qServiceParam.modifier_id#&#tr.fwx#" title="Характеристика"/>
|
||
#qServiceParam.modifier#
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Компонент</div>
|
||
<div class="td">
|
||
<a href="service_param.cfm?service_param_id=#qServiceParam.service_param_id#&#tr.fwx#" class="b" title="Компонент варианта услуги">
|
||
#request.skuCode(qServiceParam.area_code,qServiceParam.abstract_service_code,qServiceParam.modifier_code,qServiceParam.param_code)#
|
||
</a>
|
||
<a href="param_class.cfm?param_class_id=#qServiceParam.param_class_id#&#tr.fwx#" title="Компонент"/>#qServiceParam.param_class#</a><!--- <cfif #qServiceParam.param_id# GT 0>:</cfif> ---><cfif len(qServiceParam.param) GT 0>:</cfif>
|
||
<a href="param.cfm?param_id=#qServiceParam.param_id#&#tr.fwx#" title="Вариант компонента"/>
|
||
#qServiceParam.param#
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Единица измерения</div>
|
||
<div class="td">
|
||
#qServiceParam.measure# (#qServiceParam.measure_short#)
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Модель ценообразования</div>
|
||
<div class="td">
|
||
<c:combo
|
||
queryString="select pricing_model_id, pricing_model_short from pricing_model order by 1"
|
||
combo="pricing_model_id"
|
||
id="pricing_model_id"
|
||
key="pricing_model_id"
|
||
selected="#d.pricing_model_id#"
|
||
displayf="##pricing_model_short##"
|
||
empty=""
|
||
class=""
|
||
/>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Период цены</div>
|
||
<div class="td">
|
||
<select name="pricing_period">
|
||
<option value=""></option>
|
||
<option value="s"<cfif d.pricing_period EQ "s"> selected</cfif>>секунда</option>
|
||
<option value="n"<cfif d.pricing_period EQ "n"> selected</cfif>>минута</option>
|
||
<option value="h"<cfif d.pricing_period EQ "h"> selected</cfif>>час</option>
|
||
<option value="d"<cfif d.pricing_period EQ "d"> selected</cfif>>сутки</option>
|
||
<option value="m"<cfif d.pricing_period EQ "m"> selected</cfif>>месяц</option>
|
||
</select>
|
||
<i>за какое время указана цена</i>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Период опроса</div>
|
||
<div class="td">
|
||
<select name="rating_period">
|
||
<option value=""></option>
|
||
<option value="s"<cfif d.rating_period EQ "s"> selected</cfif>>секунда</option>
|
||
<option value="15s"<cfif d.rating_period EQ "15s"> selected</cfif>>15 секунд</option>
|
||
<option value="n"<cfif d.rating_period EQ "n"> selected</cfif>>минута</option>
|
||
<option value="15n"<cfif d.rating_period EQ "15n"> selected</cfif>>15 минут</option>
|
||
<option value="h"<cfif d.rating_period EQ "h"> selected</cfif>>час</option>
|
||
<option value="d"<cfif d.rating_period EQ "d"> selected</cfif>>сутки</option>
|
||
<option value="m"<cfif d.rating_period EQ "m"> selected</cfif>>месяц</option>
|
||
</select>
|
||
<i>с какой периодичностью собирается тарифицируемая метрика</i>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Цена GPL</div>
|
||
<div class="td">
|
||
<input type="text" name="price" value="#d.price#" size="12" class="r"/>
|
||
<i>публичная цена без скидки, без НДС</i>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Минимальная цена</div>
|
||
<div class="td">
|
||
<input type="text" name="min_price" value="#d.min_price#" size="12" class="r"/>
|
||
<i>ценовое дно, предел скидки - как правило, равна себестоимости, но может быть и ниже. Без НДС</i>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Себестоимость</div>
|
||
<div class="td">
|
||
<input type="text" name="cost" value="#d.cost#" size="12" class="r"/>
|
||
<i>ведется для справки и для контроля. Без НДС</i>
|
||
</div>
|
||
</div>
|
||
|
||
<!--- <div class="tr">
|
||
<div class="th">Политика дисконтирования</div>
|
||
<div class="td">
|
||
<select name="discount_policy_id">
|
||
<option value=""></option>
|
||
<option value="1"<cfif d.discount_policy_id EQ "1"> selected</cfif>>tiered</option>
|
||
<option value="2"<cfif d.discount_policy_id EQ "2"> selected</cfif>>some other policy</option>
|
||
</select>
|
||
*** может быть, нужны параметры дисконтирования (с какого объема и т.д.)
|
||
</div>
|
||
</div> --->
|
||
|
||
<div class="tr">
|
||
<div class="th">Статус</div>
|
||
<div class="td">
|
||
<select name="status">
|
||
<option value=""></option>
|
||
<option value="draft"<cfif d.status EQ "draft"> selected</cfif>>черновик</option>
|
||
<option value="active"<cfif d.status EQ "active"> selected</cfif>>активен</option>
|
||
<option value="archive"<cfif d.status EQ "archive"> selected</cfif>>архивирован</option>
|
||
</select>
|
||
*** правила переходов
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Действует с</div>
|
||
<div class="td">
|
||
<input type="date" name="dt_from" id="dt_from" value="#dateFormat(d.dt_from,"YYYY-MM-DD")#"/>
|
||
<button type="button" onclick="document.getElementById('dt_from').value='#DateFormat(Now(), 'YYYY-MM-DD')#';">Сегодня</button>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="tr">
|
||
<div class="th">Действует по</div>
|
||
<div class="td">
|
||
<input type="date" name="dt_to" id="dt_to" value="#dateFormat(d.dt_to,"YYYY-MM-DD")#"/>
|
||
<button type="button" onclick="document.getElementById('dt_to').value='#DateFormat(Now(), 'YYYY-MM-DD')#';">Сегодня</button>
|
||
</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>
|
||
|
||
</cfoutput>
|
||
|
||
<layout:page section="extension" closeForm="Yes"/>
|
||
|
||
|
||
<layout:page section="footer"/> |