initial draft

This commit is contained in:
msyu
2025-06-02 16:16:51 +03:00
commit 529334d03b
272 changed files with 22684 additions and 0 deletions
+106
View File
@@ -0,0 +1,106 @@
<cfimport prefix="c" taglib="../lib/controls"/>
<cfimport prefix="d" taglib="../lib/data"/>
<!---<cfif StructKeyExists(form, "add_param_class")>
<cfdump var=#form#/>
</cfif>--->
<cfparam name="ATTRIBUTES.abstract_service_id"/>
<cfparam name="ATTRIBUTES.fwx"/>
<cfparam name="ATTRIBUTES.self"/>
<cfparam name="ATTRIBUTES.editable" type="boolean" default="No"/>
<d:bean readonly=#!ATTRIBUTES.editable# savemarker="add_param_class" table="abstract_service_param_class" datasource="#request.DS#" output="de" status="estatus" info="einfo" meta="emeta">
<d:param field="abstract_service_id" type="integer" key/>
<d:param field="param_class_id" type="integer" key/>
<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>
<cfif structKeyExists(FORM, "detach_param_class") AND #ATTRIBUTES.editable#>
<cfparam name="FORM.param_class_id" type="integer"/>
<cfquery name="qDetachparam_class" datasource="#request.DS#">
delete from abstract_service_param_class
where abstract_service_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.abstract_service_id#/>
AND param_class_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#FORM.param_class_id#/>
</cfquery>
</cfif>
<cfquery name="qRead" datasource="#request.DS#">
select
x.abstract_service_id
,x.param_class_id
,p.param_class
from abstract_service_param_class x
join param_class p on (x.param_class_id=p.param_class_id)
where x.abstract_service_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#ATTRIBUTES.abstract_service_id#"/>
order by 2
</cfquery>
<cfoutput>
<b>Классы компонентов (#qRead.recordCount#):</b>
</cfoutput>
<table class="worktable">
<cfoutput>
<thead>
<tr class="worktable_head">
<th>Компонент</th>
<th></th>
</tr>
</thead>
</cfoutput>
<cfoutput query="qRead">
<tr>
<td>#param_class#</td>
<td class="c">
<cfif #ATTRIBUTES.editable#>
<form action="#request.thisPage#" method="post">
<input type="hidden" name="abstract_service_id" value="#ATTRIBUTES.abstract_service_id#"/>
<input type="hidden" name="param_class_id" value="#param_class_id#"/>
<input type="hidden" name="track" value="#ATTRIBUTES.self#"/>
<button type="submit" name="detach_param_class" class="submitminus" title="убрать провайдера услуги"></button>
</form>
</cfif>
</td>
</tr>
</cfoutput>
<cfif ATTRIBUTES.editable>
<cfoutput>
<tr>
<td colspan="3" style="vertical-align:middle;">
<form action="#request.thisPage#" method="post">
<input type="hidden" name="track" value="#ATTRIBUTES.self#"/>
<input type="hidden" name="abstract_service_id" value="#ATTRIBUTES.abstract_service_id#"/>
<button type="submit" name="add_param_class" class="submitnew" value="" title="добавить прямо тут" style="vertical-align:middle"></button>
<cfquery name="qparam_class" datasource="#request.DS#">
select c.param_class_id, c.param_class
from param_class c
order by c.param_class
</cfquery>
<c:combo
query=#qparam_class#
combo="param_class_id"
key="param_class_id"
id="param_class_id"
displayf="##param_class##"
empty=""
style="vertical-align:middle"
<!--- flag_disabled="cnt"--->
/>
</form>
<i></i>
</td>
</tr>
</cfoutput>
</cfif>
</table>
<cfexit method="exittag"/>
+106
View File
@@ -0,0 +1,106 @@
<cfimport prefix="c" taglib="../lib/controls"/>
<cfimport prefix="d" taglib="../lib/data"/>
<!---<cfif StructKeyExists(form, "add_provider")>
<cfdump var=#form#/>
</cfif>--->
<cfparam name="ATTRIBUTES.abstract_service_id"/>
<cfparam name="ATTRIBUTES.fwx"/>
<cfparam name="ATTRIBUTES.self"/>
<cfparam name="ATTRIBUTES.editable" type="boolean" default="No"/>
<d:bean readonly=#!ATTRIBUTES.editable# savemarker="add_provider" table="abstract_service_provider" datasource="#request.DS#" output="de" status="estatus" info="einfo" meta="emeta">
<d:param field="abstract_service_id" type="integer" key/>
<d:param field="provider_id" type="integer" key/>
<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>
<cfif structKeyExists(FORM, "detach_provider") AND #ATTRIBUTES.editable#>
<cfparam name="FORM.provider_id" type="integer"/>
<cfquery name="qDetachprovider" datasource="#request.DS#">
delete from abstract_service_provider
where abstract_service_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.abstract_service_id#/>
AND provider_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#FORM.provider_id#/>
</cfquery>
</cfif>
<cfquery name="qRead" datasource="#request.DS#">
select
x.abstract_service_id
,x.provider_id
,p.provider
from abstract_service_provider x
join provider p on (x.provider_id=p.provider_id)
where x.abstract_service_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#ATTRIBUTES.abstract_service_id#"/>
order by 2
</cfquery>
<cfoutput>
<b>Провайдеры услуги (#qRead.recordCount#):</b>
</cfoutput>
<table class="worktable">
<cfoutput>
<thead>
<tr class="worktable_head">
<th>Провайдер</th>
<th></th>
</tr>
</thead>
</cfoutput>
<cfoutput query="qRead">
<tr>
<td>#provider#</td>
<td class="c">
<cfif #ATTRIBUTES.editable#>
<form action="#request.thisPage#" method="post">
<input type="hidden" name="abstract_service_id" value="#ATTRIBUTES.abstract_service_id#"/>
<input type="hidden" name="provider_id" value="#provider_id#"/>
<input type="hidden" name="track" value="#ATTRIBUTES.self#"/>
<button type="submit" name="detach_provider" class="submitminus" title="убрать провайдера услуги"></button>
</form>
</cfif>
</td>
</tr>
</cfoutput>
<cfif ATTRIBUTES.editable>
<cfoutput>
<tr>
<td colspan="3" style="vertical-align:middle;">
<form action="#request.thisPage#" method="post">
<input type="hidden" name="track" value="#ATTRIBUTES.self#"/>
<input type="hidden" name="abstract_service_id" value="#ATTRIBUTES.abstract_service_id#"/>
<button type="submit" name="add_provider" class="submitnew" value="" title="добавить прямо тут" style="vertical-align:middle"></button>
<cfquery name="qProvider" datasource="#request.DS#">
select c.provider_id, c.provider
from provider c
order by c.provider
</cfquery>
<c:combo
query=#qProvider#
combo="provider_id"
key="provider_id"
id="provider_id"
displayf="##provider##"
empty=""
style="vertical-align:middle"
<!--- flag_disabled="cnt"--->
/>
</form>
<i></i>
</td>
</tr>
</cfoutput>
</cfif>
</table>
<cfexit method="exittag"/>
+67
View File
@@ -0,0 +1,67 @@
<!--- смешная реализация полиморфизма--->
<cfparam name="ATTRIBUTES.entity"/>
<cfset spec=structNew()/>
<!---*** Удивительно: основная таблица должна иметь алиас d --->
<cfswitch expression=#ATTRIBUTES.entity#>
<cfcase value="abstract_service">
<cfset spec.selectHead="select abstract_service, code from abstract_service d "/>
<cfset spec.format="Абстрактная услуга ##code## ##abstract_service## "/>
</cfcase>
<!---
<cfcase value="equipment_model">
<cfset spec.selectHead="select type_short, vendor_short, equipment_model, model_number from v_model d"/>
<cfset spec.format="модель ##type_short## ##vendor_short## ##equipment_model## ##model_number##"/>
</cfcase>
<cfcase value="service_contract">
<cfset spec.selectHead="select d.service_contract, d.subject, d.dt_contract, v.shortname as vendor_short from service_contract d left outer join vendor v on d.vendor_id=v.vendor_id "/>
<cfset spec.format="сервисный договор ##vendor_short## ##service_contract## от ##dateFormat(dt_contract,'DD.MM.YYYY')## ##subject##"/>
</cfcase>
<cfcase value="supply_contract">
<cfset spec.selectHead="select supply_contract, d.subject, d.dt_contract, v.shortname as vendor_short from supply_contract d left outer join vendor v on d.vendor_id=v.vendor_id "/>
<cfset spec.format="договор поставки ##vendor_short## ##supply_contract## от ##dateFormat(dt_contract,'DD.MM.YYYY')## ##subject##"/>
</cfcase>
<cfcase value="maint">
<cfset spec.selectHead="select maint_id, maint, dt_maint, type_short, vendor_short, equipment_model, equipment, place from v_maint d "/>
<cfset spec.format="заявка/протокол ТО N##maint_id## ##maint## от ##dateFormat(dt_maint,'DD.MM.YYYY')## ##type_short## ##vendor_short## ##equipment_model## ##equipment## ##place##"/>
</cfcase>
<cfcase value="maint_op">
<cfset spec.selectHead="select maint_op_id, op_spec, dt_maint_op, type_short, vendor_short, equipment_model, equipment, place from v_maint_op d "/>
<cfset spec.format="сервисная операция ##op_spec## от ##dateFormat(dt_maint_op,'DD.MM.YYYY')## ##type_short## ##vendor_short## ##equipment_model## ##equipment## ##place##"/>
</cfcase>
<cfcase value="contact">
<cfset spec.selectHead="select d.contact_id, d.contact, v.vendor from contact d left outer join vendor v on d.vendor_id=v.vendor_id "/>
<cfset spec.format="Сотрудник ##contact## подрядчика ##vendor##"/>
</cfcase>
<cfcase value="delivery">
<cfset spec.selectHead="select d.delivery_id, d.delivery, d.dt_delivery, v.vendor, s.site from delivery d left outer join v_site s on (d.site_id=s.site_id) left outer join vendor v on (d.vendor_id=v.vendor_id) "/>
<cfset spec.format="Поставка/списание ЗИП ##delivery## - ##site## от ##dateFormat(dt_delivery,'DD.MM.YYYY')## ##vendor##"/>
</cfcase>
<cfcase value="work_order">
<cfset spec.selectHead="select d.work_order_id, d.work_order, d.dt_work_order, v.vendor, b.building, s.site from work_order d
left outer join v_building b on (d.building_id=b.building_id)
left outer join v_site s on (b.site_id=s.site_id)
left outer join vendor v on (d.contractor_id=v.vendor_id) "/>
<cfset spec.format="Наряд ##vendor## &numero; ##work_order_id## от ##dateFormat(dt_work_order,'DD.MM.YYYY')## - ##site## ##building##"/>
</cfcase>
<cfcase value="maint_program">
<cfset spec.selectHead="select d.maint_program_id, d.maint_program, t.shortname as type_short from maint_program d left outer join equipment_type t on (d.equipment_type_id=t.equipment_type_id)"/>
<cfset spec.format="Программа ТО ##maint_program## ##type_short## "/>
</cfcase>--->
<cfdefaultcase>
<cfthrow message="Specified entity is not supported" detail="Entity specified does not exist or does not support attachments"/>
</cfdefaultcase>
</cfswitch>
<cfif StructKeyExists(ATTRIBUTES, "output")>
<cfset SetVariable("CALLER.#ATTRIBUTES.output#", spec)/>
</cfif>
+100
View File
@@ -0,0 +1,100 @@
<cfparam name="ATTRIBUTES.do" type="string">
<cfswitch expression="#ATTRIBUTES.do#">
<cfcase value="login"><!--- остальные не реализованы --->
<cfparam name="ATTRIBUTES.username" type="string">
<cfparam name="ATTRIBUTES.password" type="string">
<cfparam name="ATTRIBUTES.granted">
<cfquery name="qUserAuth" datasource="#request.DS#">
select usr_id, locked,
<!--- pwdcompare(<cfqueryparam cfsqltype="cf_sql_varchar" value="#ATTRIBUTES.password#">, password, 0)--->
password as pwdhash
from usr
where login=<cfqueryparam cfsqltype="cf_sql_varchar" value="#ATTRIBUTES.username#">
</cfquery>
<cfset err=""/>
<cfif (qUserAuth.RecordCount NEQ 1)>
<cfset err="Пользователь не зарегистрирован в системе.<br/>Проверьте правильность указания имени пользователя и пароля."/>
<cfelseif qUserAuth.locked NEQ 0>
<cfset err="Учетная запись заблокирована."/>
<cfelseif request.passwordHashCheck(ATTRIBUTES.password, qUserAuth.pwdhash)<!--- or TRUE --->>
<cflock scope="session" type="exclusive" timeout="3">
<cfset session.authentication_source="LOCALDB"/>
</cflock>
<cfelse>
<cfset err="Неверное имя пользователя или пароль.">
<!--- <cfelse>
<cfset err="Неизвестная программная ошибка в модуле аутентификации."> --->
</cfif>
<cfif (len(err) EQ 0)>
<!---<cfquery name="qUserLast" datasource="#request.DS#">
update usr
set dt_lastlogin=getdate()
where usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#qUserAuth.usr_id#">
</cfquery>--->
<cflock scope="session" type="exclusive" timeout="3">
<cfset session.usr_id = qUserAuth.usr_id>
<cfset request.usr_id = qUserAuth.usr_id>
</cflock>
<cfparam name="request.usr_id" default=""/>
<cfset authentication_source=""/>
<cflock scope="session" type="readonly" timeout="3">
<cfparam name="session.authentication_source" default=""/>
<cfset authentication_source=session.authentication_source/>
</cflock>
<cflog file="authentication" type="information" text="User login=#ATTRIBUTES.username# ID=#request.usr_id# successfully logged in through #authentication_source#"/>
<cfelse>
<cflog file="authentication" type="information" text="login=#ATTRIBUTES.username# #err#"/>
</cfif>
<cfif structKeyExists(ATTRIBUTES, "alert")>
<cfset setVariable("CALLER.#ATTRIBUTES.alert#", err)/>
</cfif>
<cfset setVariable("CALLER.#ATTRIBUTES.granted#", (len(err) EQ 0))/>
<!---сломать что-то при попытке логирования - очень частая ошибка, поэтому столько проверок--->
</cfcase>
</cfswitch>
<cfexit method="EXITTAG"/>
<cffunction name="ntauth" returntype="boolean">
<cfargument name="login" type="string"/>
<cfargument name="domain" type="string"/>
<cfargument name="passwd" type="string"/>
<cfset advapi32 = createObject("java","com.sun.jna.platform.win32.Advapi32")/>
<cfset winbase = createObject("java","com.sun.jna.platform.win32.WinBase")/>
<cfset phToken = createObject("java","com.sun.jna.platform.win32.WinNT$HANDLEByReference")/>
<cfset kernel32 = createObject("java","com.sun.jna.platform.win32.Kernel32")/>
<cfset res = advapi32.INSTANCE.LogonUser(ARGUMENTS.login, ARGUMENTS.domain, ARGUMENTS.passwd, winbase.LOGON32_LOGON_NETWORK, winbase.LOGON32_PROVIDER_DEFAULT, phToken)/>
<cfif res>
<cfreturn true/>
<cfelse>
<cfset errorCode = kernel32.INSTANCE.GetLastError()/>
<cfset ERROR_NO_TRUST_SAM_ACCOUNT = 1787/>
<cfif errorCode EQ ERROR_NO_TRUST_SAM_ACCOUNT>
<cfreturn true/>
</cfif>
</cfif>
<cfreturn false/>
</cffunction>
+94
View File
@@ -0,0 +1,94 @@
<cfimport prefix="m" taglib="../lib"/>
<cfparam name="ATTRIBUTES.section"/>
<cfparam name="ATTRIBUTES.entity"/>
<cfparam name="ATTRIBUTES.id"/>
<cfparam name="ATTRIBUTES.tr"/>
<cfparam name="ATTRIBUTES.writePermitted" type="boolean" default="false"/>
<cfswitch expression="#ATTRIBUTES.section#">
<cfcase value="model">
<cfif isDefined("savedoc") AND #ATTRIBUTES.writePermitted#>
<cftry>
<cfparam name="doc_title" type="string"/>
<m:upload field="doc" output="attach"/>
<cfif !structKeyExists(attach,"binaryData")>
<cfexit method="exittag"/>
</cfif>
<cfif len(attach.binaryData) GT 0 AND len(attach.fileName) GT 0>
<cfquery name="qSave" datasource="#request.DS#">
insert into #ATTRIBUTES.entity#_doc (
#ATTRIBUTES.entity#_id, #ATTRIBUTES.entity#_doc, doc, contenttype, fname,
dt_created, creator_id, dt_updated, updater_id
) values (
<cfqueryparam value=#ATTRIBUTES.id# cfsqltype="CF_SQL_INTEGER" />,
<cfqueryparam value=#doc_title# cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value=#attach.binaryData# cfsqltype="CF_SQL_VARBINARY">,
<cfqueryparam value=#attach.contentType# cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value=#attach.fileName# cfsqltype="CF_SQL_VARCHAR">,
<cfqueryparam value=#Now()# cfsqltype="CF_SQL_TIMESTAMP" />,
<cfqueryparam value=#request.usr_id# cfsqltype="CF_SQL_INTEGER" />,
<cfqueryparam value=#Now()# cfsqltype="CF_SQL_TIMESTAMP" />,
<cfqueryparam value=#request.usr_id# cfsqltype="CF_SQL_INTEGER" />
)
</cfquery>
</cfif>
<!--- PRG pattern--->
<m:location url="#ATTRIBUTES.tr.selfUrl#"/>
<cfcatch type="ANY"><cfrethrow/></cfcatch>
</cftry>
<cfelse>
<!--- --->
</cfif>
</cfcase>
<cfcase value="view">
<div style="margin:1em 0;">
<b>Документы:</b>
<cfquery name="qDoc" datasource="#request.DS#">
select d.#ATTRIBUTES.entity#_doc_id as doc_id, d.#ATTRIBUTES.entity#_doc as doc_title, d.fname, d.contenttype,
d.dt_created, a.shortname as creator, d.dt_updated, m.shortname as modifier
from #ATTRIBUTES.entity#_doc d
left outer join usr a on (d.creator_id=a.usr_id)
left outer join usr m on (d.updater_id=m.usr_id)
where #ATTRIBUTES.entity#_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.id#/>
</cfquery>
<cfoutput query="qDoc">
<span class="nw">
<a href="doc_get.cfm?entity=#ATTRIBUTES.entity#&doc_id=#doc_id#" title="открыть (#contenttype#)" target="_blank"><m:contenttype_icon contenttype=#contenttype#/></a>
<cfif #ATTRIBUTES.writePermitted#>
<a href="doc.cfm?entity=#ATTRIBUTES.entity#&doc_id=#doc_id#&#ATTRIBUTES.tr.fwx#" title="редактировать атрибуты"><cfif len(doc_title)>#doc_title#<cfelse>#fname#</cfif></a>
<a href="doc_del.cfm?entity=#ATTRIBUTES.entity#&doc_id=#doc_id#&#ATTRIBUTES.tr.fwx#" title="удалить"><img src="img/del2.png"/></a>
<cfelse>
<cfif len(doc_title)>#doc_title#<cfelse>#fname#</cfif>
</cfif>
</span>
&nbsp; &nbsp;
</cfoutput>
<cfif #ATTRIBUTES.writePermitted#>
<cfoutput>
<form name="frmDoc" action="#request.thisPage#" method="post" enctype="multipart/form-data" style="border:1px solid lightgray; display:inline-block; padding:.1em .5em; background-color:##eee;">
<input type="hidden" name="track" value="#ATTRIBUTES.tr.self#"/>
<input type="hidden" name="#ATTRIBUTES.entity#_id" value="#ATTRIBUTES.id#"/>
Добавить:
<input type="file" name="doc"/>
Название документа:
<input type="text" name="doc_title" value="" size="30"/>
<button type="submit" name="savedoc" class="maincontrol">Загрузить</button>
</form>
</cfoutput>
</cfif>
</div>
</cfcase>
<cfdefaultcase>
<cfoutput>documents: there is no such section "#ATTRIBUTES.section#"</cfoutput>
</cfdefaultcase>
</cfswitch>
<cfexit method="exittag"/><cfqueryparam cfsqltype="cf_sql_bigint"/><cfexit method="exittag"/>
+64
View File
@@ -0,0 +1,64 @@
<!--- not used --->
<cfimport prefix="m" taglib="../lib"/>
<cfparam name="ATTRIBUTES.param_class_id" type="integer"/>
<cfparam name="ATTRIBUTES.fwx" type="string"/>
<cfparam name="ATTRIBUTES.self" type="string"/>
<cfparam name="ATTRIBUTES.estatus" type="struct"/>
<cfquery name="qRead" datasource="#request.DS#">
select p.param_id, p.param, p.precision
from param p
where p.param_class_id=<cfqueryparam cfsqltype="CF_SQL_INTEGER" value=#ATTRIBUTES.param_class_id#/>
order by 2
</cfquery>
<cfif ATTRIBUTES.estatus.errorState>
<p class="err">
<cfoutput>#ATTRIBUTES.estatus.errorMessage#</cfoutput>
</p>
</cfif>
<table class="worktable">
<thead>
<tr>
<td></td>
<td>Вариант компонента</td>
<td>Точность</td>
<td></td>
</tr>
</thead>
<cfoutput query="qRead">
<tr>
<td><m:link_view_edit entity='param' id=#param_id# fwx=#ATTRIBUTES.fwx# title_view="просмотреть вариант компонента" title_edit="редактировать вариант компонента"/></td>
<td>#param#</td>
<td>#precision#</td>
<td class="c"><a href="#request.thisPage#?action=delete_param&param_id=#ATTRIBUTES.param_id#&param_class_id=#param_class_id#&track=#ATTRIBUTES.self#" title="удалить вариант компонента"><img src="img/del.gif"></a></td>
</tr>
</cfoutput>
<cfoutput>
<form action="#request.thisPage#" method="post" name="frmparam">
<input type="hidden" name="action" value="add_param">
<input type="hidden" name="track" value="#ATTRIBUTES.self#"/>
<input type="hidden" name="param_class_id" value="#ATTRIBUTES.param_class_id#">
<tr>
<td class="c">
<button type="submit" name="add_param" class="submitnew" title="добавить прямо тут"/>
</td>
<td colspan="3">
<input type="text" name="quantity" size="5" class="r" value=""/>
</td>
<td colspan="2">
<input type="text" name="precision" size="5" class="r" value="0"/>
</td>
</tr>
</form>
</cfoutput>
</table>
<cfexit method="exittag"/>
+104
View File
@@ -0,0 +1,104 @@
<cfimport prefix="c" taglib="../lib/controls"/>
<cfimport prefix="d" taglib="../lib/data"/>
<!---<cfif StructKeyExists(form, "add_role")>
<cfdump var=#form#/>
</cfif>--->
<cfparam name="ATTRIBUTES.usr_id"/>
<cfparam name="ATTRIBUTES.fwx"/>
<cfparam name="ATTRIBUTES.self"/>
<cfparam name="ATTRIBUTES.editable" type="boolean" default="No"/>
<d:bean readonly=#!ATTRIBUTES.editable# savemarker="add_role" table="usr_role" datasource="#request.DS#" output="de" status="estatus" info="einfo" meta="emeta">
<d:param field="usr_id" type="integer" key/>
<d:param field="role_id" type="integer" key/>
<d:param field="creator_id" type="integer" value="#request.usr_id#" skipUpdate/>
<d:param field="dt_created" type="timestamp" value="#Now()#" skipUpdate/>
</d:bean>
<cfif structKeyExists(FORM, "detach_role") AND #ATTRIBUTES.editable#>
<cfparam name="FORM.role_id" type="integer"/>
<cfquery name="qDetachrole" datasource="#request.DS#">
delete from usr_role
where usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#ATTRIBUTES.usr_id#/>
AND role_id=<cfqueryparam cfsqltype="cf_sql_integer" value=#FORM.role_id#/>
</cfquery>
</cfif>
<cfquery name="qRead" datasource="#request.DS#">
select
x.usr_id
,x.role_id
,p.role
from usr_role x
join role p on (x.role_id=p.role_id)
where x.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#ATTRIBUTES.usr_id#"/>
order by 2
</cfquery>
<cfoutput>
<b>Роли пользователя (#qRead.recordCount#):</b>
</cfoutput>
<table class="worktable">
<cfoutput>
<thead>
<tr class="worktable_head">
<th>Роль</th>
<th></th>
</tr>
</thead>
</cfoutput>
<cfoutput query="qRead">
<tr>
<td>#role#</td>
<td class="c">
<cfif #ATTRIBUTES.editable#>
<form action="#request.thisPage#" method="post">
<input type="hidden" name="usr_id" value="#ATTRIBUTES.usr_id#"/>
<input type="hidden" name="role_id" value="#role_id#"/>
<input type="hidden" name="track" value="#ATTRIBUTES.self#"/>
<button type="submit" name="detach_role" class="submitminus" title="убрать роль пользователя"></button>
</form>
</cfif>
</td>
</tr>
</cfoutput>
<cfif ATTRIBUTES.editable>
<cfoutput>
<tr>
<td colspan="3" style="vertical-align:middle;">
<form action="#request.thisPage#" method="post">
<input type="hidden" name="track" value="#ATTRIBUTES.self#"/>
<input type="hidden" name="usr_id" value="#ATTRIBUTES.usr_id#"/>
<button type="submit" name="add_role" class="submitnew" value="" title="добавить прямо тут" style="vertical-align:middle"></button>
<cfquery name="qRole" datasource="#request.DS#">
select c.role_id, c.role
from role c
order by c.role
</cfquery>
<c:combo
query=#qRole#
combo="role_id"
key="role_id"
id="role_id"
displayf="##role##"
empty=""
style="vertical-align:middle"
<!--- flag_disabled="cnt"--->
/>
</form>
<i></i>
</td>
</tr>
</cfoutput>
</cfif>
</table>
<cfexit method="exittag"/>