intermediate draft 4

This commit is contained in:
msyu 2025-06-09 07:08:56 +03:00
parent c1e32d840b
commit e15f690012
10 changed files with 133 additions and 180 deletions

View File

@ -160,7 +160,13 @@
</div>
Соглашение просто объединяет правки строк спецификации в пакет и оформляет их документом (в случае с допником). То есть версии строк существуют не сами по себе, а связаны с конкретным соглашением. Между прочим, это означает, что в рамках одного доп. соглашения мы не можем сделать 2 изменения строки, например 2 разные цены с разных дат - нужно оформлять отдельными допниками.
Можно назвать нулевое соглашение базовым, а остальные дополнительными. (наверное, можно было бы синтезировать базовое соглашение с NULL номером, но NULL проблематично включить в первичный ключ, а любое специальное значение будет нарушать внешний ключ)
Есть ли понятие текущего соглашения?
Дата соглашения не имеет никакого отношения к датам актуальности строк (это чисто формальное поле)
Предполагается, что даты актуальности строк согласованы с номерами версий (можно обнаруживать и репортить ошибки)
Поскольку соглашение не может дважды изменить строку спецификации, можно говорить о версии спецификации в соответствии с соглашением
Есть ли у нас понятие текущего соглашения?
Есть ли понятие действующего соглашения, или у нас все действуют, или строки из недействующего соглашения не должны участвовать в цепочке (тогда, видимо, не удастся активировать соглашение задним числом, цепочка может разрушиться)
Если к соглашению нет измененных строк спецификации, в нем нет большого смысла (но изменения строк надо к чему-то приписывать).
Надо было начать с моделирования данных в таблицах, до интерфейса?
@ -197,7 +203,7 @@
left outer join svc on (i.svc_id=svc.svc_id)
where s.contract_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.contract_id#"/>
AND iv.agreement_version=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.agreement_version#"/>
order by 1
order by i.specification_id
</cfquery>
<cfoutput>

View File

@ -148,7 +148,7 @@
s.specification_id
,s.specification
,(select count(*) from specification_item i where i.specification_id=s.specification_id) as item_cnt
,(select count(*) from specification_version v where v.specification_id=s.specification_id) as version_cnt
/*,(select count(*) from specification_version v where v.specification_id=s.specification_id) as version_cnt*/
from specification s
where s.contract_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.contract_id#"/>
order by 1
@ -172,7 +172,6 @@
<th></th>
<th>Номер спецификации</th>
<th>Строк</th>
<th>Версий</th>
<th></th>
</tr>
</thead>
@ -185,9 +184,6 @@
<td class="c">
<cfif item_cnt GT 0>#item_cnt#</cfif>
</td>
<td class="c">
<cfif version_cnt GT 0>#version_cnt#</cfif>
</td>
<td class="c">
<c:link_del canWrite=#pageInfo.writePermitted()# entity="specification" id=#specification_id# fwx=#tr.fwx#/>
</td>
@ -216,6 +212,7 @@
<button type="button" class="maincontrol" onclick="document.location.href='#addUrl#'">
<a href="#addUrl#">Создать</a>
</button>
Соглашение - это пакет изменений спецификации. Базовое соглашение соответствует исходной спецификации договора (переход от несуществующей спецификации). Остальные - дополнительным соглашениям.
Создание базового соглашения надо автоматизировать, но пока вручную.
</cfoutput>
</cfif>

View File

@ -148,7 +148,6 @@
,d.contract
,d.dt_contract
,(select count(*) from specification s where s.contract_id=d.contract_id) as spec_cnt
,(select count(distinct resource_realm_id) from resource_realm_access a where a.contract_id=d.contract_id) as res_realm_cnt
from contract d
where d.contragent_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.contragent_id#"/>
order by 1
@ -165,7 +164,6 @@
<th>Номер договора</th>
<th>Дата договора</th>
<th>Спецификаций</th>
<th>Ресурсных платформ</th>
<th></th>
</tr>
</thead>
@ -182,9 +180,6 @@
<cfif spec_cnt GT 0>#spec_cnt#</cfif>
</td>
<td class="c">
<cfif res_realm_cnt GT 0>#res_realm_cnt#</cfif>
</td>
<td class="c">
<c:link_del canWrite=#pageInfo.writePermitted()# entity="contract" id=#contract_id# fwx=#tr.fwx#/>
</td>
@ -192,52 +187,6 @@
</cfoutput>
</table>
</cfif>
<i>Доступ к ресурсным платформам предоставляется на уровне договора</i>
<cfif d.contragent_id GT 0>
<cfquery name="qUsr">
select
u.usr_id
,u.login
,u.firstname
,u.lastname
,u.middlename
,u.email
,u.idp_usr_uid
from usr u
where u.contragent_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.contragent_id#"/>
order by 1
</cfquery>
<cfoutput>
<h4>Пользователи (#qContract.recordCount#)</h4>
</cfoutput>
<table class="worktable">
<thead>
<tr>
<th></th>
<th>Логин</th>
<th>Ф.И.О.</th>
<th>e-mail</th>
<th>IDP user UID</th>
<th></th>
</tr>
</thead>
<cfoutput query="qUsr">
<tr>
<td>
<c:link_view_edit canWrite=#pageInfo.writePermitted()# entity="usr" id=#usr_id# fwx=#tr.fwx#/>
</td>
<td>#login#</td>
<td>#lastname# #firstname# #middlename#</td>
<td>#email#</td>
<td>#idp_usr_uid#</td>
<td class="c">
<c:link_del canWrite=#pageInfo.writePermitted()# entity="usr" id=#usr_id# fwx=#tr.fwx#/>
</td>
</tr>
</cfoutput>
</table>
</cfif>
<layout:page section="footer"/>

View File

@ -29,7 +29,6 @@
<d:field title="Провайдер">c.is_provider</d:field>
<d:field title="Контрактов">(select count(*) from contract d where d.contragent_id=c.contragent_id) as contract_cnt</d:field>
<d:field title="Спецификаций">(select count(*) from specification s join contract d on (s.contract_id=d.contract_id) where d.contragent_id=c.contragent_id) as spec_cnt</d:field>
<d:field title="Пользователей">(select count(*) from usr u where u.contragent_id=c.contragent_id) as usr_cnt</d:field>
</d:field_set>
from contragent c
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
@ -86,6 +85,7 @@ select count(*) as cnt from contragent where 1=1
<cfset queryAddColumn(qRead,'f_link_del')/>
<cfset titleMap.f_link_del={ordinal=0}/>
<!--- <cfdump var=#titleMap#/> --->
<cfoutput query=#qRead# startRow=#pageInfo.nStart# maxRows=#pageInfo.recordsPerPage#><!--- *** Здесь некомфортное дублирование startRow, maxRows с вызовом c:table ниже, причем в c:table оно закопано в модуль, и аргументы называются по-разному... но мы хотим немного сэкономить и не обрабатывать весь резалтсет --->
<cfsavecontent variable="qRead.f_link_view_edit">
<a href="#pageInfo.entity#.cfm?#pageInfo.entity#_id=#contragent_id#&#tr.fwx#" name="#contragent_id#" <cfif pageInfo.writePermitted()>title="редактировать" class="edit"<cfelse>title="просмотр" class="view"</cfif>></a>
@ -107,7 +107,6 @@ select count(*) as cnt from contragent where 1=1
<c:column width="15%" field="descr"/>
<c:column width="10%" field="external_uid"/>
<c:column width="5%" field="external_code"/>
<c:column width="2%" field="usr_cnt" formatter=#hideNonPositive#><c:td class="c"/></c:column>
<c:column width="2%" field="contract_cnt" formatter=#hideNonPositive#><c:td class="c"/></c:column>
<c:column width="2%" field="spec_cnt" formatter=#hideNonPositive#><c:td class="c"/></c:column>
<c:column width="1%" sortable="false">

10
layout/detail_line.cfm Normal file
View File

@ -0,0 +1,10 @@
<cfsilent>
<cfparam name="ATTRIBUTES.title" default=""/>
<!---
<cfset var content=thisTag.generagedContent/>
--->
</cfsilent><!---
---><cfif thisTag.executionMode is "start"><div class="tr">
<div class="th"><cfoutput>#ATTRIBUTES.title#</cfoutput></div><div class="td">
<cfelseif thisTag.executionMode is "end"></div></div></cfif>

View File

@ -21,8 +21,6 @@
<d:param field="measure_id" type="integer" key autoincrement/>
<d:param field="measure" type="varchar" size="255" preprocessor=#cleanInput#/>
<d:param field="measure_short" type="varchar" size="9" preprocessor=#cleanInput#/>
<d:param field="measure_short_en" type="varchar" size="9" preprocessor=#cleanInput#/>
<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#" />
@ -93,20 +91,6 @@
</div>
</div>
<div class="tr">
<div class="th">Сокращение английское</div>
<div class="td">
<input type="text" name="measure_short_en" value="#d.measure_short_en#" size="9"/>
</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">

View File

@ -19,7 +19,6 @@
<d:field title="measure_id" cfSqlType="CF_SQL_INTEGER">m.measure_id</d:field>
<d:field title="Единица измерения">m.measure</d:field>
<d:field title="Сокращение">m.measure_short</d:field>
<d:field title="Сокращение англ.">m.measure_short_en</d:field>
</d:field_set>
from measure m
where 1=1 <m:filter_build filter=#pageInfo.settings.filter#/>
@ -77,7 +76,6 @@ select count(*) as cnt from measure where 1=1
</th>
<th width="15%"><layout:column_head name="measure"/></th>
<th width="15%"><layout:column_head name="measure_short"/></th>
<th width="15%"><layout:column_head name="measure_short_en"/></th>
</layout:grid_head>
</thead>
@ -88,7 +86,6 @@ select count(*) as cnt from measure where 1=1
</td>
<td class="c">#measure#</td>
<td class="c">#measure_short#</td>
<td class="c">#measure_short_en#</td>
</tr>
</cfoutput>

View File

@ -144,6 +144,7 @@
<layout:page section="extension" closeForm="Yes"/>
<cfif d.specification_id GT 0>
<cfquery name="qItem" datasource="#request.DS#">
select
i.specification_item_uid
@ -200,6 +201,13 @@
</cfoutput>
</table>
Здесь отсутствуют версионные поля - цена, количество, название для печати.
Если бы они были - это получилась бы версия спецификации.
Как сущности версии спецификации нет.
Можно синтезировать версию спецификации на произвольную дату, а можно по версии определенного соглашения (это должно быть возмозно, потому что соглашение меняет каждую строку не более 1 раза
)
Спецификация по версии соглашения не учитывает is_actual этого соглашения, но учитывает предыдущие
*** Собственно, нам нужно для илюстрации версионности как раз синтезировать спецификацию на дату и спецификацию по версии согдашения
</cfif>

View File

@ -21,7 +21,7 @@
<d:param field="specification_item_uid" type="guid" key autoincrement/>
<d:param field="specification_id" type="integer" required/>
<d:param field="svc_id" type="integer" required/>
<!--- <d:param field="specification_item" type="varchar" size="1023" preprocessor=#cleanInput#/> можно было оставить здесь --->
<!--- <d:param field="specification_item" type="varchar" size="1023" preprocessor=#cleanInput#/> можно было оставить здесь, но мигрировали в версию --->
<d:param field="creator_id" type="integer" value="#request.usr_id#" skipUpdate/>
<d:param field="updater_id" type="integer" value="#request.usr_id#" />
@ -39,8 +39,12 @@
/>
<cfquery name="qSpecification" datasource="#request.DS#">
select s.specification_id, s.specification
select s.specification_id, s.specification, s.contract_id
,d.contract, d.dt_contract, d.contragent_id
,k.contragent
from specification s
join contract d on (s.contract_id=d.contract_id)
join contragent k on (d.contragent_id=k.contragent_id)
where s.specification_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#d.specification_id#" null=#!isNumeric(d.specification_id)#/>
</cfquery>
@ -90,9 +94,11 @@
<div class="detail">
<div class="tr">
<div class="th">Спецификация (номер)</div>
<div class="th">Спецификация</div>
<div class="td">
<a href="specification.cfm?specification_id=#d.specification_id#&#tr.fwx#">#qSpecification.specification#</a>
<a href="specification.cfm?specification_id=#d.specification_id#&#tr.fwx#">#qSpecification.specification#[#d.specification_id#]</a>
<a href="contract.cfm?contract_id=#qSpecification.contract_id#&#tr.fwx#">#qSpecification.contract# #dateFormat(qSpecification.dt_contract,'DD.MM.YYYY')#</a>
<a href="contragent.cfm?contragent_id=#qSpecification.contragent_id#&#tr.fwx#">#qSpecification.contragent# </a>
</div>
</div>
@ -161,10 +167,10 @@
,a.dt_agreement
,a.is_actual
from specification_item_version siv
join specification_item i on (siv.specification_item_uid=i.specification_item_uid)
join specification s on (i.specification_id=s.specification_id)
join contract d on (s.contract_id=d.contract_id)
join agreement a on (siv.agreement_version=a.agreement_version AND s.contract_id=a.contract_id)
left join specification_item i on (siv.specification_item_uid=i.specification_item_uid)
left join specification s on (i.specification_id=s.specification_id)
left join contract d on (s.contract_id=d.contract_id)
left join agreement a on (siv.agreement_version=a.agreement_version AND s.contract_id=a.contract_id)
where siv.specification_item_uid=<cfqueryparam cfsqltype="cf_sql_other" value="#d.specification_item_uid#"/>
order by siv.agreement_version desc
</cfquery>
@ -177,7 +183,7 @@
<cfset addUrl="specification_item_version.cfm?agreement_version=-1&specification_item_uid=#d.specification_item_uid#&#tr.fwx#"/>
<button type="button" class="maincontrol" onclick="document.location.href='#addUrl#'">
<a href="#addUrl#">Создать</a>
</button> вопрос, где мы возьмем agreement_version? Или соглашение создавать автоматически?
</button>
</cfoutput>
</cfif>
</p>
@ -186,12 +192,14 @@
<thead>
<tr>
<th></th>
<th>Версия</th>
<th>Допник</th>
<th>Версия N</th>
<th>Соглашение</th>
<th>Дата соглашения</th>
<th>Действует</th>
<th>Дата с</th>
<th>Дата по</th>
<th>Услуга (для печати)</th>
<th>Количество</th>
<th>Кол-во</th>
<th>Цена</th>
<th></th>
</tr>
@ -199,19 +207,24 @@
<cfoutput query="qSpecificationItemVersion">
<tr>
<td>
<a href="specification_item_param.cfm?specification_item_param_id=#specification_item_param_id#&#tr.fwx#">
<a href="specification_item_version.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#agreement_version#&#tr.fwx#">
<img src="img/edit.gif"/>
</a>
</td>
<td>#agreement_version#</td>
<td class="c"><a href="agreement.cfm?contract_id=#contract_id#&agreement_version=#agreement_version#&#tr.fwx#">#agreement_version#</a></td>
<td>#agreement#</td>
<td class="r"><
#quantity#
</td>
<td class="c">#dateFormat(dt_agreement,'DD.MM.YYYY')#</td>
<td><cfif is_actual GT 0><img src="img/ok.png"/></cfif></td>
<td class="c">#dateFormat(dt_from, 'DD.MM.YYYY')#</td>
<td class="c">#dateFormat(dt_to, 'DD.MM.YYYY')#</td>
<td class="r">#specification_item_version#</td>
<td class="r">#quantity#</td>
<td class="r">#price#</td>
<td class="c">
<cfif specification_item_param_id GT 0>
<c:link_del canWrite=#pageInfo.writePermitted()# entity="specification_item_param" id=#specification_item_param_id# fwx=#tr.fwx#/>
<cfif pageInfo.writePermitted()>
<a href="specification_item_version_del.cfm?specification_item_uid=#specification_item_uid#&agreement_version=#agreement_version#&#tr.fwx#">
<img src="img/del.gif"/>
</a>
</cfif>
</td>
</tr>

View File

@ -16,17 +16,17 @@
</cffunction>
<m:prepare_detail entity="specification_item_version" key="specification_item_uid" pageInfoOut="pageInfo"/>
<!--- так, а у нас ключ составной --->
<!--- так... а у нас ключ составной --->
<d:bean readonly=#!pageInfo.writePermitted()# table="#pageInfo.entity#" datasource="#request.DS#" output="d" status="status">
<d:param field="specification_item_uid" type="guid" key/>
<d:param field="agreement_version" type="integer" key/>
<d:param field="specification_item_version" type="varchar" size="1023" preprocessor=#cleanInput#/>
<d:param field="quantity" type="numeric"/>
<d:param field="price" type="numeric"/>
<d:param field="dt_from" type="timestamp" format="yyyy-MM-dd" forNull="" init="#Now()#"/> <!--- !!! Important yyyy-MM-dd NOT YYYY-MM-DD --->
<d:param field="dt_to" type="timestamp" format="yyyy-MM-dd" forNull="" init="#Now()#"/> <!--- !!! Important yyyy-MM-dd NOT YYYY-MM-DD --->
<d:param field="quantity" type="numeric" init="1"/>
<d:param field="price" type="numeric" init="0"/>
<d:param field="dt_from" type="timestamp" format="yyyy-MM-dd" forNull="" init="#dateFormat(Now(),'YYYY-MM-DD')#"/> <!--- !!! Important yyyy-MM-dd NOT YYYY-MM-DD --->
<d:param field="dt_to" type="timestamp" format="yyyy-MM-dd" forNull="" init=""/> <!--- !!! Important yyyy-MM-dd NOT YYYY-MM-DD --->
<d:param field="creator_id" type="integer" value="#request.usr_id#" skipUpdate/>
<d:param field="updater_id" type="integer" value="#request.usr_id#" />
@ -48,7 +48,10 @@
<!--- контекст строки всегда известен при создании версии, полный ключ не нужен для него - соответственно, джойн с основной таблицей. При этом мы собираем неверсионную часть данных, а версионная образует параллельную ветку --->
<!--- можно обратить внимание на то, что это один джойн, который растет сверху вниз (возможно, ветвится), добавляются таблицы и поля. На самом деле джойны внешние только для удобства отладки - так ошибки виднее --->
<cfquery name="qSpecificationItem" datasource="#request.DS#">
select s.specification_id, s.specification, i.svc_id, d.contract, d.dt_contract, k.contragent, v.svc
select i.svc_id, v.svc
,s.specification_id, s.specification, s.contract_id
,d.contract, d.dt_contract, d.contragent_id
,k.contragent
from specification_item i
left join specification s on (i.specification_id=s.specification_id)
left join contract d on (s.contract_id=d.contract_id)
@ -127,85 +130,74 @@
<cfoutput>
<input type="hidden" name="specification_item_uid" value="#d.specification_item_uid#"/>
<input type="hidden" name="agreement_version" value="#d.agreement_version#"/>
<!--- <input type="hidden" name="agreement_version" value="#d.agreement_version#"/> --->
<input type="hidden" name="track" value="#tr.self#"/>
<input type="hidden" name="pass" value=""/><!--- pass marker to prevent save on submit --->
<div class="detail">
<layout:detail_line title="Спецификация">
<a href="specification.cfm?specification_id=#qSpecificationItem.specification_id#&#tr.fwx#">#qSpecificationItem.specification#[#qSpecificationItem.specification_id#]</a>
<a href="contract.cfm?contract_id=#qSpecificationItem.contract_id#&#tr.fwx#">#qSpecificationItem.contract# #dateFormat(qSpecificationItem.dt_contract,'DD.MM.YYYY')#</a>
<a href="contragent.cfm?contragent_id=#qSpecificationItem.contragent_id#&#tr.fwx#">#qSpecificationItem.contragent# </a>
</layout:detail_line>
<div class="tr">
<div class="th">Спецификация (номер)</div>
<div class="td">
<a href="specification.cfm?specification_id=#qSpecificationItem.specification_id#&#tr.fwx#">#qSpecificationItem.specification#</a>
</div>
</div>
<layout:detail_line title="Услуга">
<a href="svc.cfm?svc_id=#qSpecificationItem.svc_id#&#tr.fwx#">[#d.specification_item_uid#] #qSpecificationItem.svc#</a>
</layout:detail_line>
<div class="tr">
<div class="th">Услуга</div>
<div class="td">
<a href="svc.cfm?svc_id=#qSpecificationItem.svc_id#&#tr.fwx#">[#d.specification_item_uid#] #qSpecificationItem.svc#</a>
</div>
</div>
<!--- <layout:detail_line title="Версия">#d.agreement_version# (версия-номер соглашения)</layout:detail_line> --->
<layout:detail_line title="Версия">
<cfquery name="qList" datasource="#request.DS#">
select a.agreement_version, a.agreement, a.dt_agreement
from agreement a
where a.contract_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#qSpecificationItem.contract_id#" null=#!isValid('integer',qSpecificationItem.contract_id)#/>
order by 1
</cfquery>
<c:combo
query=#qList#
combo="agreement_version"
id="agreement_version"
key="agreement_version"
selected="#d.agreement_version#"
displayf="##agreement## [##agreement_version##] ##dateFormat(dt_agreement,'DD.MM.YYYY')##"
class=""
/>
(версия-номер соглашения)
</layout:detail_line>
<div class="tr">
<div class="th">Версия</div>
<div class="td">
<!--- <a href="svc.cfm?svc_id=#qSpecificationItem.svc_id#&#tr.fwx#">[#d.specification_item_uid#] #qSpecificationItem.svc#</a> --->
#d.agreement_version#
</div>
</div>
<layout:detail_line title="Имя для печати">
<textarea name="specification_item_version" id="specification_item_version" rows="2" cols="90" style="width:99%;"/><cfif len(d.specification_item_version)>#d.specification_item_version#<cfelse>#qSpecificationItem.svc#</cfif></textarea>
<!--- <button type="button" onclick="document.getElementById('specification_item_version').value='';submit();">Сформировать</button> --->
</layout:detail_line>
<div class="tr">
<div class="th">Имя для печати</div>
<div class="td">
<!--- <cfset m_specification_item_version=#d.specification_item_version#/>
<cfif len(m_specification_item_version) EQ 0 AND d.service_id GT 0>
<cfif len(qService.modifier)>
<cfset m_specification_item_version="#qService.abstract_service# - #qService.modifier#."/>
<cfelse>
<cfset m_specification_item_version="#qService.abstract_service#."/>
</cfif>
<layout:detail_line title="Дата с">
<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>
</layout:detail_line>
<cfloop query="qSpecificationItemParam">
<cfif qSpecificationItemParam.quantity GT 0>
<cfset m_param_name="#qSpecificationItemParam.param_short#"/>
<cfset m_specification_item_version="#m_specification_item_version# #m_param_name# #qSpecificationItemParam.quantity# #qSpecificationItemParam.measure_short#;"/>
</cfif>
</cfloop>
</cfif> --->
<textarea name="specification_item_version" id="specification_item_version" rows="2" cols="90" style="width:99%;"/><cfif len(d.specification_item_version)>#d.specification_item_version#<cfelse>#qSpecificationItem.svc#</cfif></textarea>
<button type="button" onclick="document.getElementById('specification_item_version').value='';submit();">Сформировать</button>
</div>
</div>
<layout:detail_line title="Дата по">
<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>
</layout:detail_line>
<div class="tr">
<div class="th">Количество</div>
<div class="td">
<layout:detail_line title="Количество">
<input type="text" name="quantity" value="#d.quantity#" size="5" class="r"/><!---*** Халява с точностью ---><!--- <cftry>#round(d.quantity,qService.precision)#<cfcatch type="ANY"></cfcatch></cftry> --->
</div>
</div>
</layout:detail_line>
<div class="tr">
<div class="th">Цена</div>
<div class="td">
<input type="text" name="price" id="price" value="#d.price#" size="10" class="r"/>
<!--- <i>подставить сумму по позициям: </i>
<b><a onclick="document.getElementById('price').value='#qCost.cost#';return false;" style="cursor:pointer;">#qCost.cost#</a></b> --->
</div>
</div>
<layout:detail_line title="Цена">
<input type="text" name="price" id="price" value="#d.price#" size="10" class="r"/>
</layout:detail_line>
<layout:detail_line title="Создано">
#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>
</layout:detail_line>
<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>
@ -213,7 +205,7 @@
<layout:page section="extension" closeForm="Yes"/>
<cfif len(d.specification_item_uid) AND d.agreement_version GT 0>
<cfoutput>
<!--- <cfoutput>
<p>
Компоненты (#qSpecificationItemParam.recordCount#)
<!---<cfif pageInfo.writePermitted()>
@ -226,7 +218,7 @@
</cfif>--->
</p>
</cfoutput>
<table class="worktable">
<table class="worktable">
<thead>
<tr>
<th></th>
@ -271,12 +263,10 @@
</td>
</tr>
</cfoutput>
</table>
</table> --->
</cfif>
*** Можно переделать на прямой ввод в форму. Можно однородные позиции выбирать из списка, но тогда вариант выбрать 2 разных интерфейсно непонятно как реализовывать.
поскольку спека только для демонстрации, может этого и не делать?
Цену базовую показать
Здесь могли бы быть компоненты (но мы их пока не запилили)
<layout:page section="footer"/>