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

313 lines
15 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>
<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>
&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>
</cfoutput>
<layout:page section="extension" closeForm="Yes"/>
<layout:page section="footer"/>