Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.
HTML
                    <div id="main-content" class="wiki-content group">
	                    <h1 id="MecanismodeAtribuiçãoCustomizado-Índice">Índice</h1>
	<p>
		<style>Contents</h1><p><style type='text/css'>/*<![CDATA[*/
div.rbtoc1412695703823 {
	padding: 0px;
}
div.rbtoc1412695703823 ul {
	list-style: none;
	margin-left: 0px;
}
div.rbtoc1412695703823 li {
	margin-left: 0px;
	padding-left: 0px;
}
/*]]>*/
</style>
	<divstyle><div class='toc-macro rbtoc1412695703823'>
		<ul class='toc-indentation'>
			<li><span class='TOCOutline'>1</span> <a
				 href='#MecanismodeAtribuiçãoCustomizado-Objetivo'>Objetivo<>Objective</a></li>
			<li><span class='TOCOutline'>2</span> <a
				 href='#MecanismodeAtribuiçãoCustomizado-Pré-requisitos'>Prerrequisitos<>Requirements</a></li>
			<li><span class='TOCOutline'>3</span> <a
				 href='#MecanismodeAtribuiçãoCustomizado-ConstruindoumMecanismoPersonalizado'>Construyendo
					un Mecanismo Personalizado<>Building a Custom Mechanism</a></li>
			<li><span class='TOCOutline'>4</span> <a
				 href='#MecanismodeAtribuiçãoCustomizado-RetornandoumaListagemdeUsuários'>Retornando
					una Lista de Usuarios<>Returning a User List</a></li>
			<li><span class='TOCOutline'>5</span> <a
				 href='#MecanismodeAtribuiçãoCustomizado-UtilizandoDatasets'>Utilizando
					>Using Datasets</a></li>
			<li><span class='TOCOutline'>6</span> <a
				 href='#MecanismodeAtribuiçãoCustomizado-UtilizandoServiços/Webservices'>Utilizando
					Servicios>Using Services / Webservices</a></li>
		</ul>
	</div>
	</p>
	<h1div></p><h1 id="MecanismodeAtribuiçãoCustomizado-Objetivo">Objetivo</h1>
	<p>
		El objetivo de esta guía es orientar como construir un <em>script</em>
		con la finalidad de resolver los responsables por una tarea del
		proceso workflow y/o gestor de proceso.
	</p>
	<h1>Objective</h1><p>The purpose of this guide is to provide instructions on how to build a <em>script</em> with the purpose of solving a assignee for a workflow process task and/or process manager.</p><h1 id="MecanismodeAtribuiçãoCustomizado-Pré-requisitos">
		Prerrequisitos<strong><br >Requirements<strong><br /></strong>
	</h1>
	<ul>
		<li>Conocimiento del lenguaje Javascript;</li>
		<li>Conocimiento sobre la construcción de flujos de proceso
			Workflow Fluig;</li>
		<li>Conceptos sobre la utilización de Datasets Fluig;</li>
		<li>Entendimiento sobre servicios de la Web, Webservices, SOAP y
			XML;</li>
		<li>Familiaridad con la herramienta de desarrollo, TOTVS
			Developer Studio o Eclipse;</li>
		<li>Instalación delstrong></h1><ul><li>Knowledge of JavaScript language;</li><li>Knowledge on the construction of Workflow Fluig process flows;</li><li>Knowledge on using Fluig Datasets;</li><li>Understanding of Web, Webservice, SOAP e XML services;</li><li>Familiarity with the development tool, TOTVS Developer Studio or Eclipse;</li><li>Installation of Fluig Studio.</li>
	</ul>
	<h1
		li></ul><h1 id="MecanismodeAtribuiçãoCustomizado-ConstruindoumMecanismoPersonalizado">Construyendo
		un Mecanismo Personalizado</h1>
	<p>En algunas situaciones es necesario utilizar lógicas más
		complejas y específicas sobre quien será(n) el(los) responsable(s) por
		la ejecución de la actividad en la solicitud de proceso workflow. Para
		eso, existe el "Mecanismo de Atribución Personalizado".</p>
	<p>
		Para iniciar su construcción, se debe, en un proyecto existente, hacer
		clic en la carpeta <em>mechanisms</em>&#160;y&#160;acceder el
		menú&#160;<em>Archivo > Nuevo > Otros>Building a Custom Mechanism</h1><p>In some situations, a more complex and specific logic is required regarding the definition of who will be responsible for the execution of the activity in the workflow process request. That is the purpose of the "Custom Attribution Mechanism".</p><p>To start building this mechanism, one should, from an existing project, click on the folder <em>mechanisms</em> and access the menu&#160;<em>File > New > Other... </em>(accesibleaccessible por las
		teclas de atajo <em>CTRLthrough the shortcut<em>CTRL+N,</em>&#160;oor hacerby clicclicking conthe el botón
		derecho delfolder with the right mouse sobre la carpetabutton, ythen seguirfollowing porthe el menú suspendido),
		expandir eldrop-down menu), expand the <em>Fluig</em>&#160;grupogroup (carpetafolder) <em>Fluig</em>,&#160;seleccionar la
		opciónselect&#160;<em>Mecanismo<em>Custom PersonalizadoFluig Fluig<Mechanism</em>&#160;yand hacer clic
		en el botón&#160;<em>Avanzar. </em>En la pantalla siguiente, indicar
		el <em>Código<click on <em>Next. </em>In the following screen, enter the <em>Code</em>&#160;(obligatorio y no se puede alterar después) en
		el campo respectivo y su <em>Descripciónmandatory and cannot be changed at a later time) in the respective field and its <em>Description </em>(opcionaloptional), igualmente,
		yand, lastly, finalmente, hacer clic en el botón <em>Concluir<click <em>Finish</em>.
	</p>
	<p>p><p>&#160;</p>
	    <div class="aui-message hint shadowed information-macro">
		                    <p class="title">Nota<>Note</p>
		<span class="aui-icon icon-hint">Icon</span>
		                            <span class="aui-icon icon-hint">Icon</span>
                <div class="message-content">
			<p>
				El código para el mecanismo debe seguir la especificación de
				estandarización conforme al documento <a
					href="attachments/142804157/142935815.docx">Formularios Fluig</a>.
			</p>
		</div>
	</div>
	<p>&#160;</p>
	<p>
		Con eso, se creará la función básica que&#160;se debe implementar                    <p>The code for the mechanism must follow the default specification, according to the <a href="http://tdn.totvs.com/download/attachments/185741417/142935815.docx?version=1&modificationDate=1426513779000&api=v2">Fluig Forms</a> document.</p>
                    </div>
    </div>
<p>&#160;</p><p>Therefore, this basic function will be created, and must be implemented:<span>&#160;</span>
	</p>
	<p>
		<span>span></p><p><span> <br /></span>
	</p>
	<divspan></p><div class="code panel pdl" style="border-width: 1px;">
		<div><div class="codeContent panelContent pdl">
			<pre class="theme: Confluence; brush: javascript; gutter: false"
				 style="font-size: 12px;">function resolve(process,colleague){
	var&#160;userList = null;
	return&#160;userList;
}</pre>
		</div>
	</div>
	<p>/div></div><p>&#160;</p>
	<p>
		La función anterior <strong>no</strong> <strong>retorna
			ningún usuario<p><p>The function above <strong>does not</strong> <strong>return any user</strong>. Su ejecución no permitirá elegirIts execution will not enable the selection of a nadieuser, por eso,
		esta función debe ser complementada.
	</p>
	<p>
		La función <strong>debe </strong>retornar una lista, del tipo <strong><em>ArrayList
		</em></strong>con las <strong>matrículas </strong>de los usuarios. La matrícula no
		es necesariamente igual al login de este usuario. La matrícula
		corresponde al valor existente en el campo del mismo nombre en el
		registro de este usuario y a la columna <em>colleaguePK.colleagueId</em>
		deland therefore the function must be complemented.</p><p>The function <strong>should </strong>return an <strong><em>ArrayList </em></strong>with the <strong>registration </strong>of users. The registration is not necessarily the same as the user login. The registration corresponds to existing value in the field with the same name as the registration for this user and the column <em>colleaguePK.colleagueId</em>, of the Dataset <em>colleague</em>.
	</p>
	<p>p><p>&#160;</p>
	<div     <div class="aui-message warning shadowed information-macro">
		                    <p class="title">Atención<>Warning</p>
		                            <span class="aui-icon icon-warning">Icon</span>
		<div class="message-                <div class="message-content">
			<p>
				Si ocurre cualquier error de sintaxis o en la ejecución del
				mecanismo, este se abortara y, consecuentemente, no devolverá ningún
				responsable para la próxima tarea/actividad del proceso. Es
				importante que toda la implementación pase por un tratamiento de
				errores y protección de ejecución. Una buena práctica es utilizar
				las cláusulas <em>try catch</em>.
			</p>
		</div>
	</div>
	<p>&#160;</p>
	<p>&#160;</p>
	<div class="aui-message hint shadowed information-macro">
		<p class="title">Nota</p>
		<span class="aui-icon icon-hint">Icon</span>
		                            <p>If a syntax error or error in executing the mechanism occurs, it will be aborted and therefore will not return anyone responsible for the next task/process activity. It is important that the entire implementation go through error handling and execution protection. A good practice is to use <em>try catch</em> clauses.</p>
                    </div>
    </div>
<p>&#160;</p><p>&#160;</p>    <div class="aui-message hint shadowed information-macro">
                    <p class="title">Note</p>
                            <span class="aui-icon icon-hint">Icon</span>
                <div class="message-content">
			<p>
				Ningún mensaje de error se puede emitir al usuario durante su
				ejecución, pues estos mecanismos se pueden invocar sin que exista la
				interacción con el usuario, como por ejemplo, las llamadas
				al&#160;webservice <em>ECMWorkflowEngineService</em> por medio de
				las integraciones externas.
			</p>
		</div>
	</div>
	<p>&#160;</p>
	<h1
		                            <p>No error message can be issued to the user during its execution, as these mechanisms may be invoked without interaction with the user, such as calls to <em>ECMWorkflowEngineService</em>, through external integrations.</p>
                    </div>
    </div>
<p>&#160;</p><h1 id="MecanismodeAtribuiçãoCustomizado-RetornandoumaListagemdeUsuários">Retornando
		una Lista de Usuarios</h1>
	<p>Un ejemplo de retorno de una relación fija de usuarios se
		presenta a seguir:</p>
	<p>>Returning a User List</h1><p>An example of return for a fixed user list is shown below:</p><p>&#160;</p>
	<divp><div class="code panel pdl" style="border-width: 1px;">
		<div><div class="codeContent panelContent pdl">
			<pre class="theme: Confluence; brush: javascript; gutter: false"
				 style="font-size: 12px;">function resolve(process,colleague){
	var userList = new java.util.ArrayList();
	userList.add('matricula_1');
	userList.add('matricula_2');
	userList.add('matricula_3');
	return userList;
}</pre>
		</div>
	</div>
	<p>div></div><p>&#160;</p>
	<h1p><h1 id="MecanismodeAtribuiçãoCustomizado-UtilizandoDatasets">Utilizando
		>Using Datasets</h1>
	<p>
		Es posible realizar la consultah1><p>It is possible to query a unPlatform <em>Dataset </em>de la Plataforma
		(internoem> (internal, formulariosforms oor personalizadocustomized), ain order finto dedraw elaborarup elthe resultado
		final deresult losof usuariosusers quethat semay podránbe listarlisted parafor laselection elecciónof de la
		ejecución de la próxima actividad. Este procedimiento se puede
		realizar conforme al ejemplo a seguir:
	</p>
	<p>
		<span><br /></span>
	</p>
	<divthe execution of the next activity. This procedure must be performed according to the example below:</p><p><span><br /></span></p><div class="code panel pdl" style="border-width: 1px;">
		<div><div class="codeContent panelContent pdl">
			<pre class="theme: Confluence; brush: javascript; gutter: false"
				 style="font-size: 12px;">function resolve(process,colleague){
	var userList = new java.util.ArrayList();
	//-- CONSULTAQUERY TO A UN DATASET, DEOF GRUPOFLUIG DEUSERS USUARIOS FLUIGGROUP
	var dtsGroup = DatasetFactory.getDataset('group',null,null,null);
	for(var g = 0; g &lt; dtsGroup.values.length; g++){
		userList.add( 'Pool:Group:'+dtsGroup.getValue(g.toString(),"groupPK.groupId") );
	}
	
	//-- CONSULTAQUERY TO A UN DATASET, DEOF PAPELESFLUIG DEUSERS USUARIOS FLUIGROLE
	var dtsRole = DatasetFactory.getDataset('workflowRole',null,null,null);
	for each(papel in dtsRole.values){
		userList.add( 'Pool:Role:'+papel["workflowRolePK.roleId"] );
	}
	
	return userList;
}</pre>
		</div>
	</div>
	<p>div></div><p>&#160;</p>
	<p>
		En el ejemplo anterior, para que el(los) <strong>Grupop><p>In the example above, in order for the <strong>Group(s)</strong> se
		liste(n) es necesaria la inclusión del prefijo to be listed, it is necessary to include the prefix <strong><em>"Pool: Group:"</em></strong>
		concatenado al código de este Grupo. Con esto, al seleccionar el
		grupo, la actividad se atribuye al Grupo y una persona de este deberá
		asumirla. De la misma forma ocurre para el(s) <strong>Papel(es)
			Workflow</strong>, pero el prefijo debe ser concatenated to the code for this Group. With this, when the group is selected, the activity is attributed to the Group and someone from the group should assume it. The same is true for the <strong>Workflow Role(s)</strong>, however the prefix will be <strong><em>"Pool:Role:"</em></strong>
		más el código del Papel.
	</p>
	<p>, followed by the Role code.</p><p>&#160;</p>
	<h1
		p><h1 id="MecanismodeAtribuiçãoCustomizado-UtilizandoServiços/Webservices">Utilizando
		Servicios>Using Services / Webservices</h1>
	<p>
		La construcción de un mecanismo aun posibilita la utilización de un <strong>Servicio
			de Integración Fluig<h1><p>The construction of a mechanism also enables the use of a <strong>Fluig Integration Service</strong>, quewhich podrámay consumirconsume un <strong>webservice
		</strong>del tipo <strong>SOAP </strong>o del tipo<strong>
			Progressa <strong>SOAP</strong> or <strong>Progress</strong> <strong>webservice&#160;</strong>parastrong>to obtenerretrieve losthe responsablesassignees, de acuerdoaccording conto una regla
		de negocio provista por ela business rule provided by the ERP, porfor ejemploexample. EsteThis métodomethod puede seguir
		el modelo a continuación:
	</p>
	<p>may follow the model below:</p><p>&#160;</p>
	<divp><div class="code panel pdl" style="border-width: 1px;">
		<div><div class="codeContent panelContent pdl">
			<pre class="theme: Confluence; brush: javascript; gutter: false"
				 style="font-size: 12px;">function resolve(process,colleague){
	var userList = new java.util.ArrayList();
	//-- CALL LLAMADATO A UNFLUIG SERVICIOINTEGRATION DESERVICE, INTEGRACIÓNWITH FLUIG, CON UNA SPECIFIED WEBSERVICE ESPECIFICADO
	var biblioteca = ServiceManager.getService('ECMColleagueService').getBean();
	var puntoendpoint = biblioteca. instanciar instantiate('com.totvs.technology.ecm. foundation.ws. ECMColleagueServiceServiceLocator');
	var webservice = webservice endpoint. getColleagueServicePort ();
	var usuariosDtoArray = webservice.getSummaryColleagues(1);
	for each(usuario in usuariosDtoArray.getItem()){
		userList.add( usuario.getColleagueId().toString() );
	}
	
	return userList;
}</pre>
		</div>
	</div>
	<p>div></div><p>&#160;</p>
	<p>
		En que los parámetrosp><p>Where the&#160;"process" yand&#160;"colleague" separameters refieren,
		respectivamenterefer, respectively, ato losthe objetosobjects&#160;<span
			 style="color: rgb(38, 38, 38);">WorkflowProcess process and y
			Colleague colleague.</span>
	</p>
	<p>span></p><p>&#160;</p>
	<divp><div class="table-wrap">
		<table><table class="confluenceTable">
			<tbody>
				<tr>
					<th><tbody><tr><th colspan="2" style="text-align: center;" class="confluenceTh"><span
						 style="color: rgb(0, 51, 102);">WorkflowProcess</span></th>
				</tr>
				<tr>
					<thth></tr><tr><th style="text-align: center;" class="confluenceTh">Parámetro</th>
					<th>Parameter</th><th style="text-align: center;" class="confluenceTh">Tipo</th>
				</tr>
				<tr>
					<td>Type</th></tr><tr><td class="confluenceTd"><span style="color: rgb(38, 38, 38);">companyId</span></td>
					<td/span></td><td class="confluenceTd">long</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">processInstanceId</span></td>
					<tdtd><td colspan="1" class="confluenceTd">int</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">processId</span></td>
					<tdtd><td colspan="1" class="confluenceTd">String</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">Versión<>version</span></td>
					<tdtd><td colspan="1" class="confluenceTd">Integer</td>
				</tr>
				<tr>
					<td/td></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">requesterId</span></td>
					<tdtd><td colspan="1" class="confluenceTd">String</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">active</span></td>
					<tdtd><td colspan="1" class="confluenceTd">Boolean</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">attachmentSeqId&#160;</span></td>
					<tdtd><td colspan="1" class="confluenceTd">Integer</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">sourceProcess&#160;</span></td>
					<tdtd><td colspan="1" class="confluenceTd"><span>Integer</span></td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">sourceThreadSequence&#160;</span></td>
					<tdtd><td colspan="1" class="confluenceTd"><span>Integer</span></td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd"><span
						 style="color: rgb(38, 38, 38);">uuid</span></td>
					<tdtd><td colspan="1" class="confluenceTd">String</td>
				</tr>
			</tbody>
		</table>
	</div>
	<p>td></tr></tbody></table></div><p>&#160;</p>
	<p>p><p>&#160;</p>
	<divp><div class="table-wrap">
		<table><table class="confluenceTable">
			<tbody>
				<tr>
					<th><tbody><tr><th colspan="2" style="text-align: center;" class="confluenceTh"><span
						 style="color: rgb(0, 51, 102);">Colleague</span></th>
				</tr>
				<tr>
					<thth></tr><tr><th style="text-align: center;" class="confluenceTh">Parámetro</th>
					<th>Parameter</th><th style="text-align: center;" class="confluenceTh">Tipo</th>
				</tr>
				<tr>
					<td>Type</th></tr><tr><td class="confluenceTd"><p>colleaguePK&#160;</p>
						<ulp><ul style="list-style-type: square;">
							<li><span><span>long><li><span><span>long companyId</span></span></li>
							<li><span>privateli><li><span>private String colleagueId</span></li>
						</span></li></ul></td>
					<tdtd><td class="confluenceTd">ColleaguePK&#160;</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">userTenantId</td>
					<tdtd><td colspan="1" class="confluenceTd">long&#160;</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">colleagueName</td>
					<tdtd><td colspan="1" class="confluenceTd"><span>String</span></td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">mail</td>
					<tdtd><td colspan="1" class="confluenceTd"><span>String</span></td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">login</td>
					<td>login</td><td colspan="1" class="confluenceTd"><span>String</span></td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">passwd</td>
					<tdtd><td colspan="1" class="confluenceTd"><span>String</span></td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">active</td>
					<tdtd><td colspan="1" class="confluenceTd">Boolean&#160;</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">adminUser</td>
					<tdtd><td colspan="1" class="confluenceTd">Boolean&#160;</td>
				</tr>
				<tr>
					<tdtd></tr><tr><td colspan="1" class="confluenceTd">groupId</td>
					<tdtd><td colspan="1" class="confluenceTd">String</td>
				</tr>
			</tbody>
		</table>
	</div>
	<p>td></tr></tbody></table></div><p>&#160;</p>
	<p>
		El ejemplo anterior utilizó elp><p>The example above used the webservice <em><strong>ECMColleagueService
		, </strong></em>deem>from lathe propiavery plataformaplatform, yand elthe <strong>Servicio<strong>Service </strong>fue creado
		utilizando lastrong>was created with <strong>API Axis</strong>, estándarstandard delin TOTVS ECM 3.0.
	</p>
	<p>p><p>&#160;</p>
                    </div>