CounterpartyServerFunctions.cs
6.82 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
127
128
129
130
131
132
133
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using Sungero.Parties.Counterparty;
namespace Sungero.Parties.Server
{
partial class CounterpartyFunctions
{
/// <summary>
/// Сформировать информацию о возможности отправки приглашений контрагенту в сервис обмена.
/// </summary>
/// <returns>Информация о возможности отправки приглашений контрагенту в сервис обмена.</returns>
[Remote(IsPure = true)]
public Structures.Counterparty.SendInvitation InvitationBoxes()
{
var result = Structures.Counterparty.SendInvitation.Create();
var usedBoxes = _obj.ExchangeBoxes.Select(b => b.Box.Id).ToList();
var allBoxes = ExchangeCore.PublicFunctions.BusinessUnitBox.Remote.GetConnectedBoxes().ToList();
var doubleBoxes = new List<ExchangeCore.IBusinessUnitBox>();
// Ящики, через которые доступна отправка приглашений.
var allowedBoxes = Parties.Functions.Counterparty.CanSendInvitation(_obj);
foreach (var box in allowedBoxes)
{
var counterparty = Parties.Counterparties.GetAll()
.Where(x => !Equals(x, _obj))
.Where(x => x.ExchangeBoxes.Any(e => Equals(e.Box, box.Box) && box.OrganizationIds.Contains(e.OrganizationId)))
.FirstOrDefault();
if (counterparty != null)
{
doubleBoxes.Add(box.Box);
result.HaveDoubleCounterparty = true;
}
}
// Если найдены дублирующие ящики - убрать их из доступных.
if (doubleBoxes.Any())
allowedBoxes = allowedBoxes.Where(x => !doubleBoxes.Contains(x.Box)).ToList();
// Ящики для отправки приглашения.
result.Boxes = allBoxes.Where(b => !usedBoxes.Contains(b.Id)).Where(b => allowedBoxes.Any(x => Equals(x.Box, b))).ToList();
result.DefaultBox = result.Boxes.OrderBy(x => x.Name).FirstOrDefault();
result.HaveAllowedBoxes = result.Boxes.Any();
result.HaveAnyBoxes = allBoxes.Any();
// Возможен ли обмен с контрагентом через доступные сервисы.
result.CanSendInivtationFromAnyService = allowedBoxes.Any();
// Сервисы, через которые возможна отправка приглашений, с учетом доступных ящиков.
var exchangeServices = result.Boxes.Select(x => x.ExchangeService).Distinct().ToList();
result.Services = exchangeServices.OrderBy(x => x.Name).ToList();
// Действия зависят друг от друга - общий признак, можно ли в итоге выполнять действие.
result.CanDoAction = result.HaveAnyBoxes && result.HaveAllowedBoxes && result.CanSendInivtationFromAnyService;
return result;
}
/// <summary>
/// Проверка возможности отправить приглашение контрагенту хоть через один ящик.
/// </summary>
/// <param name="counterparty">Контрагент.</param>
/// <returns>Список сервисов, способных отправить приглашение.</returns>
/// <remarks>Только полное совпадение по ИНН и КПП.</remarks>
public static List<Structures.Counterparty.AllowedBoxes> CanSendInvitation(Parties.ICounterparty counterparty)
{
var boxes = ExchangeCore.PublicFunctions.BusinessUnitBox.Remote.GetConnectedBoxes().ToList();
// Если контрагент является копией какой-либо НОР, то ящики этой НОР убираем из списка.
var parentBusinessUnit = Sungero.Company.BusinessUnits.GetAll(b => Equals(b.Company, counterparty)).FirstOrDefault();
if (parentBusinessUnit != null)
boxes = boxes.Where(b => !Equals(b.BusinessUnit, parentBusinessUnit)).ToList();
var allowedServices = new List<Structures.Counterparty.AllowedBoxes>();
foreach (var box in boxes)
{
var organizations = ExchangeCore.PublicFunctions.BusinessUnitBox.Remote.CanSendInvitationFrom(box, counterparty);
if (organizations.Any())
allowedServices.Add(Structures.Counterparty.AllowedBoxes.Create(box, organizations));
}
return allowedServices;
}
/// <summary>
/// Получить контрагентов, с которыми установлен обмен для данной НОР.
/// </summary>
/// <param name="businessUnit">НОР.</param>
/// <returns>Список контрагентов.</returns>
[Remote(IsPure = true), Public]
public static List<ICounterparty> GetExchangeCounterparty(Sungero.Company.IBusinessUnit businessUnit)
{
// TODO Пока отправляем только тем, с кем установлен обмен.
var parties = Counterparties.GetAll()
.Where(x => x.ExchangeBoxes.Any(b => Equals(b.Status, Sungero.Parties.CounterpartyExchangeBoxes.Status.Active) && b.IsDefault == true))
.ToList();
if (businessUnit != null)
parties = parties.Where(x => x.ExchangeBoxes.Any(b => Equals(b.Box.BusinessUnit, businessUnit))).ToList();
return parties;
}
/// <summary>
/// Получить системного контрагента для листов рассылки в обход фильтрации.
/// </summary>
/// <returns>Системный контрагент - "По списку рассылки".</returns>
[Remote(IsPure = true), Public]
public static ICounterparty GetDistributionListCounterparty()
{
var guid = Sungero.Parties.Constants.Counterparty.DistributionListCounterpartyGuid;
var link = Docflow.PublicFunctions.Module.GetExternalLink(Company.ClassTypeGuid, guid);
if (link != null && link.EntityId.HasValue)
{
var companyId = link.EntityId.Value;
// HACK mukhachev: использование внутренней сессии для обхода фильтрации.
Logger.DebugFormat("CreateDefaultDistributionListCounterpartyIgnoreFiltering: companyId {0}", companyId);
using (var session = new Sungero.Domain.Session())
{
var innerSession = (Sungero.Domain.ISession)session.GetType()
.GetField("InnerSession", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(session);
return Companies.As((Sungero.Domain.Shared.IEntity)innerSession.Get(typeof(ICompany), companyId));
}
}
return null;
}
}
}