logo

[ELMA3] Создание проекта в сценарии

В данном примере рассматривается создание проекта и задач по проекту при помощи сценария.

Пример сценария с использованием PublicAPI

Примечание
Актуальная документация по PublicAPI доступна по ссылке

Контекстные переменные:

  • ProjectName – название проекта, тип – Строка;
  • ProjectManager – менеджер проекта, тип – объект Пользователь;
  • ProjectTaskExecutor – исполнитель задачи, тип – объект Пользователь;
  • ProjectStartDate – дата начала проекта, тип – Дата/Время;
  • ProjectEndDate – дата окончания проекта, тип – Дата/Время.

Для работы сценария требуется подключить следующие сборки:

using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Projects.Models;

Текст сценария:

// Получаем данные из контекста
String projectName = context.ProjectName; // Название проекта
User projectManager = context.ProjectManager; // Менеджер проекта
User projectTaskExecutor = context.ProjectTaskExecutor; // Исполнитель задач
DateTime projectStartDate = context.ProjectStartDate; // Дата старта проекта
DateTime projectEndDate = context.ProjectEndDate; // Дата завершения проекта
// Создаем проект с использованием соответствующего PublicApi.
// В данном случае "UserSimpleProject" - api для работы с типом проекта "SimpleProject".
// Название класса необходимого проекта можно посмотреть на карточке типа проекта в блоке "Структура данных"
var newProject = PublicAPI.Projects.Types.UserSimpleProject
    .Create(projectName, projectManager, projectStartDate, projectEndDate);
// Проект создан, теперь необходимо найти последнюю версию плана проекта
long latestDraftProjectPlanVersion = PublicAPI.Projects.Project
    .GetDraftProjectPlans(newProject)
    .Max(i1 => i1.Number);
// По найденной версии черновика получаем сам черновик плана
ProjectPlan latestDraftProjectPlan = PublicAPI.Projects.Project
    .GetDraftProjectPlans(newProject)
    .SingleOrDefault(i1 => i1.Number == latestDraftProjectPlanVersion);

// Если черновик плана был найден и мы сделали все правильно, можно перейти к редактированию задач в проекте 
if (latestDraftProjectPlan != null)
{
    // В качестве примера будет создана задача "Задача из сценария" и контрольная точка "Контрольная точка из сценария"
    // Добавление задачи в план проекта
    PublicAPI.Projects.Tasks.GetProjectTaskBuilder(newProject) // Конструктор проектной задачи
        .Executor(projectTaskExecutor) // Указываем исполнителя
        .StartDate(projectStartDate) // Дата начала задачи (В данном случае равна началу проекта)
        .EndDate(projectEndDate) // Дата окончания задачи (В данном случае равна окончанию проекта)
        .Subject("Задача из сценария") // Указываем название задачи
        .AddToPlan(latestDraftProjectPlan); // Добавляем задачу в план
    // Добавление контрольной точки в план проекта
    PublicAPI.Projects.Tasks.GetMilestoneBuilder(newProject) // Конструктор контрольной точки
        .Executor(projectTaskExecutor) // Указываем исполнителя
        // Дата начала контрольной точки (В данном случае равна середине проекта)
        .StartDate(projectStartDate.AddDays((projectEndDate - projectStartDate).Days/2)) 
        .Subject("Контрольная точка из сценария") // Указываем название контрольной точки
        .AddToPlan(latestDraftProjectPlan); // Добавляем контрольную точку в план

    // Публикуем план проекта, исполнители задач будут автоматически добавлены в участники проекта
    PublicAPI.Projects.ProjectPlan.PublishPlan(latestDraftProjectPlan);
}

Рассмотрим пример использования данного сценария. Для этого смоделируем следующий процесс (рис. 1):

Рис. 1. Пример графической модели процесса

В задаче "Заполнить данные по проекту" требуется указать значения контекстных переменных, необходимых для работы сценария (рис. 2):

Рис. 2. Страница задачи "Заполнить данные по проекту"

В результате работы сценария будет создан следующий проект (рис. 3-5):

Рис. 3. Пример созданного в сценарии проекта. Страница проекта

Рис. 4. Пример созданного в сценарии проекта. План проекта

Рис. 5. Пример созданного в сценарии проекта. План проекта. Вкладка "Версии"

Примеры сценариев без использования PublicAPI

Ниже приведено два сценария:

  1. Для версий системы ELMA 3.5.х и ниже.
  2. Для версий системы ELMA 3.6.х и выше.

Сценарий для версий системы ELMA 3.5.х и ниже

В сценарии должны быть объявлены следующие пространства имен:

using EleWise.ELMA.Projects.Models;
using EleWise.ELMA.Projects.Managers;
using EleWise.ELMA.Tasks.Models;
using EleWise.ELMA.Projects;
Текст сценария:
 var projectTemplateId=1; //идентификатор шаблона проекта
var projectTemplate = ProjectTemplateManager.Instance.LoadWithElevatedPrivilegies(projectTemplateId);
    var project = ProjectManager.Instance.Create(projectTemplate);

    project.ShowTaskBeforeDays = null;

    // Если нужно автоформирование папки проекта, то нужно обнулить поле Folder проекта, иначе задать нужную папку
    project.Folder = null;
project.Name = context.NazvanieProekta;
project.CreationAuthor=context.Author;
project.Manager=context.Meneger;
project.StartDate=DateTime.Now;
project.FinishDate=context.DataOkonchaniya;
    ProjectManager.Instance.SaveNew(project, projectTemplate);

    // Если нужно автоформирование папки проекта!
    ProjectManager.Instance.CopyTemplateFolders(projectTemplate, project);

    // Если нужно опубликовать
    ProjectManager.Instance.Publish(project);

    context.Proekt = (Project)project; //записываем в контекстную переменную типа Объект Проект
    
//Создание задачи проекта
var projectTask= ProjectTaskManager.Instance.Create(project, null);
projectTask.Subject="Тема задачи";
projectTask.Executor=context.Ispolnitelj; //устанавливаем исполнителя 
projectTask.StartDate=context.DataSozdaniya;
projectTask.EndDate=context.DataOkonchaniya;
projectTask.Save(); 

Сценарий для версий системы ELMA 3.13.х и выше

Пространства имен:
using EleWise.ELMA.Model.Services;
using EleWise.ELMA.Projects.Managers;
using EleWise.ELMA.Projects.Models;
using EleWise.ELMA.Security.Models;
using EleWise.ELMA.Security.Managers;
using EleWise.ELMA.Projects.Enums;
Текст сценария:
//Создание проекта типа "Проект"
var project = InterfaceActivator.Create<ProjectWork>();
project.StartDate = DateTime.Today; //Дата начала проекта
project.FinishDate = DateTime.Today; //Дата Завершения проекта
project.Manager = (User)UserManager.Instance.LoadByLogin("admin"); //Менеджер проекта
project.Name = "Название проекта"; //Название проекта
ProjectManager.Instance.SaveNew(project, true);

//Поиск плана проекта со статусом версии "Черновик"
var filter = InterfaceActivator.Create<ProjectPlanFilter>();
filter.Id = project.Id;
filter.Status = ProjectPlanVersionStatus.Draft;
var projectplan = EntityManager<ProjectPlan>.Instance.Find(filter, null).LastOrDefault();
 
//Создание исполнителя проектной задачи типа Пользователь
var executor = InterfaceActivator.Create<ProjectTaskExecutor>();
executor.Type = ProjectTaskExecutorType.User; //Тип Пользователь
executor.User = (User)UserManager.Instance.LoadByLogin("admin");
executor.Save();
 
//Создание простой проектной задачи
var PrjTask = InterfaceActivator.Create<ProjectPlanItem>();
PrjTask.ItemType = ProjectPlanItemType.ProjectTask; //Тип задачи - проектная задача
PrjTask.StartDate = DateTime.Today; //Дата начала - сегодня
PrjTask.EndDate = DateTime.Today; //Дата завершения - сегодня
PrjTask.CreationAuthor = (User)UserManager.Instance.LoadByLogin("admin"); //Автор задачи
PrjTask.Executor = executor; //Исполнитель - Тип (Пользователь), Пользователь
PrjTask.Subject = "Проектная задача"; //Название задачи
PrjTask.ProjectPlan = projectplan; //План проекта

//Добавление созданной задачи в план (версии "Черновик")
projectplan.Items.Add(PrjTask); // Добавление задачи в план
projectplan.Save(); // Сохранение плана
 
//Создание контрольной точки
var Milestone = InterfaceActivator.Create<ProjectPlanItem>();
Milestone.ItemType = ProjectPlanItemType.Milestone; //Тип задачи - контрольная точка
Milestone.StartDate = DateTime.Today; //Дата начала - сегодня
Milestone.EndDate = DateTime.Today; //Дата завершения - сегодня
Milestone.CreationAuthor = (User)UserManager.Instance.LoadByLogin("admin"); //Автор задачи
Milestone.Executor =  executor; //Исполнитель - Тип (Пользователь), Пользователь
Milestone.Subject = "Контрольная точка"; //Название задачи
Milestone.ProjectPlan = projectplan; //План проекта