Ejemplo n.º 1
0
        internal static void AssignUserPermissionToFolder(FolderWorkflow folderProcess, NestedFolder folder, HqUser user, string letterPermission, string ProjectId)
        {
            Util.LogInfo($"Assigning permission '{letterPermission}' to folder '{folder.name}' for user '{user.email}'.");

            List <string> permissionLevel = GetPermission(letterPermission);

            if (permissionLevel == null)
            {
                permissionLevel = new List <string> {
                    "VIEW", "COLLABORATE"
                };
                Util.LogImportant($"Permission '{letterPermission}' for user '{user.email}' for folder '{folder.name}' was not recognized. Default permission 'V' is taken for this folder.");
            }
            List <FolderPermission> curr_permissions = new List <FolderPermission>();

            curr_permissions.Add(new FolderPermission()
            {
                subjectId      = user.id,
                subjectType    = "USER",
                actions        = permissionLevel,
                inheritActions = permissionLevel
            });

            folderProcess.CustomAssignPermissionToFolder(ProjectId, folder.id, curr_permissions);
        }
Ejemplo n.º 2
0
        internal static void UploadFiles(DataTable table, int rowIndex, FolderWorkflow folderProcess, NestedFolder folder, string projectId, string localFoldersPath)
        {
            string localFolderName = table.Rows[rowIndex]["local_folder"].ToString();

            if (!string.IsNullOrEmpty(localFolderName))
            {
                if (string.IsNullOrEmpty(localFoldersPath) == true)
                {
                    Util.LogError($"Argument -f for LocalFoldersPath is not given! The program has been stopped.");
                    throw new ApplicationException($"Stopping the program... You can see the log file for more information.");
                }

                string localFolderPath = localFoldersPath + @"\" + localFolderName;

                bool folderExist = Directory.Exists(localFolderPath);

                if (folderExist)
                {
                    Util.LogInfo($"Uploading files from local folder '{localFolderName}' to BIM360 folder '{folder.name}'...");

                    string[] filePaths = Directory.GetFiles(localFolderPath);

                    List <string> existingFileNames = folderProcess.CustomGetExistingFileNames(projectId, folder.id);

                    List <string> allowedFileTypesPlans = new List <string> {
                        ".rvt", ".pdf", ".dwg", ".dwf", ".dwfx", ".ifc"
                    };

                    foreach (string filePath in filePaths)
                    {
                        if (!existingFileNames.Contains(Path.GetFileName(filePath)))
                        {
                            // Find root folder
                            NestedFolder rootFolder = folder;
                            while (rootFolder.parentFolder != null)
                            {
                                rootFolder = rootFolder.parentFolder;
                            }

                            string fileExtension = Path.GetExtension(filePath);
                            if (rootFolder.name == "Plans" && !allowedFileTypesPlans.Contains(fileExtension))
                            {
                                Util.LogImportant($"File with name '{Path.GetFileName(filePath)}' is not a supported file type for folder 'Plans'. Skipping... Supported file types are: '.rvt', '.pdf', '.dwg', '.dwf', '.dwfx', '.ifc'.");
                                continue;
                            }

                            folderProcess.CustomUploadFile(projectId, folder.id, filePath);
                        }
                        else
                        {
                            Util.LogInfo($"File with name '{Path.GetFileName(filePath)}' already exists in folder '{folder.name}'. Skipping...");
                        }
                    }
                }
                else
                {
                    Util.LogImportant($"Local folder with name {localFolderName} does not exist! Check if the folder is placed in the correct directory. Skipping files...");
                }
            }
        }
        internal static void AssignRolePermissionToFolder(FolderWorkflow folderProcess, NestedFolder folder, IndustryRole role, string letterPermission, string ProjectId)
        {
            Util.LogInfo($"Assigning permission '{letterPermission}' to folder '{folder.name}' for role '{role.name}'.");

            List <string> permissionLevel = GetPermission(letterPermission);

            if (permissionLevel == null)
            {
                permissionLevel = new List <string> {
                    "VIEW", "COLLABORATE"
                };
                Util.LogImportant($"Permission '{letterPermission}' for role '{role.name}' for folder '{folder.name}' was not recognized. Default permission 'V' is taken for this folder.");
            }

            List <FolderPermission> currPermissions = new List <FolderPermission>
            {
                new FolderPermission()
                {
                    subjectId      = role.id,
                    subjectType    = "ROLE",
                    actions        = permissionLevel,
                    inheritActions = permissionLevel
                }
            };

            folderProcess.CustomAssignPermissionToFolder(ProjectId, folder.id, currPermissions);
        }
Ejemplo n.º 4
0
        internal static NestedFolder CreateFolder(FolderWorkflow folderProcess, string projectId, NestedFolder parentFolder, string folderName, string rootFolderName)
        {
            Util.LogInfo($"Creating folder in '{rootFolderName}' with name: {folderName}...");

            string newFolderId = folderProcess.CustomCreateFolder(projectId, parentFolder.id, folderName);

            NestedFolder subFolder = new NestedFolder(folderName, newFolderId, parentFolder);

            parentFolder.childrenFolders.Add(subFolder);

            return(subFolder);
        }
Ejemplo n.º 5
0
        static void Main(string[] args)
        {
            // Delete previous versions of log.txt
            System.IO.File.Delete("Log/logInfo.txt");
            System.IO.File.Delete("Log/logImportant.txt");

            AppOptions options = AppOptions.Parse(args);

            ProjectWorkflow     projectProcess     = new ProjectWorkflow(options);
            FolderWorkflow      folderProcess      = new FolderWorkflow(options);
            ProjectUserWorkflow projectUserProcess = new ProjectUserWorkflow(options);
            AccountWorkflow     accountProcess     = new AccountWorkflow(options);

            DataTable         csvData  = projectProcess.CustomGetDataFromCsv();
            List <BimProject> projects = projectProcess.GetAllProjects();

            List <BimCompany>   companies      = null;
            BimProject          currentProject = null;
            List <HqUser>       projectUsers   = null;
            List <NestedFolder> folders        = null;
            NestedFolder        currentFolder  = null;

            for (int row = 0; row < csvData.Rows.Count; row++)
            {
                string projectName = csvData.Rows[row]["project_name"].ToString();

                if (!string.IsNullOrEmpty(projectName))
                {
                    Util.LogImportant($"\nCurrent project: {projectName}");

                    currentProject = projects.Find(x => x.name == projectName);

                    if (currentProject == null)
                    {
                        projects = projectProcess.CustomCreateProject(csvData, row, projectName, projectProcess);

                        currentProject = projects.Find(x => x.name == projectName);
                        CheckProjectCreated(currentProject, projectName);
                    }

                    folders = folderProcess.CustomGetFolderStructure(currentProject);

                    companies = accountProcess.CustomUpdateCompanies(csvData, row, accountProcess);

                    projectUsers = projectUserProcess.CustomUpdateProjectUsers(csvData, row, companies, currentProject, projectUserProcess);
                }

                currentFolder = CreateFoldersAndAssignPermissions(csvData, row, projectUsers, folderProcess, folders, currentFolder, currentProject, projectUserProcess);

                UploadFilesFromFolder(csvData, row, folderProcess, currentFolder, currentProject.id, options.LocalFoldersPath);
            }
        }
Ejemplo n.º 6
0
        internal static void UploadFilesFromFolder(DataTable table, int rowIndex, FolderWorkflow folderProcess, NestedFolder currentFolder, string projectId, string localFoldersPath)
        {
            bool   isFolderAtRow    = !string.IsNullOrEmpty(table.Rows[rowIndex]["local_folder"].ToString());
            string folderColumnName = GetFolderColumnName(table, rowIndex);

            // Check if folder at this row
            if (folderColumnName != null && isFolderAtRow)
            {
                UploadFiles(table, rowIndex, folderProcess, currentFolder, projectId, localFoldersPath);
            }
            // Upload files from folder if local folder given at row but no BIM360 folder at row
            else if (isFolderAtRow && folderColumnName == null)
            {
                if (currentFolder != null)
                {
                    UploadFiles(table, rowIndex, folderProcess, currentFolder, projectId, localFoldersPath);
                }
            }
        }
        public bool Initialize()
        {
            bool result = false;

            try
            {
                folderProcess      = new FolderWorkflow(options);
                projectProcess     = new ProjectWorkflow(options);
                serviceProcess     = new ServiceWorkflow(options);
                accountProcess     = new AccountWorkflow(options);
                projectUserProcess = new ProjectUserWorkflow(options);

                result = true;
            }
            catch (Exception e)
            {
                result = false;
                Log.Error(e, "Error during intitialization");
            }
            return(result);
        }
Ejemplo n.º 8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void GetTemplate_OnClick(object sender, RoutedEventArgs e)
        {
            var progress = new updates_upload();

            progress.Show();

            //Updates
            progress.pgb.Value             = 10;
            progress.ProgressLabel.Content = "Build Connection";
            // ProgressBar "refresh"
            CallDispatch(progress);

            string[] input = new string[] { "-c", ClientId, "-s", ClientSecret, "-a", BimId,
                                            "-h", AdminMail, "-f", " .\\sample", "-t", ",",
                                            "-z", ",", "-e", "UTF-8", "-d", "yyyy-MM-dd" };

            AppOptions options = AppOptions.Parse(input);

            // options.AccountRegion = "EU";
            options.AdminRole = "Project Manager";

            ProjectWorkflow projectProcess = new ProjectWorkflow(options);
            FolderWorkflow  folderProcess  = new FolderWorkflow(options);

            System.Threading.Thread.Sleep(1000);
            // load all existing projects from the BIM360 environment
            List <BimProject> projects = projectProcess.GetAllProjects();

            //Updates
            progress.pgb.Value             = 30;
            progress.ProgressLabel.Content = "Download Project";
            // ProgressBar "refresh"
            CallDispatch(progress);

            BimProject currentProject = null;

            // get project from bim360
            try
            {
                currentProject = projects.Find(x => x.name == TextBoxTemplate.Text.Trim());
            }
            catch (Exception)
            {
                statusbar.Text = "No Project with the name:" + TextBoxTemplate.Text.Trim() + " found!";
                return;
            }
            if (currentProject == null)
            {
                return;
            }

            var nestedfolders = folderProcess.CustomGetFolderStructure(currentProject);

            foreach (var iterfolder in nestedfolders)
            {
            }

            progress.pgb.Value             = 50;
            progress.ProgressLabel.Content = "Converte to local Project 0/2";
            // ProgressBar "refresh"
            CallDispatch(progress);


            var newproject = new Bim360Project(TextBoxTemplate.Text.Trim());

            newproject.ProjectType = Selection.SelectProjectType(currentProject.project_type);
            var roots = new List <Folder>();

            //hier rekursive alle ordner finden
            foreach (var iterfolder in nestedfolders)
            {
                roots.Add(getNestedFolder(iterfolder));
                progress.pgb.Value             = 70;
                progress.ProgressLabel.Content = "Converte to local Project 1/2";
                // ProgressBar "refresh"
                CallDispatch(progress);
            }
            //here hardcoded plan and projectfiles need to be changed in the furtuer if  ACC comes
            if (roots[0].Name == "Plans")
            {
                newproject.Plans        = roots[0];
                newproject.ProjectFiles = roots[1];
            }
            else
            {
                newproject.Plans        = roots[1];
                newproject.ProjectFiles = roots[0];
            }

            AccProjectConfig.ProjectsView.ItemsSource = AccProjectConfig.projects;
            AccProjectConfig.projects.Add(newproject);
            AccProjectConfig.ProjectsView.Items.Refresh();
            progress.Close();
            statusbar.Text = "Import successful";
        }
Ejemplo n.º 9
0
        /// <summary>
        /// runs the upload to the BIM360 environment
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Upload_OnClick(object sender, RoutedEventArgs e)
        {
            var progress = new updates_upload();

            progress.Show();
            // convert string to stream
            byte[]       byteArray = Encoding.UTF8.GetBytes(AccProjectConfig.ExportBim360Projects());
            MemoryStream dataset   = new MemoryStream(byteArray);

            //dataset.Position = 0;


            //Updates
            progress.pgb.Value             = 10;
            progress.ProgressLabel.Content = "Build Connection";
            // ProgressBar "refresh"
            CallDispatch(progress);

            //maybe change
            string[] input = new string[] { "-c", ClientId, "-s", ClientSecret, "-a", BimId,
                                            "-h", AdminMail, "-f", " .\\sample", "-t", ",",
                                            "-z", ",", "-e", "UTF-8", "-d", "yyyy-MM-dd" };


            // Delete previous versions of log.txt
            System.IO.File.Delete("Log/logInfo.txt");
            System.IO.File.Delete("Log/logImportant.txt");

            AppOptions options = AppOptions.Parse(input);

            // options.AccountRegion = "EU";
            options.AdminRole = "Project Manager";

            ProjectWorkflow projectProcess = new ProjectWorkflow(options);

            System.Threading.Thread.Sleep(1000);
            // load all existing projects from the BIM360 environment
            List <BimProject> projects = projectProcess.GetAllProjects();

            FolderWorkflow      folderProcess      = new FolderWorkflow(options);
            ProjectUserWorkflow projectUserProcess = new ProjectUserWorkflow(options);
            AccountWorkflow     accountProcess     = new AccountWorkflow(options);

            //Updates
            progress.pgb.Value             = 25;
            progress.ProgressLabel.Content = "Convert Data from GUI";
            // ProgressBar "refresh"
            CallDispatch(progress);

            // load data from custom CSV file. Filepath was set in constructor of projectProcess by pushing the options instance
            DataTable csvData = new DataTable();

            csvData = ProjectWorkflow.CustomGetDataFromCsv_stream(dataset);

            //Updates
            progress.pgb.Value             = 40;
            progress.ProgressLabel.Content = "Uploading";
            // ProgressBar "refresh"
            CallDispatch(progress);

            List <BimCompany>   companies      = null;
            BimProject          currentProject = null;
            List <HqUser>       projectUsers   = null;
            List <NestedFolder> folders        = null;
            NestedFolder        currentFolder  = null;

            //Uploading
            try
            {
                for (int row = 0; row < csvData.Rows.Count; row++)
                {
                    string projectName = csvData.Rows[row]["project_name"].ToString();

                    // check if the current row defines the start point for another project (project_name column must be set)
                    if (!string.IsNullOrEmpty(projectName))
                    {
                        Util.LogImportant($"\nCurrent project: {projectName}");

                        // check if the requested project name is already present inside BIM360
                        currentProject = projects.Find(x => x.name == projectName);

                        if (currentProject == null)
                        {
                            // create the project
                            projects = projectProcess.CustomCreateProject(csvData, row, projectName, projectProcess);

                            // set the current project variable to the recently created project
                            currentProject = projects.Find(x => x.name == projectName);

                            // verify the initialization of the new project
                            CheckProjectCreated(currentProject, projectName);
                        }



                        // create the folder structure
                        folders = folderProcess.CustomGetFolderStructure(currentProject);

                        // add the companies
                        companies = accountProcess.CustomUpdateCompanies(csvData, row, accountProcess);

                        // create or update the project users
                        projectUsers = projectUserProcess.CustomUpdateProjectUsers(csvData, row, companies,
                                                                                   currentProject, projectUserProcess);

                        //activate all services
                        ServiceWorkflow serviceProcess = new ServiceWorkflow(options);

                        //check what servers needs to be activated
                        if (ServiceTab.CheckBoxservices.IsChecked == true)
                        {
                            #region Add Services
                            var listname = new List <string>();
                            listname.Add("admin");
                            listname.Add("doc_manage");
                            if (ServiceTab.CheckBoxpm.IsChecked == true)
                            {
                                listname.Add("pm");
                            }
                            if (ServiceTab.CheckBoxfng.IsChecked == true)
                            {
                                listname.Add("fng");
                            }
                            if (ServiceTab.CheckBoxcollab.IsChecked == true)
                            {
                                listname.Add("collab");
                            }
                            if (ServiceTab.CheckBoxcost.IsChecked == true)
                            {
                                listname.Add("cost");
                            }
                            if (ServiceTab.CheckBoxgng.IsChecked == true)
                            {
                                listname.Add("gng");
                            }
                            if (ServiceTab.CheckBoxglue.IsChecked == true)
                            {
                                listname.Add("glue");
                            }
                            if (ServiceTab.CheckBoxplan.IsChecked == true)
                            {
                                listname.Add("plan");
                            }
                            if (ServiceTab.CheckBoxfield.IsChecked == true)
                            {
                                listname.Add("field");
                            }
                            if (ServiceTab.CheckBoxassete.IsChecked == true)
                            {
                                listname.Add("assets");
                            }
                            #endregion

                            var serviceList = new List <ServiceActivation>();
                            foreach (var iter in listname)
                            {
                                serviceList.Add(new ServiceActivation());
                                serviceList.Last().service_type = iter;
                                serviceList.Last().project_name = projectName;
                                //test hardcoded Test company name needs to be enter or find out
                                serviceList.Last().company = ServiceTab.Company.Text.Trim();
                                serviceList.Last().email   = AdminMail;
                            }

                            serviceProcess.ActivateServicesProcess(
                                new List <BimProject>(new BimProject[] { currentProject }), serviceList);
                        }
                    }

                    // assign permissions
                    currentFolder = CreateFoldersAndAssignPermissions(csvData, row, projectUsers, folderProcess,
                                                                      folders, currentFolder, currentProject, projectUserProcess);

                    // run the file upload if requested
                    UploadFilesFromFolder(csvData, row, folderProcess, currentFolder, currentProject.id,
                                          options.LocalFoldersPath);
                    //Updates
                    progress.pgb.Value             = 50 + (50 / csvData.Rows.Count * row);
                    progress.ProgressLabel.Content = "Uploading";
                    // ProgressBar "refresh"
                    CallDispatch(progress);
                }
            }
            catch (Exception ex)
            {
                //show the error
                statusbar.Text = ex.Message;
                progress.Close();
                return;
            }

            statusbar.Text = "Upload successful";
            progress.Close();
        }
Ejemplo n.º 10
0
        static void Main(string[] args)
        {
            // Delete previous versions of log.txt
            System.IO.File.Delete("Log/logInfo.txt");
            System.IO.File.Delete("Log/logImportant.txt");

            AppOptions options = AppOptions.Parse(args);
            // options.AccountRegion = "EU";

            ProjectWorkflow     projectProcess     = new ProjectWorkflow(options);
            FolderWorkflow      folderProcess      = new FolderWorkflow(options);
            ProjectUserWorkflow projectUserProcess = new ProjectUserWorkflow(options);
            AccountWorkflow     accountProcess     = new AccountWorkflow(options);

            // load data from custom CSV file. Filepath was set in constructor of projectProcess by pushing the options instance
            DataTable csvData = projectProcess.CustomGetDataFromCsv();

            // load all existing projects from the BIM360 environment
            List <BimProject> projects = projectProcess.GetAllProjects();

            List <BimCompany>   companies      = null;
            BimProject          currentProject = null;
            List <HqUser>       projectUsers   = null;
            List <NestedFolder> folders        = null;
            NestedFolder        currentFolder  = null;

            for (int row = 0; row < csvData.Rows.Count; row++)
            {
                string projectName = csvData.Rows[row]["project_name"].ToString();

                // check if the current row defines the start point for another project (project_name column must be set)
                if (!string.IsNullOrEmpty(projectName))
                {
                    Util.LogImportant($"\nCurrent project: {projectName}");

                    // check if the requested project name is already present inside BIM360
                    currentProject = projects.Find(x => x.name == projectName);

                    if (currentProject == null)
                    {
                        // create the project
                        projects = projectProcess.CustomCreateProject(csvData, row, projectName, projectProcess);

                        // set the current project variable to the recently created project
                        currentProject = projects.Find(x => x.name == projectName);

                        // verify the initialization of the new project
                        CheckProjectCreated(currentProject, projectName);
                    }

                    // create the folder structure
                    folders = folderProcess.CustomGetFolderStructure(currentProject);

                    // add the companies
                    companies = accountProcess.CustomUpdateCompanies(csvData, row, accountProcess);

                    // create or update the project users
                    projectUsers = projectUserProcess.CustomUpdateProjectUsers(csvData, row, companies, currentProject, projectUserProcess);
                }

                // assign permissions
                currentFolder = CreateFoldersAndAssignPermissions(csvData, row, projectUsers, folderProcess, folders, currentFolder, currentProject, projectUserProcess);

                // run the file upload if requested
                UploadFilesFromFolder(csvData, row, folderProcess, currentFolder, currentProject.id, options.LocalFoldersPath);
            }
        }
Ejemplo n.º 11
0
        internal static void AssignPermission(DataTable table, int rowIndex, List <HqUser> projectUsers, FolderWorkflow folderProcess, NestedFolder folder, BimProject project, ProjectUserWorkflow projectUserProcess)
        {
            // Add role permission
            string roleName = table.Rows[rowIndex]["role_permission"].ToString();

            if (!string.IsNullOrEmpty(roleName))
            {
                List <IndustryRole> roles = projectUserProcess.GetRolesForProject(project.name);
                IndustryRole        role  = roles.Find(x => x.name.ToLower() == roleName.ToLower());
                if (role != null)
                {
                    string letterPermission = table.Rows[rowIndex]["permission"].ToString();
                    AssignRolePermissionToFolder(folderProcess, folder, role, letterPermission, project.id);
                }
                else
                {
                    Util.LogImportant($"No role found with name: {roleName}. No permission for this role for folder '{folder.name}' will be assigned. See row number {rowIndex + 2} in the CSV-File.");
                }
            }

            // Add user permission
            string userEmail = table.Rows[rowIndex]["user_email"].ToString();

            if (!string.IsNullOrEmpty(userEmail))
            {
                HqUser existingUser = projectUsers.Find(x => x.email == userEmail);

                // Check if user exists
                if (existingUser != null)
                {
                    string letterPermission = table.Rows[rowIndex]["permission"].ToString();
                    AssignUserPermissionToFolder(folderProcess, folder, existingUser, letterPermission, project.id);
                }
                else
                {
                    Util.LogImportant($"No user found with email: {userEmail}. No permission for this user for folder '{folder.name}' will be assigned. See row number {rowIndex + 2} in the CSV-File.");
                }
            }
        }
Ejemplo n.º 12
0
        internal static NestedFolder CreateFoldersAndAssignPermissions(DataTable table, int rowIndex, List <HqUser> projectUsers, FolderWorkflow folderProcess, List <NestedFolder> folders, NestedFolder currentFolder, BimProject project, ProjectUserWorkflow projectUserProcess)
        {
            bool isUserAtRow = !string.IsNullOrEmpty(table.Rows[rowIndex]["user_email"].ToString());
            bool isRoleAtRow = !string.IsNullOrEmpty(table.Rows[rowIndex]["role_permission"].ToString());

            string folderColumnName = GetFolderColumnName(table, rowIndex);

            // Check if folder at this row
            if (folderColumnName != null)
            {
                string currFolderName = table.Rows[rowIndex][folderColumnName].ToString();

                List <string> currParentFolders = GetParentFolders(table, rowIndex, folderColumnName);

                // If currently subfolder
                if (currParentFolders.Count > 0)
                {
                    NestedFolder currParentFolder = FindParentFolder(currParentFolders, folders);
                    currentFolder = RecursiveFindFolder(currFolderName, currParentFolder.childrenFolders);

                    if (currentFolder == null)
                    {
                        currentFolder = CreateFolder(folderProcess, project.id, currParentFolder, currFolderName, currParentFolders[0]);
                    }
                    else
                    {
                        Util.LogInfo($"Folder in '{currParentFolders[0]}' already exists with name: {currFolderName}.");
                    }

                    if (isUserAtRow || isRoleAtRow)
                    {
                        AssignPermission(table, rowIndex, projectUsers, folderProcess, currentFolder, project, projectUserProcess);
                    }
                }
                // If currently a root folder
                else
                {
                    if (isUserAtRow || isRoleAtRow)
                    {
                        Util.LogInfo($"\nCurrently at root folder '{currFolderName}'...\n");
                        NestedFolder rootFolder = folders.Find(x => x.name.ToLower() == currFolderName.ToLower());
                        AssignPermission(table, rowIndex, projectUsers, folderProcess, rootFolder, project, projectUserProcess);
                        currentFolder = rootFolder;
                    }
                }
            }
            // Asign user to folder if user at row but no folder at row
            else if ((isUserAtRow || isRoleAtRow) && folderColumnName == null)
            {
                if (currentFolder != null)
                {
                    AssignPermission(table, rowIndex, projectUsers, folderProcess, currentFolder, project, projectUserProcess);
                }
            }

            return(currentFolder);
        }
Ejemplo n.º 13
0
        /// <summary>
        /// runs the upload to the BIM360 environment
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Upload_OnClick(object sender, RoutedEventArgs e)
        {
            var progress = new updates_upload();

            progress.Show();
            //main window closing prevention
            try
            {
                // convert string to stream
                byte[]       byteArray = Encoding.UTF8.GetBytes(AccProjectConfig.ExportBim360Projects());
                MemoryStream dataset   = new MemoryStream(byteArray);
                //dataset.Position = 0;


                //Updates
                progress.pgb.Value             = 10;
                progress.ProgressLabel.Content = "Build Connection";
                // ProgressBar "refresh"
                CallDispatch(progress);

                //input for upload
                string[] input = new string[]
                {
                    "-c", ClientId, "-s", ClientSecret, "-a", BimId,
                    "-h", AdminMail, "-f", " .\\sample", "-t", ",",
                    "-z", ",", "-e", "UTF-8", "-d", "yyyy-MM-dd"
                };

                // specify a folder in the %APPDATA% to store the logging files
                var loggingFolder = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

                // Delete previous versions of log.txt
                try
                {
                    System.IO.File.Delete(Path.Combine(loggingFolder, "Bim360Interface/logInfo.txt"));
                    System.IO.File.Delete(Path.Combine(loggingFolder, "Bim360Interface/logInfo_important.txt"));
                }
                catch (Exception exception)
                {
                    Console.WriteLine(exception);
                    // throw;
                }

                AppOptions options = AppOptions.Parse(input);
                // options.AccountRegion = "EU";
                options.AdminRole = "Project Manager";

                ProjectWorkflow projectProcess = new ProjectWorkflow(options);
                System.Threading.Thread.Sleep(1000);
                // load all existing projects from the BIM360 environment
                List <BimProject> projects = projectProcess.GetAllProjects();

                FolderWorkflow      folderProcess      = new FolderWorkflow(options);
                ProjectUserWorkflow projectUserProcess = new ProjectUserWorkflow(options);
                AccountWorkflow     accountProcess     = new AccountWorkflow(options);

                // this is the admin mail to activate the projects
                var adminMail = AdminMail;
                //Get defaut company name
                string defaultcomp;
                try
                {
                    defaultcomp = folderProcess.CustomDefaultCompanyName(adminMail);
                }
                catch (NullReferenceException)
                {
                    defaultcomp = "DefaultCompany";
                }

                //Updates
                progress.pgb.Value             = 25;
                progress.ProgressLabel.Content = "Convert Data from GUI";
                // ProgressBar "refresh"
                CallDispatch(progress);

                // load data from custom CSV file. Filepath was set in constructor of projectProcess by pushing the options instance
                DataTable csvData = new DataTable();
                csvData = ProjectWorkflow.CustomGetDataFromCsv_stream(dataset);

                //Updates
                progress.pgb.Value             = 40;
                progress.ProgressLabel.Content = "Uploading";
                // ProgressBar "refresh"
                CallDispatch(progress);

                List <BimCompany>   companies      = null;
                BimProject          currentProject = null;
                List <HqUser>       projectUsers   = null;
                List <NestedFolder> folders        = null;
                NestedFolder        currentFolder  = null;

                //Uploading
                try
                {
                    for (int row = 0; row < csvData.Rows.Count; row++)
                    {
                        string projectName = csvData.Rows[row]["project_name"].ToString();

                        // check if the current row defines the start point for another project (project_name column must be set)
                        if (!string.IsNullOrEmpty(projectName))
                        {
                            Util.LogImportant($"\nCurrent project: {projectName}");

                            // check if the requested project name is already present inside BIM360
                            currentProject = projects.Find(x => x.name == projectName);

                            if (currentProject == null)
                            {
                                // create the project
                                projects = projectProcess.CustomCreateProject(csvData, row, projectName,
                                                                              projectProcess);

                                // set the current project variable to the recently created project
                                currentProject = projects.Find(x => x.name == projectName);

                                // verify the initialization of the new project
                                CheckProjectCreated(currentProject, projectName);
                            }



                            // create the folder structure
                            folders = folderProcess.CustomGetFolderStructure(currentProject, adminMail);



                            // add the companies
                            companies = accountProcess.CustomUpdateCompanies(csvData, row, accountProcess);

                            // create or update the project users
                            projectUsers = projectUserProcess.CustomUpdateProjectUsers(csvData, row, companies,
                                                                                       currentProject, projectUserProcess);


                            //activate services
                            ServiceWorkflow serviceProcess = new ServiceWorkflow(options);

                            #region Add Services

                            // admin and doc_manage should be always activated
                            var serviceShortcuts = new List <string> {
                                "admin", "doc_manage"
                            };

                            // check which service should be activated in addition to admin and doc_manage
                            if (ServiceTab.CheckBoxProjectManagement.IsChecked == true)
                            {
                                serviceShortcuts.Add("pm");
                            }

                            if (ServiceTab.CheckBoxFieldManagement.IsChecked == true)
                            {
                                serviceShortcuts.Add("fng");
                            }

                            if (ServiceTab.CheckBoxDesignCollab.IsChecked == true)
                            {
                                serviceShortcuts.Add("collab");
                            }

                            if (ServiceTab.CheckBoxCostManagement.IsChecked == true)
                            {
                                serviceShortcuts.Add("cost");
                            }

                            if (ServiceTab.CheckBoxgng.IsChecked == true)
                            {
                                serviceShortcuts.Add("gng");
                            }

                            if (ServiceTab.CheckBoxglue.IsChecked == true)
                            {
                                serviceShortcuts.Add("glue");
                            }

                            if (ServiceTab.CheckBoxPlan.IsChecked == true)
                            {
                                serviceShortcuts.Add("plan");
                            }

                            if (ServiceTab.CheckBoxField.IsChecked == true)
                            {
                                serviceShortcuts.Add("field");
                            }

                            if (ServiceTab.CheckBoxAssets.IsChecked == true)
                            {
                                serviceShortcuts.Add("assets");
                            }

                            #endregion

                            var serviceList = new List <ServiceActivation>();

                            foreach (var serviceShortcut in serviceShortcuts)
                            {
                                //ToDo: this part needs revision

                                serviceList.Add(new ServiceActivation()
                                {
                                    email        = AdminMail,
                                    service_type = serviceShortcut,
                                    project_name = projectName,
                                    company      = defaultcomp
                                });
                            }

                            // take the current project and activate all services that were checked
                            serviceProcess.ActivateServicesProcess(
                                new List <BimProject>(new BimProject[] { currentProject }), serviceList);
                        }

                        // assign permissions
                        currentFolder = CreateFoldersAndAssignPermissions(csvData, row, projectUsers, folderProcess,
                                                                          folders, currentFolder, currentProject, projectUserProcess);

                        // run the file upload if requested
                        UploadFilesFromFolder(csvData, row, folderProcess, currentFolder, currentProject.id,
                                              options.LocalFoldersPath);
                        //Updates
                        progress.pgb.Value             = 50 + (50 / csvData.Rows.Count * row);
                        progress.ProgressLabel.Content = "Uploading";
                        // ProgressBar "refresh"
                        CallDispatch(progress);
                    }
                }
                catch (Exception ex)
                {
                    //show the error
                    statusbar.Text = ex.Message;
                    progress.Close();
                    return;
                }

                statusbar.Text = "Upload successful";
                progress.Close();
            }
            catch (Exception ex)
            {
                this.statusbar.Text = "Error on upload:" + ex.Message;
                progress.Close();
            }
        }