/**
  * Procesa documentos xpdl, previamente seleccionados, generando y/o
  * actualizando objetos Macro, Paquete, Proceso, Actividad y RolAbstracto.
  * Retorna un array con los archivos que no pudieron ser procesados.
  *
  * @param array $files_xpdl Archivos Xpdls a Importar
  * @return array Archivos no procesados
  */
 public function processXpdls($files_xpdl = array())
 {
     // Para ir volcando los paquetes no procesados por alguna regla invalida
     $noimp = array();
     foreach ($files_xpdl as $file) {
         $xpdl = new psdfXpdl($file);
         // Recupero Id y Nombre del paquete
         $xpdlPackageId = $xpdl->getPackageId();
         $xpdlPackageName = $xpdl->getPackageName();
         // Recupero Macro
         $macro_name = $xpdl->getMacroName();
         // Contenido del xpdl como un string para guardarlo
         $content = $xpdl->getContent();
         // Intento recuperar Macro y Paquete si ya estuviesen almacenados
         $macro = Doctrine::getTable('Macro')->findOneByNombre($macro_name);
         $pack = Doctrine::getTable('Paquete')->findOneByXpdlId($xpdlPackageId);
         // REGLAS
         $err = array();
         // Si no se cumple alguna regla generar:
         // $err['file'] = $this->getNombre();
         // $err['error'] = 'Mensaje del error';
         // CONTINUO SI SE PASARON TODAS LAS REGLAS
         if (count($err) == 0) {
             // Creo el macro si aún no existe
             if (!$macro) {
                 $macro = new Macro();
                 $macro->setNombre($macro_name);
                 $macro->setRelProyecto($this->getId());
                 $macro->save();
             }
             // Creo el paquete si aún no existe y actualizo
             if (!$pack) {
                 $pack = new Paquete();
                 $pack->setNombre($xpdlPackageName);
                 $pack->setRelMacro($macro->getId());
                 $pack->setXpdl($content);
                 $pack->setXpdlId($xpdlPackageId);
                 $pack->save();
                 // Grabo para que genere el Id
             } else {
                 if ($pack->getXpdl() != $content) {
                     $pack->setXpdl($content);
                 }
                 if ($pack->getNombre() != $xpdlPackageName) {
                     $pack->setNombre($xpdlPackageName);
                 }
             }
             // Guardo el paquete con los cambios
             if ($pack->isNew() or $pack->isModified()) {
                 $pack->save();
             }
             // Delego en el paquete la sincronizacion de los Procesos
             $err = $pack->syncProcesses($xpdl);
             if (count($err) > 0) {
                 $noimp[] = array_merge($noimp, $err);
             }
         } else {
             $noimp[] = $err;
         }
     }
     return $noimp;
 }