Advertisement
yambroskin

Untitled

Jan 9th, 2017
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.43 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using EleWise.ELMA.API;
  6. using EleWise.ELMA.Model.Common;
  7. using System.Web;
  8. using EleWise.ELMA.Model.Entities;
  9. using EleWise.ELMA.Model.Managers;
  10. using EleWise.ELMA.Model.Types.Settings;
  11. using EleWise.ELMA.Model.Entities.ProcessContext;
  12. using Context = EleWise.ELMA.Model.Entities.ProcessContext.P_ImportDogovorovObnovlenn;
  13. using Aspose.Cells;
  14. using EleWise.ELMA.Documents.Models;
  15. using EleWise.ELMA.CRM.Models;
  16. using EleWise.ELMA.ConfigurationModel;
  17. using System.IO;
  18. using EleWise.ELMA.Services;
  19. using EleWise.ELMA.Runtime.Managers;
  20.  
  21. namespace EleWise.ELMA.Model.Scripts
  22. {
  23.     /// <summary>
  24.     /// Модуль сценариев процесса "Импорт договоров (обновленный)"
  25.     /// </summary>
  26.     /// <example>
  27.     /// <![CDATA[
  28.     /// >>>>>>>>>>>>>>>ВАЖНАЯ ИНФОРМАЦИЯ!!!<<<<<<<<<<<<<<<
  29.     /// Данный редактор создан для работы с PublicAPI.
  30.     /// PublicAPI предназначен для разработки сценариев ELMA.
  31.     /// Например, с помощью PublicAPI можно добавить комментарий к документу:
  32.     /// //Загружаем документ
  33.     /// var doc = PublicAPI.Docflow.Document.Load(56);
  34.     /// //Добавляем комментарий
  35.     /// PublicAPI.Docflow.Document.AddComment(doc, "тут ваш комментарий");
  36.     ///
  37.     /// Более подробно про PublicAPI вы можете узнать тут: http://www.elma-bpm.ru/kb/article-642ApiRoot.html
  38.     ///
  39.     /// Если же вам нужна более серьёзная разработка, выходящая за рамки PublicAPI, используйте
  40.     /// сторонние редакторы кода, такие как SharpDevelop и VisualStudio.
  41.     /// Информацию по запуску кода в стороннем редакторе вы можете найти тут:
  42.     /// http://www.elma-bpm.ru/kb/article-837.html
  43.     /// ]]>
  44.     /// </example>
  45.     public partial class P_ImportDogovorovObnovlenn_Scripts : EleWise.ELMA.Workflow.Scripts.ProcessScriptBase<Context>
  46.     {
  47.         /// <summary>
  48.         /// OnChangeFilepath
  49.         /// </summary>
  50.         /// <param name="context">Контекст процесса</param>
  51.         /// <param name="form"></param>
  52.         public virtual void OnChangeFilepath(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
  53.         {
  54.             if (System.IO.Directory.Exists(context.FolderPath))
  55.             {
  56.                 context.Alert = new HtmlString("Папка существует");
  57.             } else
  58.             {
  59.                 context.Alert = new HtmlString("Папка не существует или нет доступа!");
  60.             }
  61.         }
  62.  
  63.         /// <summary>
  64.         /// OnChangeFile
  65.         /// </summary>
  66.         /// <param name="context">Контекст процесса</param>
  67.         /// <param name="form"></param>
  68.         public virtual void OnChangeFile(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
  69.         {
  70.             ClearBlcok(context);
  71.             try
  72.             {
  73.                 if (context.ContractsFile != null)
  74.                 {
  75.                     var service = EleWise.ELMA.Services.Locator.GetService<Impeltech.Porsche.Settings.PorscheSettingsModule>();
  76.                     Workbook book = new Workbook(context.ContractsFile.ContentFilePath);
  77.                     //первая страница
  78.                     Worksheet sheet = book.Worksheets.FirstOrDefault();
  79.                     if (sheet != null)
  80.                     {
  81.                         for (int y = (int)context.RowsFrom; y < context.RowsFrom + 100; y++)
  82.                         {
  83.                             var row = new P_ImportDogovorovObnovlenn_FirstContracts();
  84.                             for (var x = 0; x < sheet.Cells.Columns.Count; x++)
  85.                             {
  86.                                 FillRowBySheet(row, sheet, x, y);
  87.                             }
  88.                             if (!string.IsNullOrWhiteSpace(row.Number))
  89.                             {
  90.                                 row.Parent = context;
  91.                                 row.Save();
  92.                                 context.FirstContracts.Add(row);
  93.                             }
  94.                         }
  95.                     }
  96.                 }
  97.             } catch (Exception ex)
  98.             {
  99.                 context.Alert = new HtmlString(ex.Message);
  100.             }
  101.             context.Save();
  102.         }
  103.  
  104.         private void FillRowBySheet(P_ImportDogovorovObnovlenn_FirstContracts row, Worksheet sheet, int x, int y)
  105.         {
  106.             var headerCell = sheet.Cells[GetIndex(x, 2)];
  107.             var currentCell = sheet.Cells[GetIndex(x, y)];
  108.             if (currentCell != null && headerCell != null && !string.IsNullOrWhiteSpace(headerCell.StringValue))
  109.             {
  110.                 switch (headerCell.StringValue.ToLower().Trim())
  111.                 {
  112.                     case "партнер":
  113.                         row.Partner = currentCell.StringValue.Trim();
  114.                         break;
  115.                     case "дата договора":
  116.                         DateTime contractDate;
  117.                         if (DateTime.TryParse(currentCell.StringValue, out contractDate))
  118.                         {
  119.                             row.ContractDate = contractDate;
  120.                         }
  121.                         break;
  122.                     case "номер":
  123.                         row.Number = currentCell.StringValue.Trim();
  124.                         break;
  125.                     case "срок действия":
  126.                         row.EndDate = currentCell.StringValue.Trim();
  127.                         break;
  128.                     case "предмет":
  129.                         row.Subject = currentCell.StringValue.Trim();
  130.                         break;
  131.                     case "раздел":
  132.                         row.Section = currentCell.StringValue.Trim();
  133.                         break;
  134.                     case "дополнительные соглашения":
  135.                         row.AddContract = currentCell.StringValue.Trim();
  136.                         break;
  137.                 }
  138.             }
  139.         }
  140.  
  141.         public string GetIndex(int x, int y)
  142.         {
  143.             return Alfabet[x] + y.ToString();
  144.         }
  145.  
  146.         public string Alfabet {
  147.             get {
  148.                 return "ABCDEFGHIJKLMNOPQRST";
  149.             }
  150.         }
  151.  
  152.         /// <summary>
  153.         /// CreateContractors
  154.         /// </summary>
  155.         /// <param name="context">Контекст процесса</param>
  156.         /// <param name="form"></param>
  157.         public virtual void CreateContractors(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
  158.         {
  159.             foreach (var itemGrouped in context.FirstContracts.Where(l => !string.IsNullOrWhiteSpace(l.Partner) && l.Contractor == null).GroupBy(c => c.Partner))
  160.             {
  161.                 var contractor = EntityManager<ContractorLegal>.Instance.Create();
  162.                 contractor.Name = itemGrouped.Key;
  163.                 contractor.Save();
  164.                 foreach (var item in itemGrouped)
  165.                 {
  166.                     item.Contractor = contractor;
  167.                     item.Save();
  168.                 }
  169.             }
  170.         }
  171.  
  172.         /// <summary>
  173.         /// ClearWithErrors
  174.         /// </summary>
  175.         /// <param name="context">Контекст процесса</param>
  176.         /// <param name="form"></param>
  177.         public virtual void ClearWithErrors(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
  178.         {
  179.             var toClear = context.FirstContracts.Where(c => c.Deparment == null || !c.ContractDate.HasValue || !(c.EndDateDate.HasValue || c.ContractExpirationTerm != null) || c.Contractor == null || !(c.Files.Any() || c.CreateIfFilesEmpty)).ToList();
  180.             foreach (var element in toClear)
  181.             {
  182.                 context.FirstContracts.Remove(element);
  183.                 element.Delete();
  184.             }
  185.         }
  186.  
  187.         /// <summary>
  188.         /// SetCreateIfFilesEmpty
  189.         /// </summary>
  190.         /// <param name="context">Контекст процесса</param>
  191.         /// <param name="form"></param>
  192.         public virtual void SetCreateIfFilesEmpty(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
  193.         {
  194.             foreach (var item in context.FirstContracts)
  195.             {
  196.                 item.CreateIfFilesEmpty = true;
  197.                 item.Save();
  198.             }
  199.         }
  200.  
  201.         /// <summary>
  202.         /// Search
  203.         /// </summary>
  204.         /// <param name="context">Контекст процесса</param>
  205.         public virtual void Search(Context context)
  206.         {
  207.             var htmlErrors = string.Empty;
  208.             foreach (var item in context.FirstContracts)
  209.             {
  210.                 item.PorshceContract = EntityManager<ProscheContract>.Instance.Find(c => c.Number == item.Number && item.Subject == item.Subject).FirstOrDefault(c => {
  211.                                                                                                                                                                    
  212.                                                                                                                                                                     var doc = EntityManager<Document>.Instance.LoadOrNull(item.Id);
  213.                                                                                                                                                                    
  214.                                                                                                                                                                     return doc != null && doc.IsDeleted == false && doc.IsArchived == false;
  215.                                                                                                                                                                    
  216.                                                                                                                                                                  });
  217.                
  218.                
  219.                 item.Contractor = EntityManager<Contractor>.Instance.Find(c => c.Name == item.Partner).FirstOrDefault();
  220.                 DateTime contractEndDate;
  221.                 if (DateTime.TryParse(item.EndDate, out contractEndDate))
  222.                 {
  223.                     item.EndDateDate = contractEndDate;
  224.                 } else
  225.                 {
  226.                     if (!string.IsNullOrWhiteSpace(item.EndDate) && item.EndDate.ToLower().Contains("доиспобязательств"))
  227.                     {
  228.                         item.ContractExpirationTerm = ConfigurationModel.ContractEpiration.FulfillmentObligations;
  229.                     }
  230.                 }
  231.                 item.Deparment = EntityManager<ConfigurationModel.PartitionPorsche>.Instance.Find(p => p.Name == item.Section).FirstOrDefault();
  232.                 var service = EleWise.ELMA.Services.Locator.GetService<Impeltech.Porsche.Settings.PorscheSettingsModule>();
  233.                 if (item.Number.Length < service.Settings.MinNumber)
  234.                 {
  235.                     htmlErrors += string.Format("<br/> {0} - длина меншье {1}", item.Number, service.Settings.MinNumber);
  236.                 } else
  237.                 {
  238.                     var filePaths = GetFiles(context.FolderPath, item.Number);
  239.                     if (filePaths.Any())
  240.                     {
  241.                         item.Files.AddAll(filePaths.Select(c => {
  242.                                                             var filePath = new FilePath() {
  243.                                                                 FullFilePath = c
  244.                                                             };
  245.                                                             filePath.Save();
  246.                                                             return filePath;
  247.                                                            }));
  248.                     }
  249.                 }
  250.                 item.Parent = context;
  251.                 item.Save();
  252.                 context.FirstContracts.Add(item);
  253.             }
  254.             context.Save();
  255.         }
  256.  
  257.         /// <summary>
  258.         /// Поиск с учетом прав доступа
  259.         /// </summary>
  260.         /// <param name="folder"></param>
  261.         /// <param name="name"></param>
  262.         /// <returns></returns>
  263.         private IEnumerable<string> GetFiles(string folder, string name)
  264.         {
  265.             var searchPattern = string.Format("*{0}*", CleanFileName(name));
  266.             return System.IO.Directory.GetFiles(folder, searchPattern, System.IO.SearchOption.AllDirectories).Where(c => System.IO.File.Exists(c));
  267.         }
  268.  
  269.         public string CleanFileName(string name)
  270.         {
  271.             return string.Join(string.Empty, name.Split(System.IO.Path.GetInvalidFileNameChars(), StringSplitOptions.RemoveEmptyEntries));
  272.         }
  273.  
  274.         /// <summary>
  275.         /// OnChangeOurLegalContractor
  276.         /// </summary>
  277.         /// <param name="context">Контекст процесса</param>
  278.         /// <param name="form"></param>
  279.         public virtual void OnChangeOurLegalContractor(Context context, EleWise.ELMA.Model.Views.FormViewBuilder<Context> form)
  280.         {
  281.             if (context.MyLegalPerson != null && context.MyLegalPerson.DocumentFolder != null)
  282.             {
  283.                 context.Alert = new HtmlString("Папка нашего Юр. лица в ELMA найдена");
  284.             } else
  285.             {
  286.                 context.Alert = new HtmlString("Папка нашего  Юр. лица отсутствует! ");
  287.             }
  288.         }
  289.  
  290.         /// <summary>
  291.         /// ClearBlcok
  292.         /// </summary>
  293.         /// <param name="context">Контекст процесса</param>
  294.         public virtual void ClearBlcok(Context context)
  295.         {
  296.             var toClear = context.FirstContracts.ToList();
  297.             foreach (var element in toClear)
  298.             {
  299.                 context.FirstContracts.Remove(element);
  300.                 element.Delete();
  301.             }
  302.         }
  303.  
  304.         /// <summary>
  305.         /// Apply
  306.         /// </summary>
  307.         /// <param name="context">Контекст процесса</param>
  308.         public virtual void Apply(Context context)
  309.         {
  310.             foreach (var row in context.FirstContracts)
  311.             {
  312.  
  313.                 if (row.PorshceContract == null && row.CreateIfFilesEmpty)
  314.                 {
  315.  
  316.                     row.PorshceContract = EntityManager<ProscheContract>.Create();
  317.                 }
  318.                
  319.                 if (row.PorshceContract != null)
  320.                 {
  321.                
  322.                     row.PorshceContract.MyLegalPerson = context.MyLegalPerson;
  323.                     row.PorshceContract.Number = row.Number;
  324.                     row.PorshceContract.Subject = row.Subject;
  325.                     row.PorshceContract.ContractStartDate = row.ContractDate;
  326.                    
  327.                     row.PorshceContract.Description = row.AddContract;
  328.                     row.PorshceContract.NotifyAboutExpiration = false;
  329.  
  330.                     if (row.EndDateDate.HasValue)
  331.                     {
  332.  
  333.                         row.PorshceContract.ContractEndDate = row.EndDateDate;
  334.                     } else
  335.                     {
  336.                         row.PorshceContract.ContractExpirationTerm = row.ContractExpirationTerm;
  337.  
  338.                     }
  339.  
  340.                     row.PorshceContract.Contractor = row.Contractor;
  341.                     row.PorshceContract.PartitionPorsche = row.Deparment;
  342.                    
  343.                         row.PorshceContract.Name = "Agreement " + row.Subject + " " + row.Contractor.Name;
  344.                     AddFiles(row.PorshceContract, row.Files);
  345.                     row.PorshceContract.Save();
  346.                     row.Save();
  347.                 }
  348.             }
  349.         }
  350.  
  351.         private void AddFiles(ProscheContract proscheContract, Iesi.Collections.Generic.ISet<FilePath> files)
  352.         {
  353.             var service = Locator.GetServiceNotNull<IMimeMappingService>();
  354.             var fileService = Locator.GetServiceNotNull<IFileManager>();
  355.  
  356.             var listAttachments = proscheContract.Attachments.Where(c => c.File != null && System.IO.File.Exists(c.File.ContentFilePath)).Select(c => new FileInfo(c.File.ContentFilePath));
  357.             foreach (var item in files)
  358.             {
  359.  
  360.                 var currentFile = new FileInfo(item.FullFilePath);
  361.  
  362.                 if (CheckNeedCopyFile(listAttachments, currentFile))
  363.                 {
  364.                     var attachment = new EleWise.ELMA.Common.Models.Attachment() {
  365.  
  366.                         CreationDate = DateTime.Now,
  367.                         File = new Files.BinaryFile() {
  368.                             Name = item.Name,
  369.                             CreateDate = DateTime.Now,
  370.                             ContentType = service.GetTypeByExtension(currentFile.Extension)
  371.                         }
  372.  
  373.                     };
  374.  
  375.                     attachment.File.InitializeContentFilePath();
  376.                     System.IO.File.Copy(item.FullFilePath, attachment.File.ContentFilePath);
  377.  
  378.                     fileService.SaveFile(attachment.File);
  379.                     attachment.Save();
  380.                     proscheContract.Attachments.Add(attachment);
  381.                    
  382.  
  383.                 }
  384.                
  385.             }
  386.  
  387.             proscheContract.Save();
  388.  
  389.         }
  390.  
  391.         private bool CheckNeedCopyFile(IEnumerable<FileInfo> listAttachments, FileInfo currentFile)
  392.         {
  393.            
  394.             return !listAttachments.Any(c => currentFile.Extension == c.Extension && c.CreationTimeUtc == currentFile.CreationTimeUtc && c.Length == currentFile.Length);
  395.         }
  396.  
  397.        
  398.     }
  399. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement