ProjectCoreServerFunctions.cs
4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Content;
using Sungero.Core;
using Sungero.CoreEntities;
using Sungero.Docflow;
using Sungero.Projects.ProjectCore;
namespace Sungero.Projects.Server
{
partial class ProjectCoreFunctions
{
/// <summary>
/// Вложить документ в папку проекта.
/// </summary>
/// <param name="document">Вкладываемый документ.</param>
/// <remarks>Проект определяет, где должны лежать ссылки на его документы.</remarks>
[Public]
public virtual void AddDocumentToFolder(Content.IElectronicDocument document)
{
var folders = new List<IFolder>();
var official = Docflow.OfficialDocuments.As(document);
if (official != null)
{
var classifierFolders = _obj.Classifier.Where(l => Equals(l.DocumentKind, official.DocumentKind)).Select(l => l.Folder).Distinct().ToList();
if (classifierFolders.Any())
folders.AddRange(classifierFolders);
else
folders.Add(_obj.Folder);
}
else
folders.Add(_obj.Folder);
foreach (var folder in folders.Where(l => !l.Items.Contains(document)))
{
folder.Items.Add(document);
Logger.DebugFormat("GrantAccessRightsToProjectDocuments: document (id = {0}) added to folder (id = {1})", document.Id, folder.Id);
}
}
/// <summary>
/// Создать папки для классификатора.
/// </summary>
public virtual void UpdateClassifier()
{
var groups = _obj.Classifier.GroupBy(l => l.FolderName).ToList();
foreach (var nameGroup in groups)
{
var changedName = nameGroup.Where(l => l.State.Properties.FolderName.OriginalValue != l.FolderName).ToList();
foreach (var changed in changedName)
{
// Переименовывать папку, только если однозначно можно сказать, что папки с таким наименованием нет и не было в классификаторе.
if (_obj.Classifier.Any(f => (f.FolderName == changed.State.Properties.FolderName.OriginalValue ||
f.FolderName == changed.FolderName ||
f.State.Properties.FolderName.OriginalValue == changed.State.Properties.FolderName.OriginalValue) && f.Id != changed.Id))
changed.Folder = null;
}
var folder = nameGroup.Select(g => g.Folder).Where(f => f != null).Distinct().SingleOrDefault();
if (folder == null)
folder = Folders.Create();
folder.Name = nameGroup.Key;
_obj.Folder.Items.Add(folder);
foreach (var line in nameGroup.Where(l => l.Folder == null))
line.Folder = folder;
// Заполнение папки содержимым при изменении классификатора.
if (_obj.State.Properties.Classifier.IsChanged)
{
var kinds = nameGroup.Select(g => g.DocumentKind).ToList();
var documents = Docflow.OfficialDocuments.GetAll().Where(d => Equals(d.Project, _obj) && kinds.Contains(d.DocumentKind));
foreach (var doc in documents)
folder.Items.Add(doc);
}
}
}
/// <summary>
/// Получить документы по проекту.
/// </summary>
/// <returns>Документы по проекту.</returns>
[Remote]
public IQueryable<IOfficialDocument> GetProjectDocuments()
{
var query = OfficialDocuments.GetAll().Where(d => Equals(d.Project, _obj));
return query;
}
/// <summary>
/// Создать документ по проекту.
/// </summary>
/// <returns>Документ.</returns>
[Remote]
public IOfficialDocument CreateProjectDocument()
{
var document = ProjectDocuments.Create();
document.Project = _obj;
return document;
}
/// <summary>
/// Получить проекты по рукодителю или администратору проекта.
/// </summary>
/// <param name="recipient">Роль/сотрудник.</param>
/// <returns>Проекты.</returns>
public static List<IProjectCore> GetProjectsManagerOrAdministrator(CoreEntities.IRecipient recipient)
{
var projects = new List<IProjectCore>();
projects = ProjectCores.GetAll(p => Equals(p.Manager, recipient) || Equals(p.Administrator, recipient)).ToList();
projects.SelectMany(p => Functions.Module.GetProjectAndSubProjects(p));
return projects;
}
}
}