DocumentRegisterServerFunctions.cs
30.5 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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
using System;
using System.Collections.Generic;
using System.Linq;
using Sungero.Company;
using Sungero.Core;
using Sungero.CoreEntities;
using Sungero.Docflow.DocumentRegister;
using Sungero.Domain.Shared;
namespace Sungero.Docflow.Server
{
partial class DocumentRegisterFunctions
{
/// <summary>
/// Получить журнал регистрации по ИД.
/// </summary>
/// <param name="registerId">ИД журнала.</param>
/// <returns>Журнал регистрации.</returns>
[Public, Remote]
public static IDocumentRegister GetDocumentRegister(int registerId)
{
return DocumentRegisters.Get(registerId);
}
/// <summary>
/// Получить список групп регистрации текущего пользователя.
/// </summary>
/// <returns>Список групп регистрации текущего пользователя.</returns>
[Remote]
public IQueryable<IRegistrationGroup> GetUsersRegistrationGroups()
{
return RegistrationGroups.GetAll().Where(r => r.RecipientLinks
.Where(rec => Equals(rec.Member, Users.Current))
.Any());
}
/// <summary>
/// Получить список документов, зарегистрированных в данном журнале регистрации.
/// </summary>
/// <returns>Документы.</returns>
[Remote]
public IQueryable<IOfficialDocument> GetRegisteredDocuments()
{
return OfficialDocuments.GetAll(x => Equals(x.DocumentRegister, _obj));
}
/// <summary>
/// Получить отфильтрованные журналы регистрации.
/// </summary>
/// <param name="direction">Документопоток.</param>
/// <param name="isNotifiable">Регистрируемые \ Нумеруемые (True \ False).</param>
/// <param name="forCurrentUser">Только для текущего сотрудника.</param>
/// <returns>Журналы регистрации.</returns>
[Remote(IsPure = true), Public]
public static IQueryable<IDocumentRegister> GetFilteredDocumentRegisters(Enumeration direction, bool? isNotifiable, bool forCurrentUser)
{
var documentRegisters = DocumentRegisters.GetAll().Where(l => l.Status == CoreEntities.DatabookEntry.Status.Active)
.Where(l => l.RegisterType == RegisterType.Numbering || !forCurrentUser || Recipients.AllRecipientIds.Contains(l.RegistrationGroup.Id));
if (isNotifiable.HasValue)
documentRegisters = isNotifiable.Value ?
documentRegisters.Where(l => l.RegisterType == RegisterType.Registration) :
documentRegisters.Where(l => l.RegisterType == RegisterType.Numbering);
if (direction == Docflow.DocumentKind.DocumentFlow.Incoming)
return documentRegisters.Where(l => l.DocumentFlow.Value == DocumentFlow.Incoming);
if (direction == Docflow.DocumentKind.DocumentFlow.Outgoing)
return documentRegisters.Where(l => l.DocumentFlow.Value == DocumentFlow.Outgoing);
if (direction == Docflow.DocumentKind.DocumentFlow.Inner)
return documentRegisters.Where(l => l.DocumentFlow.Value == DocumentFlow.Inner);
if (direction == Docflow.DocumentKind.DocumentFlow.Contracts)
return documentRegisters.Where(l => l.DocumentFlow.Value == DocumentFlow.Contracts);
return null;
}
/// <summary>
/// Получить журналы регистрации\резервирования по параметрам.
/// </summary>
/// <param name="kind">Вид.</param>
/// <param name="unit">НОР.</param>
/// <param name="department">Подразделение.</param>
/// <param name="settingType">Тип нумерации.</param>
/// <param name="forCurrentUser">Для текущего пользователя.</param>
/// <returns>Журналы.</returns>
[Public, Remote(IsPure = true)]
public static List<IDocumentRegister> GetDocumentRegistersByParams(IDocumentKind kind, IBusinessUnit unit, IDepartment department,
Enumeration? settingType, bool forCurrentUser)
{
var registersIds = GetDocumentRegistersIdsByParams(kind, unit, department, settingType, forCurrentUser);
return DocumentRegisters.GetAll().Where(dr => registersIds.Contains(dr.Id)).ToList();
}
/// <summary>
/// Получить журналы регистрации\резервирования по параметрам.
/// </summary>
/// <param name="kind">Вид.</param>
/// <param name="unit">НОР.</param>
/// <param name="department">Подразделение.</param>
/// <param name="settingType">Тип нумерации.</param>
/// <param name="forCurrentUser">Для текущего пользователя.</param>
/// <returns>Журналы.</returns>
[Public, Remote(IsPure = true)]
public static List<int> GetDocumentRegistersIdsByParams(IDocumentKind kind, IBusinessUnit unit, IDepartment department,
Enumeration? settingType, bool forCurrentUser)
{
// Журналы, указанные в активных настройках регистрации с типом "Регистрация".
var documentRegistersIdsWithSettings = RegistrationSettings
.GetAll(s => s.Status == CoreEntities.DatabookEntry.Status.Active &&
s.SettingType == Docflow.RegistrationSetting.SettingType.Registration)
.Select(s => s.DocumentRegister.Id);
var documentRegistersIds = Functions.RegistrationSetting
.GetAvailableSettingsByParams(Docflow.RegistrationSetting.SettingType.Registration, unit, kind, department)
.Select(s => s.DocumentRegister.Id);
// Все журналы, кроме журналов из настроек с типом "Регистрация" не подходящих по параметрам.
var result = Functions.DocumentRegister.GetFilteredDocumentRegisters(kind.DocumentFlow.Value, true, forCurrentUser)
.Where(dr => !documentRegistersIdsWithSettings.Contains(dr.Id) || documentRegistersIds.Contains(dr.Id))
.Select(dr => dr.Id)
.ToList();
// Для резервирования добавить настройки резервирования в обход проверки доступности журнала группе регистрации.
// Делопроизводитель должен иметь возможность резервировать номер в документе, который не сможет зарегистрировать.
if (settingType == Docflow.RegistrationSetting.SettingType.Reservation)
result.AddRange(Functions.Module.GetAvailableRegistrationSettings(settingType, unit, kind, department).Select(r => r.DocumentRegister.Id).ToList());
return result.Distinct().ToList();
}
/// <summary>
/// Имеются ли подходящие журналы регистрации\резервирования по параметрам.
/// </summary>
/// <param name="kind">Вид.</param>
/// <param name="unit">НОР.</param>
/// <param name="department">Подразделение.</param>
/// <param name="settingType">Тип нумерации.</param>
/// <param name="forCurrentUser">Для текущего пользователя.</param>
/// <returns>True - если есть подходящие журналы.</returns>
[Public, Remote(IsPure = true)]
public static bool HasDocumentRegistersByParams(IDocumentKind kind, IBusinessUnit unit, IDepartment department,
Enumeration? settingType, bool forCurrentUser)
{
return Functions.DocumentRegister.GetDocumentRegistersIdsByParams(kind, unit, department, settingType, forCurrentUser).Any();
}
/// <summary>
/// Получить доступные журналы.
/// </summary>
/// <param name="direction">Документопоток вида документа.</param>
/// <returns>Журналы.</returns>
public static IQueryable<IDocumentRegister> GetAvailableDocumentRegisters(Enumeration direction)
{
var documentRegisters = DocumentRegisters.GetAll()
.Where(l => l.RegisterType == Docflow.DocumentRegister.RegisterType.Numbering || Recipients.AllRecipientIds.Contains(l.RegistrationGroup.Id));
if (direction == Docflow.DocumentKind.DocumentFlow.Incoming)
return documentRegisters.Where(l => l.DocumentFlow.Value == Docflow.DocumentRegister.DocumentFlow.Incoming);
else if (direction == Docflow.DocumentKind.DocumentFlow.Outgoing)
return documentRegisters.Where(l => l.DocumentFlow.Value == Docflow.DocumentRegister.DocumentFlow.Outgoing);
else if (direction == Docflow.DocumentKind.DocumentFlow.Inner)
return documentRegisters.Where(l => l.DocumentFlow.Value == Docflow.DocumentRegister.DocumentFlow.Inner);
else if (direction == Docflow.DocumentKind.DocumentFlow.Contracts)
return documentRegisters.Where(l => l.DocumentFlow.Value == Docflow.DocumentRegister.DocumentFlow.Contracts);
else
return null;
}
/// <summary>
/// Есть ли зарегистрированные в журнале документы.
/// </summary>
/// <param name="documentRegister">Журнал регистрации.</param>
/// <returns>Наличие документов.</returns>
[Remote(IsPure = true)]
public static bool HasRegisteredDocuments(IDocumentRegister documentRegister)
{
var command = string.Format(Queries.DocumentRegister.HasRegisteredDocuments, documentRegister.Id);
var executionResult = Docflow.PublicFunctions.Module.ExecuteScalarSQLCommand(command);
var result = 0;
if (!(executionResult is DBNull) && executionResult != null)
int.TryParse(executionResult.ToString(), out result);
return result != 0;
}
/// <summary>
/// Получить список документов, зарегистрированных в указанном периоде.
/// </summary>
/// <param name="documents">Документы.</param>
/// <param name="periodBegin">Начало периода.</param>
/// <param name="periodEnd">Конец периода.</param>
/// <returns>Документы, зарегистрированные в промежутке между periodBegin и periodEnd.</returns>
public static IQueryable<IOfficialDocument> FilterDocumentsByPeriod(IQueryable<IOfficialDocument> documents,
DateTime? periodBegin, DateTime? periodEnd)
{
return documents
.Where(d => !periodBegin.HasValue || d.RegistrationDate >= periodBegin)
.Where(d => !periodEnd.HasValue || d.RegistrationDate <= periodEnd)
.Where(d => d.Index != null && d.Index != 0);
}
/// <summary>
/// Получить последний или первый индекс среди документов за указанный период.
/// </summary>
/// <param name="documents">Документы.</param>
/// <param name="periodBegin">Начало периода.</param>
/// <param name="periodEnd">Конец периода.</param>
/// <param name="orderByDescending">True - последний индекс, false - первый индекс.</param>
/// <returns>Индекс.</returns>
public static int? GetIndex(IQueryable<IOfficialDocument> documents, DateTime? periodBegin, DateTime? periodEnd, bool orderByDescending)
{
var filteredDocuments = FilterDocumentsByPeriod(documents, periodBegin, periodEnd);
return orderByDescending ?
filteredDocuments.Select(d => d.Index).OrderByDescending(a => a).FirstOrDefault() :
filteredDocuments.Select(d => d.Index).OrderBy(a => a).FirstOrDefault();
}
/// <summary>
/// Получить делопроизводителей.
/// </summary>
/// <returns>Делопроизводители.</returns>
[Remote(IsPure = true), Public]
public static IRole GetClerks()
{
return Roles.GetAll().SingleOrDefault(r => r.Sid == Constants.Module.RoleGuid.ClerksRole);
}
/// <summary>
/// Получить следующий регистрационный номер.
/// </summary>
/// <param name="registrationDate">Дата регистрации.</param>
/// <param name="leadDocument">Ведущий документ.</param>
/// <param name="department">Подразделение.</param>
/// <param name="businessUnit">НОР.</param>
/// <returns>Следующий регистрационный номер.</returns>
[Public]
public virtual int GetNextRegistrationNumber(DateTime registrationDate, int leadDocument = 0, int department = 0, int businessUnit = 0)
{
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.LeadingDocument)
leadDocument = 0;
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.Department)
department = 0;
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.BusinessUnit)
businessUnit = 0;
using (var command = SQL.GetCurrentConnection().CreateCommand())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "Sungero_DocRegister_GetNextNumber";
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@basevalue", 1);
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@docregid", _obj.Id);
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@newmonth", Functions.DocumentRegister.GetCurrentMonth(_obj, registrationDate));
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@newyear", Functions.DocumentRegister.GetCurrentYear(_obj, registrationDate));
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@leaddoc", leadDocument);
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@newquarter", Functions.DocumentRegister.GetCurrentQuarter(_obj, registrationDate));
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@newdep", department);
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@newbusinessunit", businessUnit);
Docflow.PublicFunctions.Module.AddIntegerParameterToCommand(command, "@newday", Functions.DocumentRegister.GetCurrentDay(_obj, registrationDate));
var code = Docflow.PublicFunctions.Module.AddIntegerOutputParameterToCommand(command, "@result");
command.ExecuteNonQuery();
var registrationIndex = 0;
int.TryParse(code.Value.ToString(), out registrationIndex);
return registrationIndex;
}
}
/// <summary>
/// Получить текущий порядковый номер для журнала.
/// </summary>
/// <param name="date">Дата.</param>
/// <returns>Порядковый номер.</returns>
[Remote(IsPure = true)]
public virtual int GetCurrentNumber(DateTime date)
{
return Functions.DocumentRegister.GetCurrentNumber(_obj, date, 0, 0, 0);
}
/// <summary>
/// Получить текущий порядковый номер для журнала.
/// </summary>
/// <param name="date">Дата.</param>
/// <param name="leadDocumentId">ID ведущего документа.</param>
/// <param name="departmentId">ID подразделения.</param>
/// <param name="businessUnitId">ID НОР.</param>
/// <returns>Порядковый номер.</returns>
[Remote(IsPure = true)]
public virtual int GetCurrentNumber(DateTime date, int leadDocumentId, int departmentId, int businessUnitId)
{
var month = Functions.DocumentRegister.GetCurrentMonth(_obj, date);
var year = Functions.DocumentRegister.GetCurrentYear(_obj, date);
var quarter = Functions.DocumentRegister.GetCurrentQuarter(_obj, date);
var day = Functions.DocumentRegister.GetCurrentDay(_obj, date);
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.LeadingDocument)
leadDocumentId = 0;
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.Department)
departmentId = 0;
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.BusinessUnit)
businessUnitId = 0;
var command = string.Format(Queries.DocumentRegister.GetCurrentNumber,
_obj.Id, month, year, leadDocumentId, quarter, departmentId, businessUnitId, day);
var executionResult = Docflow.PublicFunctions.Module.ExecuteScalarSQLCommand(command);
var result = 0;
if (!(executionResult is DBNull) && executionResult != null)
int.TryParse(executionResult.ToString(), out result);
return result;
}
/// <summary>
/// Установить текущий номер документа для журнала.
/// </summary>
/// <param name="index">Текущий номер.</param>
/// <param name="leadDocumentId">ID ведущего документа.</param>
/// <param name="departmentId">ID подразделения.</param>
/// <param name="businessUnitId">ID НОР.</param>
/// <param name="date">Дата регистрации документа.</param>
[Public, Remote]
public virtual void SetCurrentNumber(int index, int leadDocumentId, int departmentId, int businessUnitId, DateTime date)
{
var month = Functions.DocumentRegister.GetCurrentMonth(_obj, date);
var year = Functions.DocumentRegister.GetCurrentYear(_obj, date);
var quarter = Functions.DocumentRegister.GetCurrentQuarter(_obj, date);
var day = Functions.DocumentRegister.GetCurrentDay(_obj, date);
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.LeadingDocument)
leadDocumentId = 0;
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.Department)
departmentId = 0;
if (_obj.NumberingSection != Docflow.DocumentRegister.NumberingSection.BusinessUnit)
businessUnitId = 0;
var commandText = string.Format(Queries.DocumentRegister.SetCurrentNumber,
_obj.Id, index, month, year, leadDocumentId, quarter, departmentId, businessUnitId, day);
Docflow.PublicFunctions.Module.ExecuteSQLCommand(commandText);
}
/// <summary>
/// Получить следующий порядковый номер для журнала.
/// </summary>
/// <param name="date">Дата.</param>
/// <param name="leadDocumentId">Ведущий документ.</param>
/// <param name="departmentId">Подразделение.</param>
/// <param name="businessUnitId">НОР.</param>
/// <param name="document">Текущий документ.</param>
/// <returns>Порядковый номер.</returns>
public virtual int? GetNextIndex(DateTime date, int leadDocumentId, int departmentId, int businessUnitId, IOfficialDocument document)
{
var index = Functions.DocumentRegister.GetCurrentNumber(_obj, date, leadDocumentId, departmentId, businessUnitId) + 1;
var documentsList = this.GetOtherDocumentsInPeriodBySections(document, date)
.Where(l => l.Index >= index)
.Where(l => leadDocumentId == 0 || l.LeadingDocument != null && Equals(l.LeadingDocument.Id, leadDocumentId))
.Where(l => departmentId == 0 || l.Department != null && Equals(l.Department.Id, departmentId))
.Where(l => businessUnitId == 0 || l.BusinessUnit != null && Equals(l.BusinessUnit.Id, businessUnitId))
.Select(l => l.Index)
.ToList();
// Вернуть следующий номер, если он не занят.
if (!documentsList.Contains(index))
return index;
// Найти следующий незанятый номер.
index = documentsList.Where(d => !documentsList.Contains(d.Value + 1)).Min(d => d.Value);
return index + 1;
}
/// <summary>
/// Получить следующий регистрационный номер.
/// </summary>
/// <param name="date">Дата регистрации.</param>
/// <param name="leadDocumentId">ID ведущего документа.</param>
/// <param name="document">Документ.</param>
/// <param name="leadingDocumentNumber">Номер ведущего документа.</param>
/// <param name="departmentId">ИД подразделения.</param>
/// <param name="businessUnitId">ID НОР.</param>
/// <param name="caseFileIndex">Индекс дела.</param>
/// <param name="docKindCode">Код вида документа.</param>
/// <param name="indexLeadingSymbol">Ведущий символ индекса.</param>
/// <returns>Регистрационный номер.</returns>
[Remote(IsPure = true)]
public virtual string GetNextNumber(DateTime date, int leadDocumentId, IOfficialDocument document, string leadingDocumentNumber,
int departmentId, int businessUnitId, string caseFileIndex, string docKindCode, string indexLeadingSymbol)
{
var index = Functions.DocumentRegister.GetNextIndex(_obj, date, leadDocumentId, departmentId, businessUnitId, document).ToString();
var departmentCode = string.Empty;
if (departmentId != 0)
{
var department = Departments.Get(departmentId);
if (department != null)
departmentCode = department.Code ?? string.Empty;
}
var businessUnitCode = string.Empty;
if (businessUnitId != 0)
{
var businessUnit = BusinessUnits.Get(businessUnitId);
if (businessUnit != null)
businessUnitCode = businessUnit.Code ?? string.Empty;
}
var counterpartyCode = Functions.OfficialDocument.GetCounterpartyCode(document);
var number = Functions.DocumentRegister.GenerateRegistrationNumber(_obj, date, index, leadingDocumentNumber,
departmentCode, businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, indexLeadingSymbol);
return number;
}
/// <summary>
/// Получить документы, зарегистрированные в журнале под тем же номером.
/// </summary>
/// <param name="doc">Документ.</param>
/// <param name="registrationDate">Дата регистрации.</param>
/// <param name="index">Индекс.</param>
/// <returns>Документы, зарегистрированные в журнале под тем же номером.</returns>
[Public, Obsolete("Используйте метод GetSameIndexRegistrationNumbers.")]
public virtual IQueryable<IOfficialDocument> GetSameNumberDocuments(IOfficialDocument doc, DateTime registrationDate, int index)
{
return this.GetOtherDocumentsInPeriodBySections(doc, registrationDate)
.Where(l => l.Index == index);
}
/// <summary>
/// Получить рег. номера документов, зарегистрированных в журнале с тем же индексом.
/// </summary>
/// <param name="doc">Документ.</param>
/// <param name="registrationDate">Дата регистрации.</param>
/// <param name="index">Индекс.</param>
/// <returns>Рег. номера документов, зарегистрированных в журнале с тем же индексом.</returns>
[Public]
public virtual IQueryable<string> GetSameIndexRegistrationNumbers(IOfficialDocument doc, DateTime registrationDate, int index)
{
return this.GetOtherDocumentsInPeriodBySections(doc, registrationDate)
.Where(l => l.Index == index)
.Select(l => l.RegistrationNumber);
}
/// <summary>
/// Получить документы, зарегистрированные в журнале в тот же период по тем же разрезам.
/// </summary>
/// <param name="doc">Документ.</param>
/// <param name="registrationDate">Дата регистрации.</param>
/// <returns>Документы, зарегистрированные в журнале в тот же период по тем же разрезам.</returns>
[Public]
public virtual IQueryable<IOfficialDocument> GetOtherDocumentsInPeriodBySections(IOfficialDocument doc, DateTime registrationDate)
{
var periodBegin = Functions.DocumentRegister.GetBeginPeriod(_obj, registrationDate);
var periodEnd = Functions.DocumentRegister.GetEndPeriod(_obj, registrationDate);
var documents = OfficialDocuments.GetAll()
.Where(l => !periodBegin.HasValue || l.RegistrationDate >= periodBegin)
.Where(l => !periodEnd.HasValue || l.RegistrationDate <= periodEnd)
.Where(l => l.DocumentRegister != null && Equals(l.DocumentRegister, _obj))
.Where(l => l.Id != doc.Id);
if (_obj.NumberingSection == Docflow.DocumentRegister.NumberingSection.LeadingDocument)
documents = documents.Where(d => Equals(d.LeadingDocument, doc.LeadingDocument));
if (_obj.NumberingSection == Docflow.DocumentRegister.NumberingSection.Department)
documents = documents.Where(d => Equals(d.Department, doc.Department));
if (_obj.NumberingSection == Docflow.DocumentRegister.NumberingSection.BusinessUnit)
documents = documents.Where(d => Equals(d.BusinessUnit, doc.BusinessUnit));
return documents;
}
/// <summary>
/// Проверить регистрационный номер на уникальность.
/// </summary>
/// <param name="document">Документ.</param>
/// <param name="registrationNumber">Регистрационный номер.</param>
/// <param name="index">Индекс.</param>
/// <param name="registrationDate">Дата регистрации.</param>
/// <param name="departmentCode">Код подразделения.</param>
/// <param name="businessUnitCode">Код нашей организации.</param>
/// <param name="caseFileIndex">Индекс дела.</param>
/// <param name="docKindCode">Код вида документа.</param>
/// <param name="counterpartyCode">Код контрагента.</param>
/// <param name="leadDocumentId">ID ведущего документа.</param>
/// <returns>True, если номер уникален, и false, если есть документы с таким же номером.</returns>
[Public, Remote(IsPure = true)]
public virtual bool IsRegistrationNumberUnique(IOfficialDocument document, string registrationNumber, int index,
DateTime registrationDate, string departmentCode, string businessUnitCode,
string caseFileIndex, string docKindCode, string counterpartyCode, int leadDocumentId)
{
var checkRegistrationNumberUnique = Functions.OfficialDocument.CheckRegistrationNumberUnique(document);
// У финансовых документов и договоров явно отключаем требование уникальности рег. номера.
if (!checkRegistrationNumberUnique)
return true;
var result = true;
var leadDoc = OfficialDocuments.GetAll().FirstOrDefault(x => x.Id == leadDocumentId);
var leadDocNumber = leadDoc == null ? string.Empty : leadDoc.RegistrationNumber;
AccessRights.AllowRead(
() =>
{
if (index == 0)
// Параметр функции "Искать корректировочный постфикс" = true, если необходимо проверять рег. номер на уникальность.
index = Functions.DocumentRegister.GetIndexFromRegistrationNumber(_obj, registrationDate, registrationNumber, departmentCode,
businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, leadDocNumber,
checkRegistrationNumberUnique);
var sameIndexRegistrationNumbers = Functions.DocumentRegister.GetSameIndexRegistrationNumbers(_obj, document, registrationDate, index).ToList();
foreach (var number in sameIndexRegistrationNumbers)
{
// Параметр функции "Искать корректировочный постфикс" = true, если необходимо проверять рег. номер на уникальность.
if (Functions.DocumentRegister.IsEqualsRegistrationNumbers(_obj, registrationDate, number,
departmentCode, businessUnitCode, caseFileIndex, docKindCode, counterpartyCode, leadDocNumber,
registrationNumber, checkRegistrationNumberUnique))
result = false;
}
});
return result;
}
/// <summary>
/// Проверить, есть ли подразделения с незаполненным кодом.
/// </summary>
/// <returns>True, если есть хоть одно подразделение без кода.</returns>
[Remote(IsPure = true)]
public static bool HasDepartmentWithNullCode()
{
return Company.Departments.GetAll().Any(x => x.Status == CoreEntities.DatabookEntry.Status.Active && x.Code == null);
}
/// <summary>
/// Проверить, есть ли наши организации с незаполненным кодом.
/// </summary>
/// <returns>True, если есть хоть одна наша организация без кода.</returns>
[Remote(IsPure = true)]
public static bool HasBusinessUnitWithNullCode()
{
return Company.BusinessUnits.GetAll().Any(x => x.Status == CoreEntities.DatabookEntry.Status.Active && x.Code == null);
}
}
}