Добрый день.
Занимаюсь внедрением системы управления бизнес-процессами ELMA BPM.
Система с открытым кодом и позволяет расширять функционал за счет использования сценариев на языке C#.
Заинтересован в долгосрочном сотрудничества по написанию сценариев на C#, написанию java скриптов, доработке форм отображения на Razor, а также задач по интеграции системы с другими приложениями и системами.
Очень важно, чтобы коммуникация осуществлялась не только через сообщения на freelancehunt, но и голосом по скайпу / телефону, а также готовность выполнять работу с почасовой оплатой.
На сегодняшний день необходимо решить маленькую задачу с записью данных, то есть доработать сценарий на C#.
Есть "Проект" - объект системы в котором есть блок с вложенным блоком (рис. 1), на форме это выглядит как таблица в таблице ("Период" в который добавляются Эксперты - рис. 1.1.)
Есть некий бизнес-процесс, в котором присутствует переменные "Период" и "Эксперт", значения которых необходимо записать в выбранный проект (рис. 2).
То есть, должно быть вот так:
1. Берем указанный проект, если в таблице "ExpertsCostsTop1" нет записей, то создает запись и добавляем указанный период.
2. Если есть записи, проходим циклом по имеющимся периодам, если не находим указанный период, создаем его и добавляем в него Эксперта.
3. Если есть записи, то проходим циклом по периодам, находим период совпадающий с указанным и записываем в него эксперта.
Текущий сценарий выполняет только 1 и 3 условия, а на втором, если период существует, то добавляет его повторно (рис. 3).
Надеюсь что все описал доступно. Готов подробно показать посредством демонстрации экрана по скайпу и дать удаленный доступ к серверу с дизайнером и компилятору c#. Также, система имеет встроенный SharpDevelop v. 4.4.1.
Текст сценария:
public virtual void Calculated (Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
{
foreach (var pr in context.TimeSheet)
{
// 1 Если блок пустой, добавляем текущий период
if (pr.Project2.ExpertsCostsTop1.Count() == 0)
{
var pp = InterfaceActivator.Create<ProjectTest_ExpertsCostsTop1>();
pp.Period = context.WorkPeriod;
pr.Project2.ExpertsCostsTop1.Add(pp);
pr.Project2.Save();
}
// Обновляем коллекцию командой HashSet
var tempList = new HashSet<ProjectTest_ExpertsCostsTop1>(pr.Project2.ExpertsCostsTop1);
foreach (var ad in tempList)
{
// 2 Если в блоке период отсутствует, добавляем сначала период и после записываем в него эксперта
if (ad.Period != context.WorkPeriod)
{
// Добавляем период
var dd = InterfaceActivator.Create<ProjectTest_ExpertsCostsTop1>();
dd.Period = context.WorkPeriod;
//Добавляем эксперта
var dd2 = InterfaceActivator.Create<ProjectTest_ExpertsCostsTop1_Experts>();
dd2.Expert = context.Employee;
dd2.Amount = pr.Total * 100;
dd2.Days = pr.Total;
dd.Experts.Add(dd2);
dd.Total = ad.Experts.Sum(r => r.Amount);
pr.Project2.ExpertsCostsTop1.Add(dd);
pr.Project2.Save();
}
// 3 Если период существует, добавляем в него эксперта
else
{
var rr = InterfaceActivator.Create<ProjectTest_ExpertsCostsTop1_Experts>();
rr.Expert = context.Employee;
rr.Amount = pr.Total * 100;
rr.Days = pr.Total;
ad.Experts.Add(rr);
ad.Total = ad.Experts.Sum(r => r.Amount);
pr.Project2.Save();
}
}
}
}