public static async Task <ResultViewModel> SaveAndSendNewMessage(SendMessageViewModel model, ServiceGateWayClient gatewayITask, TaskUser user, EnvironmentViewModel environment, List <JoinFileViewModel> newFiles)
        {
            var newFilesTojoin     = MapClJoinFileToJoinFileViewModel.Map(newFiles);
            var existingFilesToAdd = await Task.Run(() => gatewayITask.GetJoinFilesByPermId(model.ExistingFilesToJoin.ToArray()));

            var files = newFilesTojoin.ToList();

            foreach (var existing in existingFilesToAdd)
            {
                var f = existing;
                f.PermIdFileAlreadyArchived = f.PermId;
                files.Add(f);
            }

            var cltaskdocument = new ClTaskDocument
            {
                Task = new ClTask
                {
                    TechnicalId    = model.TaskId,
                    Description    = model.TaskDescription,
                    EmployerNumber = model.EmployerNumber,
                    WorkerNumber   = model.WorkerNumber
                }
            };

            var result = new ResultViewModel
            {
                NoError = true
            };
            //bool isOk = true;
            var task = await Task.Run(() => gatewayITask.SearchDocumentTask(model.TaskId, user.Language, true, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));

            task.CurrentStatus = model.Status;
            if (task.CurrentStatus != 4)
            {
                task.Task.EffectiveEndDate = DateTime.MinValue;
            }
            switch (model.TypeOfMessage)
            {
            case 1:     //Mail provenant de l'extérieur --> on n'enverra pas de mail de ce type
                break;

            case 2:     // commentaire
                Log.Write("SaveAndSendNewMessage", "Conversation", model.TaskId.ToString(), 3, "debut SaveComment");
                result.NoError = await SaveComment(gatewayITask, user, cltaskdocument, files, model);

                Log.Write("SaveAndSendNewMessage", "Conversation", model.TaskId.ToString(), 3, "fin SaveComment");
                if (result.NoError)
                {
                    result.NoError = await Task.Run(() => gatewayITask.UpdateTaskDocument(task, user.Id, user.CurrentEntityNumber, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));
                }
                break;

            case 3:     //Mail interne
                result.NoError = await SaveInternMessage(gatewayITask, user, cltaskdocument, files, model);

                if (model.AssignToUser)
                {
                    task.Context = int.Parse(model.InternRecipientId);
                }
                if (result.NoError)
                {
                    result.NoError = await Task.Run(() => gatewayITask.UpdateTaskDocument(task, user.Id, user.CurrentEntityNumber, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));
                }
                break;

            case 8:
            case 10:     //Mail destiné à l'extérieur
                var filesForEmail = GetFilesForEmail(existingFilesToAdd, newFilesTojoin);
                result = await SaveExternMessage(gatewayITask, user, cltaskdocument, files, filesForEmail, model);

                if (result.NoError && !model.IsDirectEmail)
                {
                    result.NoError = await Task.Run(() => gatewayITask.UpdateTaskDocument(task, user.Id, user.CurrentEntityNumber, MapClRessourcesToRessourcesViewModel.Map(user.RessourcesListWithAccess).ToArray(), long.Parse(user.Id)));
                }
                break;
            }
            return(result);
        }