cancel
Showing results for 
Search instead for 
Did you mean: 

Problema al ejecutar un JS que lanza un workflow simple

pecdesarrollo
Confirmed Champ
Confirmed Champ

He construido un JS para asociar a un workflow a un documento cuando entra en una carpeta (lo llamo desde una regla).

Uso esto en lugar de asociar a la regla el workflow simple estándar porque necesito en el futuro utilizar esta regla desde varios portales y tendré que hacer que la carpeta de destino apunte al portal desde donde el JS es llamado.

Cuando incorporo un documento a la carpeta el JS se ejectuta y produce el siguiente error en alfresco.log:

========================

ERROR [org.springframework.extensions.webscripts.AbstractRuntime] [http-apr-8080-exec-6] Exception from executeScript - redirecting to status template error: 09270010 Failed to execute script 'workspace://SpacesStore/4130be6d-1408-4001-ba98-6706567f6879': 09270009 A value for the mandatory parameter approve-step has not been set on the rule item simple-workflow

========================

Este es el código del JS:

========================

var workflow = actions.create("simple-workflow");

if(!document.hasAspect("app:simpleworkflow")){

   document.addAspect("app:simpleworkflow");

}

document.properties.approveStep = "Approve";

document.properties.approveMove = "true";

document.properties.approveFolder = companyhome.childByNamePath("Pruebas/" + "Para Revisión 2");

document.properties.rejectStep = "Reject";

document.properties.rejectMove = "true";

document.properties.rejectFolder = companyhome.childByNamePath("Pruebas/" + "Para Revisión 1 (rechazos)");

document.save();

workflow.parameters["bpm:workflowDescription"] = document.name;

var poolGroup = people.getGroup("GROUP_Revisores");

workflow.parameters["bpm:groupAssignee"] = poolGroup;

workflow.parameters.workflowName = "activiti$activitiReviewPooled";

workflow.execute(document);

========================

Estoy buscando y, aunque veo el problema reportado varias veces, no encuentro ningún post que lo solucione o explique.

Agradezco anticipadamente cualquier ayuda.

Un cordial saludo.

1 ACCEPTED ANSWER

Suponiendo que tienes la siguiente estructura:

  ParaRevision1

  ParaRevision1_Rechazados

  ParaRevision2

Entiendo que asignas la regla a la carpeta "ParaRevision1", por lo que los documentos que entren en esa carpeta serán los "document" del script.

De acuerdo a esto, "document.parent" devolverá "ParaRevision1", por lo que tendrás que usar "document.parent.parent" para estar en la carpeta padre de "ParaRevision1", "ParaRevision1_Rechazados" y "ParaRevision". Una vez ahí ya puedes iterar para buscar la carpeta que quieres o buscarla por nombre.

Hyland Developer Evangelist

View answer in original post

8 REPLIES 8

angelborroy
Community Manager Community Manager
Community Manager

Lo cierto es que te he enlazado un ejemplo sin verificarlo...

Puedes consultar cómo funciona esta acción en Alfresco: Simple Workflow – I exist as I am 

Los workflows simples se basan en la asignación de un aspecto que establece las propiedades para la Aprobación / Rechazo. Una vez que el nodo tiene ese aspecto y esas propiedades informadas, los botones de "Aprobación" y "Rechazo" aparecen en la Biblioteca de Documentos y el usuario puede lanzar el workflow simple.

Por tanto, para tu regla lo único que necesitas es asignar el aspecto y asignar esas propiedades. El código sería similar a éste:

if(!document.hasAspect("app:simpleworkflow")){

   document.addAspect("app:simpleworkflow");

}

document.properties["app:approveStep"] = "Approve";

document.properties["app:approveMove"] = "true";

document.properties["app:approveFolder"] = companyhome.childByNamePath("/Compartido/Regla/Aprobado");

document.properties["app:rejectStep"] = "Reject";

document.properties["app:rejectMove"] = "true";

document.properties["app:rejectFolder"] = companyhome.childByNamePath("/Compartido/Regla/Rechazado");

document.save();

Te faltaría calcular la carpeta de aprobación y rechazo en función de la ubicación en la que te encuentres.

Hyland Developer Evangelist

Buenos días Ángel,

He probado y parece que no soy capaz de asignar la carpeta de destino.

El site se llama "Pruebas".

La carpeta dónde cargo el documento se llama "Para Revisión 1".

La carpeta dónde deben ir los documentos que son aprobadosse llama "Para revisión 2".

La carpeta dónde deben ir los documentos que son rechazados se llama "Para revisión 1 (rechazados)".

Con el JS cosnsigo que el documento cargado tenga las opciones de "Aprobar" y "Rechazar".

Pero al pincharlas siempre obtengo este error:

==================================

2016-10-28 11:29:36,761 ERROR [org.springframework.extensions.webscripts.AbstractRuntime] [http-apr-8080-exec-12] Exception from executeScript - redirecting to status template error: 09280008 Wrapped Exception (with status template): 09280028 No folder was specified for the simple workflow step.

==================================

El JS es éste:

============================

if(!document.hasAspect("app:simpleworkflow")){

   document.addAspect("app:simpleworkflow");

}

document.properties["app:approveStep"] = "Approve";

document.properties["app:approveMove"] = "true";

document.properties["app:approveFolder"] = companyhome.childByNamePath("../Para Revisión 2");

document.properties["app:rejectStep"] = "Reject";

document.properties["app:rejectMove"] = "true";

document.properties["app:rejectFolder"] = companyhome.childByNamePath("../Para Revisión 1 (rechazos)");

document.save();

============================

para "companyhome.childByNamePath" he probado todas estas opciones:

"Para Revisión 2"

"Pruebas/Para Revisión 2"

"Pruebas/Documentos/Para revisión 2"

"../Para Revisión 2"

y todas producen el mismo error.

¿Qué estoy haciendo mal?

Muchas gracias, un cordial saludo.

Para indicar rutas no puedes emplear los puntos.

Prueba algo parecido a esto, asume que las carpetas Aceptado y Rechazado están en el mismo nivel que el documento al que le aplicas el aspecto.

// Child folders from document parent folder

var folders = document.parent.getChildren();

// Find accept and reject folder in relation to document location

var acceptFolder, rejectFolder;

for (var i = 0; i < folders.length; i++) {

    if (folders[i].properties["cm:name"] == "Aceptado") acceptFolder = folders[i];

    if (folders[i].properties["cm:name"] == "Rechazado") rejectFolder = folders[i];

}

if(!document.hasAspect("app:simpleworkflow")){

   document.addAspect("app:simpleworkflow");

}

document.properties["app:approveStep"] = "Approve";

document.properties["app:approveMove"] = "true";

document.properties["app:approveFolder"] = acceptFolder;

document.properties["app:rejectStep"] = "Reject";

document.properties["app:rejectMove"] = "true";

document.properties["app:rejectFolder"] = rejectFolder;

document.save();

Hyland Developer Evangelist

Hola Ángel:

El código es claro y simple.

Lo he adaptado y al probarlo se mantiene el error.

He quitado, por las dudas, espacios y acentos del nombre de las carpetas.

No entiendo que puede estar pasando porque cuando cargo el documento en la carpeta "ParaRevision1" el documento se carga, la regla se ejecuta y el JS también.

El documento aparece con las opciones "Aprobar" y "Rechazar" activas.

Lo que pasa es que al intentar aprobarlo o rechazarlo da el mismo error que antes.

Y la verdad es que no lo entiendo, porque está todo bien.

Te detallo todo por si se te ocurre alguna idea que me ayude.

Actualmente el Site tiene en su Biblioteca de Documentos tres carpetas:

  ParaRevision1

  ParaRevision1_Rechazados

  ParaRevision2

El código es el siguiente:

=====================================

// Child folders from document parent folder

var folders = document.parent.getChildren();

// Find accept and reject folder in relation to document location

var acceptFolder, rejectFolder;

for (var i = 0; i < folders.length; i++) {

    if (folders[i].properties["cm:name"] == "ParaRevision2") acceptFolder = folders[i];

    if (folders[i].properties["cm:name"] == "ParaRevision1_Rechazos") rejectFolder = folders[i];

}

if(!document.hasAspect("app:simpleworkflow")){

   document.addAspect("app:simpleworkflow");

}

document.properties["app:approveStep"] = "Approve";

document.properties["app:approveMove"] = "true";

document.properties["app:approveFolder"] = acceptFolder;

document.properties["app:rejectStep"] = "Reject";

document.properties["app:rejectMove"] = "true";

document.properties["app:rejectFolder"] = rejectFolder;

document.save();

=====================================

Y el mensaje de error cuando se intenta aprobar o rechazar es el siguiente:

=====================================

2016-10-28 14:20:44,706 ERROR [org.springframework.extensions.webscripts.AbstractRuntime] [http-apr-8080-exec-5] Exception from executeScript - redirecting to status template error: 09280003 Wrapped Exception (with status template): 09280001 No folder was specified for the simple workflow step.

org.springframework.extensions.webscripts.WebScriptException: 09280003 Wrapped Exception (with status template): 09280001 No folder was specified for the simple workflow step.

=====================================

Muchas gracias, un cordial saludo.

Cuando ejecutas una acción, el document es el nodo sobre el que se ejecuta.

En tu caso, document.parent devolverá "ParaRevision1" y ninguno de sus hijos se llama como estás esperando.

Puedes utilizar la Javascript Console para desarrollar, junto con las trazas de sistema, por ejemplo pon

logger.log(acceptFolder["cm:name"]);

después del bucle para verificar si ha encontrado la carpeta.

JavaScript Console es un addon de Alfresco que puedes descargar en GitHub - share-extras/js-console: Administration Console component for Alfresco Share, that enables ...

Hyland Developer Evangelist

Buenas tardes Ángel,

Muchas gracias otra vez.

Te aseguro que antes de consultarte le echo un par de horas a tratar de encontrar la solución (con eso también aprendo mucho).

Pero no he sido capaz de encontrar cómo modificar el script para que "folders" le apunte al "padre" de "ParaRevision1" en lugar de a "ParaRevision1".

Si puedes echarme una mano te lo agradezco.

Un cordial saludo.

Suponiendo que tienes la siguiente estructura:

  ParaRevision1

  ParaRevision1_Rechazados

  ParaRevision2

Entiendo que asignas la regla a la carpeta "ParaRevision1", por lo que los documentos que entren en esa carpeta serán los "document" del script.

De acuerdo a esto, "document.parent" devolverá "ParaRevision1", por lo que tendrás que usar "document.parent.parent" para estar en la carpeta padre de "ParaRevision1", "ParaRevision1_Rechazados" y "ParaRevision". Una vez ahí ya puedes iterar para buscar la carpeta que quieres o buscarla por nombre.

Hyland Developer Evangelist

Perfecto!!!

Otro tema cerrado.

Muchísimas gracias.