cancel
Showing results for 
Search instead for 
Did you mean: 

Mover documento cambiando el nombre

jjabre
Champ in-the-making
Champ in-the-making
Estimados

Tengo el siguiente codigo

        var espacio="Proforma4";
      var dest = companyhome.childByNamePath(espacio);
        if (dest == null)
        {
           companyhome.createFolder(espacio);
        }
        for (var i = 0; i < bpm_package.children.length; i++)
      {
         var documento = bpm_package.children[i];
         var mover = documento.move(dest);
            if (mover == null)
            {
                var backupName = "Backup of " + mover.name;
               mover.name = backupName;
               mover.save();
               mover.move(espacio);
            }
         }
El cual comprueba si existe un espacio
  - si existe lo deja tal como esta
  - si no existe lo crea .

toma todos los documentos del bpm_package y a cada uno le realiza:
   - comprueba si puede mover el documento
       - si lo puede mover solo lo mueve
       - si no lo puede mover (porque ya existe en el dest) le cambia el nombre y luego lo mueve.

pero  cuando trato de cambiar el nombre y moverlo me entrega un error
"Duplicate child name not allowed: OC-prueba47.txt"
el nombre "OC-prueba47.txt" es el archivo original, pero este deberia ser "Backup ofOC-prueba47.txt".

que estoy haciendo mal ?
6 REPLIES 6

ajv
Champ in-the-making
Champ in-the-making
Hola jjabre,

Revisando tu script he visto algunas cosillas que no me cuadraban. Lo he rehecho de esta forma:
 var espacio="Proforma4";
var dest = companyhome.childByNamePath(espacio);
if (dest == null)
{
   dest = companyhome.createFolder(espacio);
}

for (var i = 0; i < bpm_package.children.length; i++)
{
         var documento = bpm_package.children[i];
         var backupName = "Backup of " + documento.name;
         if (dest.childByNamePath(documento.name) != null) {
               //Falta determinar qué ocurre si ya existe en dest o en origen el nodo "Backup of X"
               documento.name = backupName;
               documento.save();
         }
         documento.move(dest);
}
Básicamente lo que no me parecía bien era el fragmento de:
mover.name = backupName;
mover.save();
mover.move(espacio);
Ya que no deberían aplicarse sobre la variable mover (que es simplemente un indicador de si ha ido bien o no el movimiento del nodo). Debería hacerse contra documento.
Por otro lado, según la especificación del API javascript de alfresco, si la operación move ha ido mal devuelve false en lugar de null…No obstante, si se produce un DuplicateChild en teoría te debe dar excepción, por lo que el control de si mover == false no creo que te sirva de mucho.

Siguiendo el código propuesto, podrías hacer en el espacio destino una búsqueda si existe un nodo con el nombre del nodo que estás tratando (para ver si tienes que concatenarle el Backup of o no)…Aún asi, tal como te he comentado en el código, se podrían producir 2 problemas con ese script:
- Que en dest existiese un nodo de la forma Backup of…, con lo cual la operación de mover te daría un DuplicateChild…
- Que en el espacio origen exista un nodo de la forma Backup of…A la hora de tratar el nodo X y hacer la concatenación de Backup of, también daría error.
Pero bueno, son condiciones extra que puedes incorporar en tu script si es posible que se dé esa circunstancia.

Bueno, que vaya bien!!

jjabre
Champ in-the-making
Champ in-the-making
gracias por tu respuesta

realize modificaciones en el codigo


   <task-node name="Vendedor">
   <task name="wfj:prueba" swimlane="initiator">
   <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
   <actor>#{bpm_assignee}</actor>
   </assignment>
   </task>
   <transition to="Documentos Proformas" name="Enviar a Proforma">
     <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
     <script>
        var espacio="Proforma4";
      var dest = companyhome.childByNamePath(espacio);
        if (dest == null)
        {
           companyhome.createFolder(espacio);
        }
        for (var i = 0; i &lt; bpm_package.children.length; i++)
      {
         var text=espacio + "/"+  bpm_package.children[i].name;
         var logFile = companyhome.childByNamePath(text);
         if (logFile == null)
         {
            bpm_package.children[i].move(dest);
         }
         else
         {
            var x=1;
            var rr=0;
            while(rr!=1)
            {
               var backupName2 = x + "-" + bpm_package.children[i].name;
                  var text2=espacio + "/"+  backupName2;
                  var logFile2 = companyhome.childByNamePath(text2);
               if (logFile2 == null)
               {
                  bpm_package.children[i].name= backupName2;
                  bpm_package.children[i].move(dest);
                  rr=1;
               }      
                    logFile = companyhome.childByNamePath(text2);
                    x=x+1;
                }      
            }
         }
           </script>
  </action>   
   </transition>
   <transition to="OC Rechazadas" name="Rechazar"></transition>
   </task-node>


<task-node name="Vendedor">
   <task name="wfj:prueba" swimlane="initiator">
   <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
   <actor>#{bpm_assignee}</actor>
   </assignment>
   </task>
   <transition to="Documentos Proformas" name="Enviar a Proforma">
     <action class="org.alfresco.repo.workflow.jbpm.AlfrescoJavaScript">
     <script>
        var espacio="Proforma4";
      var dest = companyhome.childByNamePath(espacio);
        if (dest == null)
        {
           companyhome.createFolder(espacio);
        }
        for (var i = 0; i &lt; bpm_package.children.length; i++)
      {
         var text=espacio + "/"+  bpm_package.children[i].name;
         var logFile = companyhome.childByNamePath(text);
         if (logFile == null)
         {
            bpm_package.children[i].move(dest);
         }
         else
         {
            var x=1;
            var rr=0;
            while(rr!=1)
            {
               var documento =bpm_package.children[i];
               var backupName2 = x + "-" + documento.name;
                  var text2=espacio + "/"+  backupName2;
                  var logFile2 = companyhome.childByNamePath(text2);
               if (logFile2 == null)
               {
                  documento.name= backupName2;
                  documento.save();
                  documento.move(dest);
                  rr=1;
               }      
                    logFile = companyhome.childByNamePath(text2);
                    x=x+1;
                }      
            }
         }
           </script>
  </action>   
   </transition>
   <transition to="OC Rechazadas" name="Rechazar"></transition>
   </task-node>

cuando el archivo no esta repetido pasa al siguiente estado sin problema.
Pero cuando el archivo esta repetido genera el 1-nombrearchivo sin problemas, pero me genera dos worklow uno en el estado al que debe pasar y otro en el estado inicial .

Me explico, el workflow tiene los estado A,B y C  con estas tranciciones A->B->C
tengo un workflow en el estado  A el scrit se ejecuta al pasar del estado A al B
Cuando el archivo no esta repetido no hay problema y el workflow pasa del estado A al B al C y termina en C
Pero cuando esta repetido el workflow pasa del estado A al B con el documento 1-[nombre de archivo], pero genera un nuevo workflow en el estado A con el mismo archivo 1-[nombre de archivo].

No se como solucionar el problema, porque no me entrega ningun error en el log de alfresco.

Gracias.

jjabre
Champ in-the-making
Champ in-the-making
Aun no puedo dar con la solucion

Al generar el cambio de nombre al documento, mover este al nuevo espacio y avanzar con el flujo, este genera dos tareas una en la ubicacion que corresponde al movimiento (transition) del JBPM y otro en el estado anterior del flujo, ambos con el nombre del archivo cambiado.

Este el codigo para generar el movimiento.

for (var i = 0; i &lt; bpm_package.children.length; i++)
        {
           var text=espacio + "/"+  bpm_package.children[i].name;
         var logFile = companyhome.childByNamePath(text);
           if (logFile == null)
            {
            bpm_package.children[i].move(dest);
             }
           else
            {
               var x=1;
               var rr=0;
               while(rr!=1)
               {
         var backupName2 = x + "-" + bpm_package.children[i].name;
                     var text2=espacio + "/"+  backupName2;
                     var logFile2 = companyhome.childByNamePath(text2);
                     if (logFile2 == null)
                     {
                        bpm_package.children[i].name= backupName2;
                        bpm_package.children[i].move(dest);
                        rr=1;
                     }     
                   x=x+1;
                }  
              }

de antemano Gracias.

pjcaracuel_2349
Confirmed Champ
Confirmed Champ
Una preguntilla, como se ejecuta el workflow? Mediante un js asociado a una regla?

jjabre
Champ in-the-making
Champ in-the-making
Este tema lo había dejado estancado mientras solucionaba otro pero, tienes toda la razón, la regla que esta funcionando esta tomando el cambio de nombre como un nuevo/modificación de ingreso de un documento. por lo que esta generando un flujo nuevo.

El problema es que la regla para que funcione (agregue las propiedades que hemos generado) debe ser para actualizacion, por lo que no se como cambiarle el nombre y enviarlo al otro espacio, sin activar la regla.

muchas Gracias.

jesa
Champ in-the-making
Champ in-the-making
Hola a todos

necesito algo parecido al hilo de este post solo que yo necesito es que se cambie el nombre despues de un "-" que se le colocara y del"-" en adelante todo se borre debido a que el condenido del guin en adelante sera meramente informativo apra cargar los flujos de trabajo que se requieren una ven cargados los flujos estos caracteres me afectan para la apropiada identificacion del documento en el departamento de contabilidad

Cualquier ayuda sera de mucha ayuda