PersonSharedFunctions.cs
7.36 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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Core;
using Sungero.CoreEntities;
using Sungero.Parties.Person;
namespace Sungero.Parties.Shared
{
partial class PersonFunctions
{
#region Проверка дублей
/// <summary>
/// Получить дубли персоны.
/// </summary>
/// <param name="excludeClosed">Исключить закрытые записи.</param>
/// <returns>Дубли персоны.</returns>
public override List<ICounterparty> GetDuplicates(bool excludeClosed)
{
// TODO Dmitriev_IA: На 53202, 69259 добавить поиск по имени.
// По умолчанию для Person ищем по ИНН.
return Functions.Module.Remote.GetDuplicateCounterparties(_obj.TIN, string.Empty, string.Empty, _obj.Id, excludeClosed)
.Where(x => People.Is(x))
.ToList();
}
#endregion
/// <summary>
/// Получить пол персоны в соответствии с фамилией, именем, отчеством.
/// </summary>
/// <returns>Пол персоны.</returns>
/// <remarks>Определение пола поддерживается только для русской локали.</remarks>
[Public]
public virtual Enumeration? GetGender()
{
Enumeration? personSex = null;
// Определение пола поддерживается только для русской локали.
if (System.Threading.Thread.CurrentThread.CurrentUICulture.Equals(System.Globalization.CultureInfo.CreateSpecificCulture("ru-RU")))
{
// Уточнить пол по отчеству.
if (!string.IsNullOrEmpty(_obj.MiddleName))
{
var middleName = _obj.MiddleName.Trim().ToLower();
if (middleName.EndsWith("ич") || middleName.EndsWith("оглы"))
personSex = Sex.Male;
if (middleName.EndsWith("на") || middleName.EndsWith("кызы"))
personSex = Sex.Female;
}
// Уточнить пол по фамилии.
if (!personSex.HasValue && !string.IsNullOrEmpty(_obj.LastName))
{
var lastName = _obj.LastName.Trim().ToLower();
personSex = lastName.EndsWith("ва") || lastName.EndsWith("на") || lastName.EndsWith("ая") ? Sex.Female : Sex.Male;
}
}
return personSex;
}
/// <summary>
/// Задать ФИО в соответствии с фамилией, именем и отчеством, а также Фамилию и инициалы.
/// </summary>
public void FillName()
{
if (string.IsNullOrEmpty(_obj.FirstName) || string.IsNullOrEmpty(_obj.LastName))
return;
using (TenantInfo.Culture.SwitchTo())
{
if (string.IsNullOrEmpty(_obj.MiddleName))
_obj.Name = People.Resources.FullNameWithoutMiddleFormat(_obj.FirstName, _obj.LastName);
else
_obj.Name = People.Resources.FullNameFormat(_obj.FirstName, _obj.MiddleName, _obj.LastName);
}
// Короткое наименование для отчетов.
_obj.ShortName = PublicFunctions.Module.GetSurnameAndInitialsInTenantCulture(_obj.FirstName, _obj.MiddleName, _obj.LastName);
}
/// <summary>
/// Получить ФИО в указанном падеже.
/// </summary>
/// <param name="declensionCase">Падеж.</param>
/// <returns>ФИО.</returns>
[Public]
public virtual string GetFullName(Sungero.Core.DeclensionCase declensionCase)
{
var gender = CommonLibrary.Gender.NotDefined;
if (_obj.Sex != null)
gender = _obj.Sex == Sungero.Parties.Person.Sex.Female ?
CommonLibrary.Gender.Feminine :
CommonLibrary.Gender.Masculine;
// Для фамилий типа Ардо (Иванова) неправильно склоняется через API. Баг 32895.
var fullName = CommonLibrary.PersonFullName.Create(_obj.LastName, _obj.FirstName, _obj.MiddleName);
var fullNameInDeclension = CommonLibrary.Padeg.ConvertPersonFullNameToTargetDeclension(fullName,
(CommonLibrary.DeclensionCase)(int)declensionCase,
gender);
var middleName = string.IsNullOrWhiteSpace(_obj.MiddleName) ? string.Empty : fullNameInDeclension.MiddleName;
using (TenantInfo.Culture.SwitchTo())
return Sungero.Parties.People.Resources.FullNameFormat(fullNameInDeclension.FirstName, middleName, fullNameInDeclension.LastName, "\u00A0");
}
/// <summary>
/// Получить фамилию и инициалы в культуре тенанта.
/// </summary>
/// <param name="firstName">Имя.</param>
/// <param name="middleName">Отчество.</param>
/// <param name="lastName">Фамилия.</param>
/// <returns>ФИО в коротком формате в локали тенанта.</returns>
[Public, Obsolete("Используйте метод GetSurnameAndInitialsInTenantCulture в модуле Parties")]
public static string GetSurnameAndInitialsInTenantCulture(string firstName, string middleName, string lastName)
{
return PublicFunctions.Module.GetSurnameAndInitialsInTenantCulture(firstName, middleName, lastName);
}
/// <summary>
/// Преобразует всю строку в строчные буквы, первый символ в прописную букву.
/// </summary>
/// <param name="source">Исходная строка.</param>
/// <returns>Скорректированная строка.</returns>
public static string SetUppercaseFirstLetter(string source)
{
return string.Format("{0}{1}", source.Substring(0, 1).ToUpper(), source.Substring(1).ToLower());
}
/// <summary>
/// Проверка ИНН на валидность.
/// </summary>
/// <param name="tin">Строка с ИНН.</param>
/// <returns>Текст ошибки. Пустая строка для верного ИНН.</returns>
public override string CheckTin(string tin)
{
return Functions.Counterparty.CheckTin(tin, false);
}
/// <summary>
/// Получить имя персоны в формате Фамилия И.О. в нужном падеже.
/// </summary>
/// <param name="declension">Падеж.</param>
/// <returns>Имя персоны.</returns>
[Public]
public virtual string GetLastNameAndInitials(Sungero.Core.DeclensionCase declension)
{
var personName = CommonLibrary.PersonFullName.Create(_obj.LastName, _obj.FirstName, _obj.MiddleName, CommonLibrary.PersonFullNameDisplayFormat.LastNameAndInitials);
Sungero.Core.Enumeration? sex = _obj.Sex != null ? _obj.Sex : this.GetGender();
Sungero.Core.Gender? gender = null;
if (sex.HasValue)
gender = sex == Parties.Person.Sex.Male ? Sungero.Core.Gender.Masculine : Sungero.Core.Gender.Feminine;
if (gender.HasValue)
return CaseConverter.ConvertPersonFullNameToTargetDeclension(personName, declension, gender.Value);
return CaseConverter.ConvertPersonFullNameToTargetDeclension(personName, declension);
}
}
}