Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using EleWise.ELMA.API;
- using EleWise.ELMA.Model.Common;
- using EleWise.ELMA.Model.Managers;
- using EleWise.ELMA.Model.Entities.ProcessContext;
- using Context = EleWise.ELMA.Model.Entities.ProcessContext.P_ObnovlenieProektov;
- using Newtonsoft.Json;
- using EleWise.ELMA.Security.Managers;
- using EleWise.ELMA.CRM.Managers;
- using EleWise.ELMA.Model.Services;
- using EleWise.ELMA.CRM.Models;
- using EleWise.ELMA.ConfigurationModel;
- using System.Text.RegularExpressions;
- using EleWise.ELMA.Security.Models;
- using EleWise.ELMA.Projects;
- using SendOpportunity1C;
- using EleWise.ELMA.Workflow.Managers;
- using EleWise.ELMA.Workflow.Models;
- namespace EleWise.ELMA.Model.Scripts
- {
- /// <summary>
- /// Модуль сценариев процесса "Обновление проектов"
- /// </summary>
- /// <example>
- /// <![CDATA[
- /// >>>>>>>>>>>>>>>ВАЖНАЯ ИНФОРМАЦИЯ!!!<<<<<<<<<<<<<<<
- /// Данный редактор создан для работы с PublicAPI.
- /// PublicAPI предназначен для разработки сценариев ELMA.
- /// Например, с помощью PublicAPI можно добавить комментарий к документу:
- /// //Загружаем документ
- /// var doc = PublicAPI.Docflow.Document.Load(56);
- /// //Добавляем комментарий
- /// PublicAPI.Docflow.Document.AddComment(doc, "тут ваш комментарий");
- ///
- /// Более подробно про PublicAPI вы можете узнать тут: http://www.elma-bpm.ru/kb/article-642ApiRoot.html
- ///
- /// Если же вам нужна более серьёзная разработка, выходящая за рамки PublicAPI, используйте
- /// сторонние редакторы кода, такие как SharpDevelop и VisualStudio.
- /// Информацию по запуску кода в стороннем редакторе вы можете найти тут:
- /// http://www.elma-bpm.ru/kb/article-837.html
- /// ]]>
- /// </example>
- public partial class P_ObnovlenieProektov_Scripts : EleWise.ELMA.Workflow.Scripts.ProcessScriptBase<Context>
- {
- public UserManager UserManager {
- get {
- return UserManager.Instance;
- }
- }
- public IEntityManager<ITEL_PricePolicies, long> PricePoliciesManager {
- get {
- return EntityManager<ITEL_PricePolicies, long>.Instance;
- }
- }
- public ContractorManager ContractorManager {
- get {
- return ContractorManager.Instance;
- }
- }
- public IEntityManager<ITEL_Probability, long> ProbabilityManager {
- get {
- return EntityManager<ITEL_Probability, long>.Instance;
- }
- }
- public SaleManager SaleManager {
- get {
- return SaleManager.Instance;
- }
- }
- public IEntityManager<ITEL_ProductType, long> ProductTypeManager {
- get {
- return EntityManager<ITEL_ProductType, long>.Instance;
- }
- }
- public IEntityManager<ITEL_Project, long> ProjectManager {
- get {
- return EntityManager<ITEL_Project, long>.Instance;
- }
- }
- /// <summary>
- /// Парсим данные из JSON и записываем их в блок
- /// </summary>
- /// <param name="context">Контекст процесса</param>
- public virtual void ParseData (Context context)
- {
- context.Iterator = 0;
- var projects = JsonConvert.DeserializeObject<List<Project>> (context.IncomeJSON);
- foreach (var project in projects) {
- var contextProject = InterfaceActivator.Create<P_ObnovlenieProektov_Project> ();
- contextProject.Name = project.Name;
- contextProject.Manager = project.Manager;
- contextProject.Contractor = project.Contractor;
- contextProject.GeneralContractor = project.GeneralContractor;
- contextProject.ProjectInsitute = project.ProjectInsitute;
- contextProject.Object = project.Object;
- contextProject.Description = project.Description;
- contextProject.ImplementationProbability = project.ImplementationProbability;
- contextProject.IdELMA = project.IdELMA;
- contextProject.LinkELMA = project.LinkELMA;
- contextProject.Link_1C = project.Link_1C;
- contextProject.Opportunity = project.Opportunity;
- contextProject.Name_1C = project.Name_1C;
- foreach (var solution in project.Solution) {
- var contextSolution = InterfaceActivator.Create<Solutions> ();
- contextSolution.ProductType = solution.ProductType;
- contextSolution.Quantity = solution.Quantity;
- contextSolution.Charge = solution.Charge;
- contextSolution.SummaryCostPrice = solution.SummaryCostPrice;
- contextSolution.SupplyDate = solution.SupplyDate;
- contextProject.Solution.Add (contextSolution);
- }
- context.Project.Add (contextProject);
- }
- }
- /// <summary>
- /// SendAndCalculateOpportunity
- /// </summary>
- /// <param name="context">Контекст процесса</param>
- public virtual void OpportunityProcessing (Context context)
- {
- var opportunitySender = new SendOpportunity ();
- foreach (var sale in context.Sales) {
- CalculateOpportunityBudget (sale);
- var result = opportunitySender.Execute (sale, context.WorkflowInstance);
- //если удачно, записываем Guid1с возможности
- if (result.IsSucces) {
- sale.TEL_Guid1C = result.Message;
- }
- sale.Save ();
- }
- context.Sales.Clear ();
- }
- /// <summary>
- /// Обрабатывает 10 проектов из блока:
- /// Проекты которые могут быть отправлены - сохраняем и удаляем из блока,
- /// Проекты, которые не могут быть отправлены остаются в блоке
- /// </summary>
- /// <param name="context">Контекст процесса</param>
- public virtual void ProjectProcessing (Context context)
- {
- var operationCount = 0;
- for (int i = (int)context.Iterator; i < context.Iterator + 10 && i < context.Project.Count; i++) {
- var project = context.Project.ElementAt (i);
- if (operationCount >= 10) {
- break;
- }
- #region Обязательные условия
- var manager = FindUser (project.Manager);
- var contractor = FindContractor (project.Contractor);
- if (manager == null) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Менеджер проекта с логином '{0}' не найден", project.Manager),
- ProjectName = project.Name_1C
- });
- project.Manager = "";
- }
- if (contractor == null) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Контрагент '{0}' не найден", project.Contractor),
- ProjectName = project.Name_1C
- });
- project.Contractor = "";
- }
- //заполняем TCC, если оно есть, иначе не создаем проект
- if (string.IsNullOrEmpty (project.Name_1C)) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Name_1C Пустой"),
- ProjectName = project.Name_1C
- });
- }
- if (string.IsNullOrEmpty (project.Link_1C)) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Link_1C Пустой"),
- ProjectName = project.Name_1C
- });
- }
- #endregion
- //если одно из обязательных полей не заполнено, то переходим к следующему процессу
- if (contractor == null || manager == null || string.IsNullOrEmpty (project.Link_1C) || string.IsNullOrEmpty (project.Name_1C)) {
- context.Project.Remove (project);
- context.Iterator++;
- operationCount++;
- continue;
- }
- //иначе
- else {
- #region возможность и TCC
- if (!FillContextTCC (contractor, context)) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Контрагент '{0}' не содержит TCC", contractor.Name),
- ProjectName = project.Name_1C
- });
- }
- var sale = FindOpportunityOrNull (project.Opportunity);
- if (sale == null && context.TCC != null) {
- sale = PublicAPI.CRM.Sale.Create ();
- sale = FillOpportunityOrNull (sale, context, project);
- //выдаем права на Возможность
- AddPermisson(sale);
- }
- #endregion
- // если невозможно создать возможность на основе текущих данных переходим к следующему процессу
- if (context.TCC == null || sale == null) {
- context.Project.Remove (project);
- context.Iterator++;
- operationCount++;
- continue;
- }
- else {
- var newProject = FindProjectOrNull (project.Name_1C);
- if (newProject == null) {
- newProject = CreateProject (project, context);
- PublicAPI.Projects.Project.PublishProject (newProject);
- FillProject(newProject, project, context);
- newProject.TEL_Opportunity = sale;
- //Создаем две записи в ЗЦ по вновь созданному проекту.
- //Ищем контрагента в базе
- var isPurchaseCenterCreated = false;
- var ProjectInsitute = FindContractor (project.ProjectInsitute);
- if (ProjectInsitute == null) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Запись в ЗЦ не создаем. Контрагент '{0}' не найден.", project.ProjectInsitute),
- ProjectName = project.Name_1C
- });
- }
- else
- {
- //Создаем запись в ЗЦ для Проектировщика
- isPurchaseCenterCreated = TryCreatePurchaseCenter(newProject, ProjectInsitute, "Проектировщик");
- }
- //Ищем контрагента в базе
- var GeneralContractor = FindContractor (project.GeneralContractor);
- if (GeneralContractor == null) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Запись в ЗЦ не создаем. Контрагент '{0}' не найден.", project.GeneralContractor),
- ProjectName = project.Name_1C
- });
- }
- else
- {
- //Создаем запись в ЗЦ для Проектировщика
- isPurchaseCenterCreated = TryCreatePurchaseCenter(newProject, GeneralContractor, "Подрядчик");
- }
- //если создали закупочный центр добавляем задачу на SSD
- if (isPurchaseCenterCreated)
- {
- CreateTaskToFillPurchaseCenter(newProject);
- }
- }
- else
- {
- FillProject(newProject, project, context);
- newProject.TEL_Opportunity = sale;
- }
- context.Project.Remove (project);
- //сохраняем возможность и проект
- sale.Save ();
- newProject.Save ();
- //обновление сущности
- sale.GetId ();
- newProject.GetId ();
- //добавляем сейл в список, который будет обрабатываться дальше по процессу
- context.Sales.Add (sale);
- context.Projects.Add (newProject);
- i--;
- operationCount++;
- }
- }
- }
- }
- /// <summary>
- /// Добавление прав на Возможность
- /// </summary>
- /// <param name="productName">значение по которому осуществляется фильтрация</param>
- /// <returns></returns>
- private void AddPermisson (Sale sale)
- {
- var usergroup = PublicAPI.Portal.Security.UserGroup.Find ("Name like 'Видимость всех сделок'").FirstOrDefault ();
- if (usergroup != null) {
- OpportunityFunction.AddPermission.Execute(sale, usergroup, true, false, false, false, false);
- }
- var usergroup2 = PublicAPI.Portal.Security.UserGroup.Find ("Name like 'Просмотр всех возможностей " + sale.TEL_TCC.Code.Trim () + "'").FirstOrDefault ();
- if (usergroup2 != null) {
- OpportunityFunction.AddPermission.Execute(sale, usergroup2, true, false, false, false, false);
- }
- var usergroup3 = PublicAPI.Portal.Security.UserGroup.Find ("Name like 'Полные права на возможности " + sale.TEL_TCC.Code.Trim () + "'").FirstOrDefault ();
- if (usergroup3 != null) {
- OpportunityFunction.AddPermission.Execute(sale, usergroup3, false, false, false, false, true);
- }
- if(sale.Responsible != null){
- OpportunityFunction.AddPermission.Execute(sale, sale.Responsible, true, false, true, false, false);
- }
- if(sale.TEL_SSD != null){
- OpportunityFunction.AddPermission.Execute(sale, sale.TEL_SSD, true, false, true, false, false);
- }
- string posname = "TER_P03_SSD_" + sale.TEL_Segment.Code;
- var position = PublicAPI.Portal.Security.OrganizationItem.Find ("Name like '%" + posname + "%'").FirstOrDefault ();
- if (position != null) {
- OpportunityFunction.AddPermission.Execute(sale, position, true, false, true, false, false);
- }
- string posname2 = "TER-C-" + sale.TEL_TCC.ShortCode + "_SSD_" + sale.TEL_Segment.Code;
- var position2 = PublicAPI.Portal.Security.OrganizationItem.Find ("Name like '%" + posname2 + "%'").FirstOrDefault ();
- if (position2 != null) {
- OpportunityFunction.AddPermission.Execute(sale, position2, false, false, false, false, true);
- }
- }
- #region Поиск сущностей в базе
- /// <summary>
- /// Поиск PricePolicies по ProductType.Name
- /// </summary>
- /// <param name="productName">значение по которому осуществляется фильтрация</param>
- /// <returns></returns>
- private TEL_PricePolicies FindProductTypeOrNull (string productName)
- {
- var pricePolicies = PricePoliciesManager.Find (p => p.ProductType.Name == productName, FetchOptions.First).FirstOrDefault () as TEL_PricePolicies;
- return pricePolicies;
- }
- /// <summary>
- /// Поиск пользователя по имени
- /// </summary>
- /// <param name="name"> значение по которому осуществляется фильтрация</param>
- /// <returns></returns>
- private User FindUser (string name)
- {
- var pattern = @"\w+";
- var match = Regex.Match (name, pattern, RegexOptions.RightToLeft);
- return UserManager.LoadByLogin (match.Value) as User;
- }
- /// <summary>
- /// Поиск проекта по Name1c
- /// </summary>
- /// <param name="name1c"> значение по которому осуществляется фильтрация</param>
- /// <returns></returns>
- private TEL_Project FindProjectOrNull (string name1c)
- {
- var filter = new Filter ();
- filter.Query = String.Format ("Name1c = '{0}'", name1c);
- var projectCollection = ProjectManager.Find (filter, FetchOptions.First);
- if (projectCollection.Count == 0) {
- return null;
- }
- else {
- return projectCollection.FirstOrDefault () as TEL_Project;
- }
- }
- /// <summary>
- /// Поиск контрагента по id1c
- /// </summary>
- /// <param name="id1c">значение по которому осуществляется фильтрация</param>
- /// <returns></returns>
- private Contractor FindContractor (string id1c)
- {
- var filter = InterfaceActivator.Create<IContractorFilter> ();
- filter.Query = String.Format ("TEL_Id1C = '{0}'", id1c);
- return ContractorManager.Find (filter, FetchOptions.First).FirstOrDefault () as Contractor;
- }
- /// <summary>
- /// Поиск Probability по числу double, которое равно % вероятности реализации проекта
- /// </summary>
- /// <param name="doubleProbability">значение по которому осуществляется фильтрация</param>
- /// <returns></returns>
- private TEL_Probability FindProbability (string doubleProbability)
- {
- var probability = double.Parse (doubleProbability.Replace (".", ","));
- return ProbabilityManager.Find (p => p.Double == probability, FetchOptions.First).FirstOrDefault () as TEL_Probability;
- }
- /// <summary>
- /// Поиск возвомжности по TEL_Guid1c
- /// </summary>
- /// <param name="opportunity">значение по которому осуществляется фильтрация</param>
- /// <returns></returns>
- private Sale FindOpportunityOrNull (string opportunity)
- {
- if (opportunity == "00000000-0000-0000-0000-000000000000") {
- return null;
- }
- var opportunityFilter = InterfaceActivator.Create<ISaleFilter> ();
- opportunityFilter.Query = System.String.Format (" TEL_Guid1C='{0}' ", opportunity);
- return SaleManager.Find (opportunityFilter, FetchOptions.First).FirstOrDefault () as Sale;
- }
- #endregion
- #region расчет\заполнение
- /// <summary>
- /// Расчет бюджета возможности
- /// </summary>
- /// <param name="sale"></param>
- private void CalculateOpportunityBudget (Sale sale)
- {
- double? budget = 0;
- var filter = new Filter ();
- filter.Query = string.Format ("TEL_Opportunity = {0} AND ProjectLifeCycleStage in (Name <> 'Отменен')", sale.Id);
- var projects = ProjectManager.Find (filter, FetchOptions.All);
- budget = projects.Sum (p => p.TEL_ProfitTotal);
- sale.TEL_Budget = budget.ToString ();
- }
- /// <summary>
- /// Заполняем TCC по Контрагенту
- /// </summary>
- /// <param name="contractor"></param>
- /// <param name="context"></param>
- private bool FillContextTCC (Contractor contractor, Context context)
- {
- context.TCC = null;
- if (contractor == null) {
- return false;
- }
- if (contractor.Region == null) {
- return false;
- }
- if (contractor.Region.TEL_TCC == null) {
- return false;
- }
- context.TCC = contractor.Region.TEL_TCC;
- return true;
- }
- /// <summary>
- /// заполнение возможности
- /// </summary>
- /// <param name="sale">созданная возможность</param>
- /// <param name="context">контекст</param>
- /// <param name="project">проект из контекста</param>
- /// <returns></returns>
- private Sale FillOpportunityOrNull (Sale sale, Context context, P_ObnovlenieProektov_Project project)
- {
- var contractor = FindContractor (project.Contractor);
- var author = FindUser ("admin");
- var responsible = FindUser (project.Manager);
- if (contractor.TEL_Segment == null) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("У контрагента '{0}' не заполнено поле 'сегмент'", contractor.Name),
- ProjectName = project.Name_1C
- });
- return null;
- }
- if (contractor.TEL_Segment == null) {
- return null;
- }
- var SSD = GetSSDbySegment.GetSSDbySegment.GetSSD (context.TCC, contractor.TEL_Segment);
- if (SSD == null) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- Error = SR.T ("Нет пользователя на должности SSD"),
- ProjectName = project.Name_1C
- });
- return null;
- }
- sale.TEL_SSD = SSD;
- sale.Name = OpportunityNumberGeneration (context);
- sale.Contractor = contractor;
- sale.Author = author;
- sale.Responsible = responsible;
- sale.TEL_TCC = context.TCC;
- sale.TEL_Segment = contractor.TEL_Segment;
- sale.SaleStatus = PublicAPI.Enums.CRM.Enums.SaleStatus.Active;
- sale.Description = project.Description;
- sale.TEL_Theme = project.Object;
- sale.InheritPermissions = false;
- sale.SaleFunnel = PublicAPI.CRM.Objects.SaleFunnel.Load (1L);
- sale.TEL_Region = contractor.Region;
- sale.TEL_InfoSource = "первичная синхронизация из 1С";
- sale.SaleStage = FindSaleStage ("Активна");
- return sale;
- }
- /// <summary>
- /// Поиск стадии сделки
- /// </summary>
- /// <param name="stageName"></param>
- /// <returns></returns>
- private SaleStage FindSaleStage (string stageName)
- {
- return EntityManager<ISaleStage, long>.Instance.Find (s => s.Name == stageName, FetchOptions.First).FirstOrDefault () as SaleStage;
- }
- /// <summary>
- /// Заполнение проекта из контекста
- /// </summary>
- /// <param name="newProject"></param>
- /// <param name="project"></param>
- private void FillProject (TEL_Project newProject, P_ObnovlenieProektov_Project project, Context context)
- {
- var projectManager = FindUser (project.Manager);
- var contractor = FindContractor (project.Contractor);
- // var generalContractor = FindContractor (project.GeneralContractor);
- var probability = FindProbability (project.ImplementationProbability);
- var solutions = CreateSolutions (project, context);
- newProject.TEL_Contractor = contractor;
- // newProject.Contractor = generalContractor;
- newProject.TEL_Probability = probability;
- newProject.Name1c = project.Name_1C;
- newProject.TEL_Object = project.Object;
- newProject.TEL_ContractorsTrouble = project.Description;
- newProject.Guid1C = project.Link_1C;
- newProject.TEL_MarginTotal = project.TEL_MarginTotal;
- newProject.TEL_ProfitTotal = project.TEL_ProfitTotal;
- newProject.TEL_Segment = contractor.TEL_Segment;
- newProject.TEL_Supply = true;
- newProject.TEL_Solutions.Clear ();
- newProject.TEL_Solutions.AddAll (solutions);
- CalculateTotalProfit (newProject);
- TeamAssign (newProject, projectManager);
- newProject.TEL_Budget = newProject.TEL_ProfitTotal.ToString ();
- //Проверяем на НУЛЛ, т.к. заполняем только при первичном создании. При обновлениях не трогаем, т.к. может быть изменен уже менеджером/ССД при работе.
- if(newProject.TEL_ProjectType == null){
- var type = EntityManager<TEL_ProjectType>.Instance.Find(c => c.Name == "Single").FirstOrDefault();
- if(type != null){
- newProject.TEL_ProjectType = type;
- }
- }
- }
- /// <summary>
- /// Добавляем команду на проект
- /// </summary>
- /// <param name="project"></param>
- /// <param name="user"></param>
- private void TeamAssign (TEL_Project project, User user)
- {
- //добавляем менеджера проекта
- if (user != null) {
- var projectRole = PublicAPI.Projects.ProjectRole.Filter ().Query ("Name like ’%AM%’ and Project = " + project.Id.ToString ()).Find ().FirstOrDefault ();
- //Получаем всех текущих пользователей в Роли и обнуляем. На тот случай, если произошли изменения в 1С.
- //Bez Try padaet metod, esli net polzovateley
- try{
- var alluser = PublicAPI.Projects.ProjectRole.GetAllProjectRoleUsers(project, projectRole);
- PublicAPI.Projects.ProjectRole.RemoveUserFromProjectRole (project, projectRole, alluser);
- }
- catch
- {
- }
- //Добавялем найденного ССД
- PublicAPI.Projects.ProjectRole.AddUserToProjectRole (project, projectRole, user);
- }
- //добавляем SSD
- var SSD = GetSSDbySegment.GetSSDbySegment.GetSSD (project.TEL_Contractor.Region.TEL_TCC, project.TEL_Contractor.TEL_Segment);
- if (SSD != null) {
- var projectRole = PublicAPI.Projects.ProjectRole.Filter ().Query ("Name like ’%SSD%’ and Project = " + project.Id.ToString ()).Find ().FirstOrDefault ();
- //Получаем всех текущих пользователей в Роли и обнуляем. На тот случай, если произошли изменения в 1С.
- try{
- var alluser = PublicAPI.Projects.ProjectRole.GetAllProjectRoleUsers(project, projectRole);
- PublicAPI.Projects.ProjectRole.RemoveUserFromProjectRole (project, projectRole, alluser);
- }
- catch
- {
- }
- //Добавялем найденного ССД
- PublicAPI.Projects.ProjectRole.AddUserToProjectRole (project, projectRole, SSD);
- }
- //Добавляем ПЕМ
- var PEM = GetSSDbySegment.GetPEMbySegment.GetPEM(project.TEL_Contractor.Region.TEL_TCC);
- if (PEM != null) {
- var projectRole = PublicAPI.Projects.ProjectRole.Filter ().Query ("Name like ’%Наблюдатели проекта%’ and Project = " + project.Id.ToString ()).Find ().FirstOrDefault ();
- //Получаем всех текущих пользователей в Роли и обнуляем. На тот случай, если произошли изменения в 1С.
- try{
- var alluser = PublicAPI.Projects.ProjectRole.GetAllProjectRoleUsers(project, projectRole);
- PublicAPI.Projects.ProjectRole.RemoveUserFromProjectRole (project, projectRole, alluser);
- }
- catch
- {
- }
- //Добавялем найденного ПЕМ
- PublicAPI.Projects.ProjectRole.AddUserToProjectRole (project, projectRole, PEM);
- }
- }
- /// <summary>
- /// подсчет выручки с проекта (профита, рентабильности и маржи)
- /// </summary>
- /// <param name="project"></param>
- private void CalculateTotalProfit (TEL_Project project)
- {
- project.TEL_MarginTotal = 0;
- project.TEL_ProfitTotal = 0;
- foreach (var solution in project.TEL_Solutions) {
- project.TEL_MarginTotal += solution.Margin;
- project.TEL_ProfitTotal += solution.Profit;
- }
- project.TEL_ProfitabilityTotal = Math.Round (Convert.ToDouble ((project.TEL_MarginTotal / project.TEL_ProfitTotal) * 100), 2);
- }
- /// <summary>
- /// Пересчет солюшена
- /// </summary>
- /// <param name="solution">возможность</param>
- /// <returns></returns>
- private TEL_Project_TEL_Solutions CalculateSolutionOrReturnNull (Solutions solution, Context context, P_ObnovlenieProektov_Project project)
- {
- var resultSolution = new TEL_Project_TEL_Solutions ();
- resultSolution.TEL_ProductType = FindProductTypeOrNull (solution.ProductType);
- if (resultSolution.TEL_ProductType == null) {
- context.Errors.Add (new P_ObnovlenieProektov_Errors {
- ProjectName = project.Name_1C,
- Error = string.Format ("ProductType c названием '{0}' не найден", solution.ProductType)
- });
- return null;
- }
- resultSolution.Charge = double.Parse (solution.Charge.Replace (".", ","));
- resultSolution.UnitCost = double.Parse (solution.SummaryCostPrice.Replace (".", ","));
- resultSolution.TEL_SupplyDate = DateTime.Parse (solution.SupplyDate);
- resultSolution.Quantity = int.Parse (solution.Quantity);
- resultSolution.SummaryCostPrice = resultSolution.UnitCost * resultSolution.Quantity;
- resultSolution.Margin = resultSolution.Charge * resultSolution.Quantity * resultSolution.UnitCost / 100;
- resultSolution.Profit = resultSolution.Margin + resultSolution.UnitCost * resultSolution.Quantity;
- resultSolution.Profitability = Math.Round (Convert.ToDouble ((resultSolution.Margin / resultSolution.Profit) * 100), 2).ToString () + "%";
- resultSolution.TEL_ProductGroup = resultSolution.TEL_ProductType.Solution;
- return resultSolution;
- }
- /// <summary>
- /// Пересчет количества проектов, в которых есть все обязательные поля
- /// </summary>
- /// <param name="context"> контекст</param>
- /// <returns> количество проектов, в которых все обязательные поля заполнены</returns>
- public virtual int ProjectToSendCount (Context context)
- {
- int count = 0;
- foreach (var project in context.Project) {
- if (project.Manager != "" && project.Contractor != "" && project.Link_1C != "" && project.Name_1C != "") {
- count++;
- }
- }
- return count;
- }
- #endregion
- #region создание
- /// <summary>
- /// Создание Даты окончания процесса (учитывает возможности внутри проекта)
- /// </summary>
- /// <param name="project"></param>
- /// <returns></returns>
- private DateTime CreateEndDate (P_ObnovlenieProektov_Project project)
- {
- var endDate = DateTime.Today.AddDays (7);
- foreach (var solution in project.Solution) {
- DateTime newDate;
- if (DateTime.TryParse (solution.SupplyDate, out newDate)) {
- endDate = newDate;
- }
- }
- return endDate;
- }
- /// <summary>
- /// Создание солюшена
- /// </summary>
- /// <param name="project">проект, который хранится в контексте процесса</param>
- /// <returns></returns>
- private ISet<TEL_Project_TEL_Solutions> CreateSolutions (P_ObnovlenieProektov_Project project, Context context)
- {
- var solutions = new HashSet<TEL_Project_TEL_Solutions> ();
- foreach (var solution in project.Solution) {
- var calculatedSolution = CalculateSolutionOrReturnNull (solution, context, project);
- if (calculatedSolution != null) {
- solutions.Add (calculatedSolution);
- }
- }
- return solutions;
- }
- /// <summary>
- /// Создание проекта на основе контекста
- /// </summary>
- /// <param name="project"></param>
- /// <param name="context"></param>
- /// <returns></returns>
- private TEL_Project CreateProject (P_ObnovlenieProektov_Project project, Context context)
- {
- var startDate = DateTime.Now.Date;
- var projectName = ProjectNumberGeneration (context);
- var projectManager = FindUser (project.Manager);
- var endDate = CreateEndDate (project);
- var newProject = PublicAPI.Projects.Types.UserTEL_Project.Create (projectName, projectManager, startDate, endDate);
- return newProject;
- }
- /// <summary>
- /// Создание запись ЗЦ на основе контекста
- /// </summary>
- /// <param name="project"></param>
- /// <param name="context"></param>
- /// <returns></returns>
- private bool TryCreatePurchaseCenter (TEL_Project project, Contractor cont, string str)
- {
- var role = EntityManager<TEL_CompanyRole>.Instance.Find(c => c.Name == str).FirstOrDefault();
- if(project != null && project.TEL_Opportunity != null && role != null && project.TEL_Contractor != null){
- var newPurch = EntityManager<TEL_PurchaseCenter>.Instance.Create();
- newPurch.CompanyRole = role;
- newPurch.Company = cont;
- newPurch.TEL_Opportunity = project.TEL_Opportunity;
- newPurch.TEL_Projects.Add(project);
- newPurch.Save();
- return true;
- }
- return false;
- }
- private void CreateTaskToFillPurchaseCenter(TEL_Project project)
- {
- //var startableProcess = PublicAPI.Processes.ProcessHeader.Find("Token = 'eac48672-837c-4db1-865e-a3f269b65a2f'").FirstOrDefault(a => a.Published != null);
- var startableProcess = ProcessHeaderManager.Instance.Find(p => p.Token == "eac48672-837c-4db1-865e-a3f269b65a2f" && p.Published != null, FetchOptions.First).FirstOrDefault() as ProcessHeader;
- if (startableProcess != null)
- {
- Action<dynamic> processContext = context => {
- context.Project = project;
- context.SSD = project.TEL_Opportunity.TEL_SSD ?? project.Manager;
- };
- var instance = PublicAPI.Processes.WorkflowInstance.StartProcess(startableProcess.Published, "Заполнение закупочного центра по проекту " + project.Name, processContext);
- }
- }
- #endregion
- public class Project
- {
- public string Name {
- get;
- set;
- }
- public string Manager {
- get;
- set;
- }
- public string Contractor {
- get;
- set;
- }
- public string ProjectInsitute {
- get;
- set;
- }
- public string GeneralContractor {
- get;
- set;
- }
- public string Object {
- get;
- set;
- }
- public string Description {
- get;
- set;
- }
- public string ImplementationProbability {
- get;
- set;
- }
- public string IdELMA {
- get;
- set;
- }
- public string LinkELMA {
- get;
- set;
- }
- public string Link_1C {
- get;
- set;
- }
- public string Opportunity {
- get;
- set;
- }
- public string Name_1C {
- get;
- set;
- }
- public List<Solution> Solution {
- get;
- set;
- }
- }
- public class Solution
- {
- public string ProductType {
- get;
- set;
- }
- public string Quantity {
- get;
- set;
- }
- public string Charge {
- get;
- set;
- }
- public string SummaryCostPrice {
- get;
- set;
- }
- public string SupplyDate {
- get;
- set;
- }
- }
- /// <summary>
- /// Проверка: остались ли проекты, которые можно сохранить в базу
- /// </summary>
- /// <param name="context">Контекст процесса</param>
- /// <param name="GatewayVar"></param>
- public virtual bool ProjectToSend (Context context, object GatewayVar)
- {
- return ProjectToSendCount (context) != 0;
- }
- /// <summary>
- /// Генерация имени проекта
- /// </summary>
- /// <param name="context"></param>
- /// <returns></returns>
- public string ProjectNumberGeneration (Context context)
- {
- //скопировано из процесса создания проекта
- var numerator = PublicAPI.Docflow.Objects.Nomenclature.Numerator.Load (new Guid ("4463400e-d257-4cbe-8013-fcad4cc7421e"));
- numerator.Value++;
- numerator.Save ();
- var a = 4 - numerator.Value.ToString ().Length;
- string b = "";
- while (a > 0) {
- b += "0";
- a--;
- }
- b += numerator.Value.ToString ();
- return context.TCC.ShortCode + "_P_" + DateTime.Today.Year.ToString ().Substring (2, 2) + b;
- }
- /// <summary>
- /// Генерация имени возможности
- /// </summary>
- /// <param name="context"></param>
- /// <returns></returns>
- public string OpportunityNumberGeneration (Context context)
- {
- //скопировано из процесса создания возможности
- var numerator = PublicAPI.Docflow.Objects.Nomenclature.Numerator.Load (new Guid ("b1534790-59e8-44de-a881-3143de902303"));
- numerator.Value++;
- numerator.Save ();
- var a = 4 - numerator.Value.ToString ().Length;
- string b = "";
- while (a > 0) {
- b += "0";
- a--;
- }
- b += numerator.Value.ToString ();
- return context.TCC.ShortCode + "_O_" + DateTime.Today.Year.ToString ().Substring (2, 2) + b;
- }
- /// <summary>
- /// Zapusk100ProcessovSozdaniyaProekta
- /// </summary>
- /// <param name="context">Контекст процесса</param>
- public virtual void Zapusk100ProcessovSozdaniyaProekta (Context context)
- {
- if(context.ProjectsToPEM.Count > 0)
- {
- int n = context.ProjectsToPEM.Count;
- int i = n;
- while (i <= n + (n < 100 ? n : 99) && n >= 0)
- {
- var prj = context.ProjectsToPEM.FirstOrDefault();
- if(prj != null)
- {
- var startableProcess = PublicAPI.Processes.ProcessHeader.Find ("Name like 'Создание проекта'").FirstOrDefault (a => a.Published != null);
- if (startableProcess != null) {
- Action<dynamic> processContext = myContext => {
- myContext.TEL_Project = prj;
- myContext.TCC = EntityManager<TEL_TCC, long>.Instance.Find("ShortCode = '" + prj.Name.Substring(0,3) + "'").FirstOrDefault();
- myContext.MassImport = true;
- };
- var instance = PublicAPI.Processes.WorkflowInstance.StartProcess (startableProcess.Published, "Создание проекта " + prj.Name, processContext);
- context.ProcesList.Add(instance);
- }
- }
- n--;
- context.ProjectsToPEM.Remove(prj);
- }
- }
- context.PtoPEMpty = context.ProjectsToPEM.Count () > 0;
- context.HasErrors = context.Errors.Count () > 0;
- }
- /// <summary>
- /// ProjectCopy
- /// </summary>
- /// <param name="context">Контекст процесса</param>
- public virtual void ProjectCopy (Context context)
- {
- foreach(var item in context.Projects)
- {
- context.ProjectsToPEM.Add(item);
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement