279 lines
14 KiB
Plaintext
279 lines
14 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>
|
||
<!--- <cfdump var=#form#/> --->
|
||
|
||
<m:prepare_detail entity="service_price" key="service_price_id" pageInfoOut="pageInfo"/>
|
||
|
||
<d:bean readonly=#!pageInfo.writePermitted()# table="service_price" datasource="#request.DS#" output="d" status="status">
|
||
<d:param field="service_price_id" type="integer" key autoincrement/>
|
||
<d:param field="service_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_price_id#"
|
||
status=#pageInfo.status#
|
||
trackOut="tr"
|
||
idAttributesOut="id"
|
||
/>
|
||
|
||
|
||
|
||
<cfparam name="service_id" default=#d.service_id#/>
|
||
<cfset service_id=(isValid('integer',service_id)? service_id: -1)/>
|
||
|
||
|
||
<!--- *** тянет на паттерн. Мы берем из ссылки по неосновному внешнему ключу, а потом доопределяем этот ключ из бина.
|
||
Если нужен qDecoration, мы включим в него только те поля, которые не попадают сюда
|
||
А если можно зайти по 2 разным ключам (актуально только при создании записи, когда определена часть ключей - то есть сущность, для которой мы создаем зависимую запись, на самом деле один из внешних ключей, потому что мы заходим только с одной записи... но потом можем зафиксировать и второй ключ на вторую верхнюю сущность)? В этом случае поля могут быть определены по разным ключам, если в графе есть циклы, что бывает - лучше тогда определиться, с кого начинать, потому что это все нужно для красоты (иначе попадаем на селектор - какой ключ определен, от того и поля)
|
||
Но именовать переменную service_id небезопасно, в запросе она будет переопределена, и легко спутать с d.service_id - безопасно только, если декларирована рядом, тогда не ошибешься --->
|
||
<!--- *** селект выглядит случайным --->
|
||
<cfquery name="qService" datasource="#request.DS#">
|
||
select
|
||
s.service_id
|
||
,a.abstract_service_id, a.abstract_service, a.code as abstract_service_code
|
||
,g.area_code
|
||
,m.modifier, m.code as modifier_code
|
||
,u.measure_id, u.measure, u.measure_short
|
||
from service s
|
||
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 measure u on u.measure_id=s.measure_id
|
||
where s.service_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#service_id#" null=#!isNumeric(service_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#/><!--- *** потенциальная ошибка при пустом id --->
|
||
</cfquery>
|
||
|
||
</m:silent><!---
|
||
------------------------------------------------------------------------------------------------------------------------
|
||
------------------------------------------------------------------------------------------------------------------------
|
||
------------------------------------------------------------------------------------------------------------------------
|
||
------------------------------------------------------------------------------------------------------------------------
|
||
------------------------------------------------------------------------------------------------------------------------
|
||
---><layout:page section="header" pageInfo=#pageInfo#>
|
||
<layout:attribute name="title">
|
||
<cfoutput>
|
||
Цена услуги
|
||
<b>#request.skuCode(qService.area_code, qService.abstract_service_code, qService.modifier_code)#</b>
|
||
<b>#qService.abstract_service# #qService.modifier#</b>
|
||
[#d.service_price_id#]
|
||
</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_price_id" value="#d.service_price_id#"/>
|
||
<input type="hidden" name="service_id" value="#d.service_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=#d.service_id#&#tr.fwx#" class="b">#request.skuCode(qService.area_code, qService.abstract_service_code, qService.modifier_code)#</a>
|
||
<a href="abstract_service.cfm?abstract_service_id=#qService.abstract_service_id#&#tr.fwx#">#qService.abstract_service#</a>
|
||
#qService.modifier#
|
||
</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">Единица измерения</div>
|
||
<div class="td">
|
||
#qService.measure# (#qService.measure_short#)
|
||
</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"/>
|
||
<i>Это цена услуги, не включая компоненты. Если компоненты есть, их суммарная стоимость (количество по каждому компоненту, умноженное на цену этого компонента) добавляется к цене услуги. Если для всех компонентов количество 0, то останется только цена услуги. Если в спецификации количество для данной услуги больше 1, то полученная сумма будет умножена на количество по данной услуге. Если стоимость, как для большинства композитных услуг, формируется только из компонентов, цена самой услуги равна нулю или (что правильнее) отсутствует в прайс-листе. </i>
|
||
|
||
<layout:page section="footer"/> |