DeadlineExtensionTaskServerFunctions.cs
5.57 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
119
120
121
122
123
124
125
126
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using Sungero.RecordManagement.ActionItemExecutionTask;
using Sungero.RecordManagement.DeadlineExtensionTask;
using Sungero.Workflow;
namespace Sungero.RecordManagement.Server
{
partial class DeadlineExtensionTaskFunctions
{
/// <summary>
/// Построить модель состояния.
/// </summary>
/// <returns>Модель состояния.</returns>
[Remote(IsPure = true)]
public Sungero.Core.StateView GetStateView()
{
var parentTask = ActionItemExecutionTasks.As(_obj.ParentAssignment.Task);
return Functions.ActionItemExecutionTask.GetStateView(parentTask);
}
/// <summary>
/// Получить срок продления в строковом формате.
/// </summary>
/// <param name="desiredDeadline">Срок.</param>
/// <returns>Строковое представление.</returns>
public static string GetDesiredDeadlineLabel(DateTime desiredDeadline)
{
using (TenantInfo.Culture.SwitchTo())
{
if (desiredDeadline == desiredDeadline.Date)
return desiredDeadline.ToString("d");
var utcOffset = Calendar.UtcOffset.TotalHours;
var utcOffsetLabel = utcOffset >= 0 ? "+" + utcOffset.ToString() : utcOffset.ToString();
return string.Format("{0:g} (UTC{1})", desiredDeadline, utcOffsetLabel);
}
}
/// <summary>
/// Получить задачу на продление срока по поручению.
/// </summary>
/// <param name="executionAssignment">Поручение.</param>
/// <returns>Задача, на основе которой создано поручение.</returns>
[Remote(PackResultEntityEagerly = true)]
public static IDeadlineExtensionTask GetDeadlineExtension(Sungero.RecordManagement.IActionItemExecutionAssignment executionAssignment)
{
// Проверить наличие старой задачи на продление срока.
var oldTask = DeadlineExtensionTasks.GetAll()
.Where(j => Equals(j.ParentAssignment, executionAssignment))
.Where(j => j.Status == Workflow.Task.Status.InProcess || j.Status == Workflow.Task.Status.Draft)
.FirstOrDefault();
if (oldTask != null)
return oldTask;
var task = DeadlineExtensionTasks.CreateAsSubtask(executionAssignment);
task.ActionItemExecutionAssignment = executionAssignment;
task.MaxDeadline = (executionAssignment.Deadline < Calendar.Now) ? Calendar.Today : executionAssignment.Deadline;
task.NeedsReview = false;
task.ActionItem = executionAssignment.ActionItem;
var itemExecution = ActionItemExecutionTasks.As(executionAssignment.Task);
var document = ActionItemExecutionTasks.Get(itemExecution.Id).DocumentsGroup.OfficialDocuments.FirstOrDefault();
if (document != null)
task.DocumentsGroup.OfficialDocuments.Add(document);
task.Subject = Functions.DeadlineExtensionTask.GetDeadlineExtensionSubject(task, DeadlineExtensionTasks.Resources.ExtendDeadlineTaskSubject);
// Определить исполнителя. Для составного поручения взять ведущую задачу.
var leadItemExecution = itemExecution;
var parentItemExecution = ActionItemExecutionTasks.As(itemExecution.ParentTask);
if (parentItemExecution != null && parentItemExecution.IsCompoundActionItem == true)
leadItemExecution = parentItemExecution;
// Исполнителем указать контролёра, если его нет, то стартовавшего задачу, если и его нет, то автора.
// Если контроля не было, то стартовавшего задачу.
if (itemExecution.IsUnderControl == true)
task.Assignee = leadItemExecution.Supervisor ?? leadItemExecution.StartedBy;
else
task.Assignee = leadItemExecution.StartedBy;
if (task.Assignee == null || task.Assignee.IsSystem == true)
task.Assignee = leadItemExecution.Author;
task.CurrentDeadline = executionAssignment.Deadline;
task.Author = executionAssignment.Performer;
return task;
}
/// <summary>
/// Проверить документ на вхождение в обязательную группу вложений.
/// </summary>
/// <param name="document">Документ.</param>
/// <returns>True, если документ обязателен.</returns>
public virtual bool DocumentInRequredGroup(Docflow.IOfficialDocument document)
{
return _obj.DocumentsGroup.OfficialDocuments.Any(d => Equals(d, document));
}
/// <summary>
/// Получить нестандартных исполнителей задачи.
/// </summary>
/// <returns>Исполнители.</returns>
public virtual List<IRecipient> GetTaskAdditionalAssignees()
{
var assignees = new List<IRecipient>();
var deadlineExtension = DeadlineExtensionTasks.As(_obj);
if (deadlineExtension == null)
return assignees;
if (deadlineExtension.Assignee != null)
assignees.Add(deadlineExtension.Assignee);
if (ActionItemExecutionTasks.Is(deadlineExtension.ParentAssignment.Task))
assignees.AddRange(ActionItemExecutionTasks.As(deadlineExtension.ParentAssignment.Task).CoAssignees.Select(ca => ca.Assignee));
return assignees.Distinct().ToList();
}
}
}