public Structures.ApprovalRulesConsolidatedReport.TableLine CreateTableLine(string reportSessionId, Sungero.Company.IBusinessUnit businessUnit, Sungero.Company.IDepartment department, Sungero.Docflow.IDocumentGroupBase category, Sungero.Docflow.IApprovalRuleBase rule, Sungero.Core.Enumeration flow, string documentKind, string documentParentType, Dictionary <Sungero.Core.Enumeration, string> localizedValueCash) { var line = Structures.ApprovalRulesConsolidatedReport.TableLine.Create(); line.BusinessUnit = businessUnit != null ? businessUnit.Name : string.Empty; line.Department = department != null ? department.Name : string.Empty; line.ReportSessionId = reportSessionId; line.Relation = department != null && businessUnit != null && Equals(department.BusinessUnit, businessUnit) ? "+" : string.Empty; line.Category = category != null ? category.Name : string.Empty; if (rule != null) { line.ApprovalRule = rule.Name; line.ApprovalRuleId = rule.Id; line.ApprovalRulePriority = rule.Priority; line.ApprovalRuleUrl = Hyperlinks.Get(rule); line.Status = localizedValueCash[rule.Status.Value]; } line.DocumentFlow = localizedValueCash[flow]; line.DocumentKind = documentKind; line.DocumentParentType = documentParentType; return(line); }
/// <summary> /// Добавить блок задачи на обработку входящих документов из сервиса обмена. /// </summary> /// <param name="stateView">Схема представления.</param> /// <returns>Новый блок.</returns> public Sungero.Core.StateBlock AddTaskBlock(Sungero.Core.StateView stateView) { // Создать блок задачи. var taskBlock = stateView.AddBlock(); // Добавить ссылку на задачу и иконку. taskBlock.Entity = _obj; taskBlock.AssignIcon(StateBlockIconType.OfEntity, StateBlockIconSize.Large); // Определить схлопнутость. taskBlock.IsExpanded = _obj.Status == Workflow.Task.Status.InProcess; taskBlock.AddLabel(ExchangeDocumentProcessingTasks.Resources.StateViewTaskBlockHeader, Sungero.Docflow.PublicFunctions.Module.CreateHeaderStyle()); taskBlock.AddLineBreak(); // Добавить отправителя. var sender = _obj.Counterparty; taskBlock.AddLabel(ExchangeDocumentProcessingTasks.Resources.StateViewSender, Sungero.Docflow.PublicFunctions.Module.CreateNoteStyle()); taskBlock.AddHyperlink(sender.Name, Hyperlinks.Get(sender)); taskBlock.AddLineBreak(); // Добавить получателя. var receiver = _obj.Box; taskBlock.AddLabel(ExchangeDocumentProcessingTasks.Resources.StateViewRecipient, Sungero.Docflow.PublicFunctions.Module.CreateNoteStyle()); taskBlock.AddHyperlink(receiver.Name, Hyperlinks.Get(receiver)); return(taskBlock); }
/// <summary> /// Создать уведомление об изменении оргструктуры абонентского ящика нашей организации. /// </summary> /// <param name="box">Абонентский ящик нашей организации.</param> /// <param name="newDepartmentBoxes">Новые ящики подразделений.</param> /// <param name="changedDepartmentBoxes">Измененные ящики подразделений.</param> /// <param name="deletedDepartmentBoxes">Удаленные ящики подразделений.</param> private static void CreateDepartmentBoxNotice(IBusinessUnitBox box, List <IDepartmentBox> newDepartmentBoxes, List <IDepartmentBox> changedDepartmentBoxes, List <IDepartmentBox> deletedDepartmentBoxes) { var task = Workflow.SimpleTasks.Create(); var dateWithUTC = Sungero.Docflow.PublicFunctions.Module.GetDateWithUTCLabel(Calendar.Now); var subject = DepartmentBoxes.Resources.DepartmentBoxNoticeSubjectFormat(box.Name, dateWithUTC); task.Subject = Exchange.PublicFunctions.Module.CutText(subject, task.Info.Properties.Subject.Length); var step = task.RouteSteps.AddNew(); step.AssignmentType = Workflow.SimpleTask.AssignmentType.Notice; step.Performer = box.Responsible; if (newDepartmentBoxes.Any()) { task.Subject = DepartmentBoxes.Resources.DepartmentBoxAssignmentSubjectFormat(box.Name, dateWithUTC); step.AssignmentType = Workflow.SimpleTask.AssignmentType.Assignment; task.Deadline = Calendar.Now.AddWorkingDays(step.Performer, 1); task.NeedsReview = false; DepartmentBoxSection(task, newDepartmentBoxes, DepartmentBoxes.Resources.NewDepartmentBoxesNotice); } if (changedDepartmentBoxes.Any()) { DepartmentBoxSection(task, changedDepartmentBoxes, DepartmentBoxes.Resources.ChangedDepartmentBoxesNotice); } if (deletedDepartmentBoxes.Any()) { DepartmentBoxSection(task, deletedDepartmentBoxes, DepartmentBoxes.Resources.DeletedDepartmentBoxesNotice); // Уведомление ответственным о закрытии ящика подразделения. foreach (var responsible in deletedDepartmentBoxes.Where(b => b.Responsible != null && !Equals(b.Responsible, box.Responsible)).Select(b => b.Responsible)) { var deleteBoxTask = Workflow.SimpleTasks.Create(); deleteBoxTask.Subject = DepartmentBoxes.Resources.DeletedDepartmentBoxesReponsibleNotice; var deleteBoxStep = deleteBoxTask.RouteSteps.AddNew(); deleteBoxStep.AssignmentType = Workflow.SimpleTask.AssignmentType.Notice; deleteBoxStep.Performer = responsible; var responsibleBoxes = deletedDepartmentBoxes.Where(b => Equals(b.Responsible, responsible)); deleteBoxTask.ActiveText += DepartmentBoxes.Resources.DeletedDepartmentBoxesNotice + Environment.NewLine; foreach (var departmentBox in responsibleBoxes) { deleteBoxTask.Attachments.Add(departmentBox); deleteBoxTask.ActiveText += Constants.BusinessUnitBox.Delimiter; deleteBoxTask.ActiveText += Hyperlinks.Get(departmentBox); deleteBoxTask.ActiveText += Environment.NewLine; } deleteBoxTask.ActiveText += Environment.NewLine; deleteBoxTask.Save(); deleteBoxTask.Start(); } } task.Save(); task.Start(); }
/// <summary> /// Добавить секцию в текст уведомления об изменениях оргструктуры абонентского ящика нашей организации. /// </summary> /// <param name="task">Задача.</param> /// <param name="departmentBoxes">Ящики подразделений.</param> /// <param name="sectionHeader">Заголовок секции.</param> private static void DepartmentBoxSection(Workflow.ISimpleTask task, List <IDepartmentBox> departmentBoxes, string sectionHeader) { task.ActiveText += sectionHeader + Environment.NewLine; foreach (var departmentBox in departmentBoxes) { task.Attachments.Add(departmentBox); task.ActiveText += Constants.BusinessUnitBox.Delimiter; task.ActiveText += Hyperlinks.Get(departmentBox); task.ActiveText += Environment.NewLine; } task.ActiveText += Environment.NewLine; }
public Structures.ApprovalRuleCardReport.CriteriaTableLine CreateCriteriaTableLine(string criterion, Sungero.CoreEntities.IDatabookEntry value) { var tableLine = new Structures.ApprovalRuleCardReport.CriteriaTableLine(); tableLine.ReportSessionId = ApprovalRuleCardReport.ReportSessionId; tableLine.Criterion = criterion; if (value != null) { tableLine.Value = value.DisplayValue; tableLine.ValueId = value.Id; tableLine.ValueHyperlink = Hyperlinks.Get(value); } return(tableLine); }
public static Structures.ResponsibilitiesReport.ResponsibilitiesReportTableLine CreateResponsibilitiesReportTableLine(string moduleName, string responsibility, string record, Sungero.Domain.Shared.IEntity element) { var newTableLine = new Structures.ResponsibilitiesReport.ResponsibilitiesReportTableLine(); newTableLine.ModuleName = moduleName; newTableLine.Responsibility = responsibility; newTableLine.Record = !string.IsNullOrEmpty(record) ? record : "-"; if (element != null) { newTableLine.RecordId = element.Id; newTableLine.RecordHyperlink = Hyperlinks.Get(element); } return(newTableLine); }
/// <summary> /// Получить данные для отображения прав подписи. /// </summary> /// <param name="rule">Правило согласования.</param> /// <param name="reportSessionId">ID отчета.</param> /// <returns>Список структур с данными о правах подписи.</returns> private List <Structures.ApprovalRuleCardReport.SignatureSettingsTableLine> GetSignatureSettingsTableData(IApprovalRuleBase rule, string reportSessionId) { var tableData = new List <Structures.ApprovalRuleCardReport.SignatureSettingsTableLine>(); var signatureSettings = this.GetSignatureSettings(rule) .OrderByDescending(x => x.Priority).ToList(); foreach (var signSetting in signatureSettings) { var displayValue = this.GetDisplayValuePresentation(signSetting); var id = signSetting.Id; var hyperlink = Hyperlinks.Get(signSetting); var orderNumber = signatureSettings.IndexOf(signSetting); var unitsAndDeps = this.GetBusinessUnitsAndDepartmentsPresentation(signSetting); var kindsAndCategories = this.GetDocumentKindsAndCategoriesPresentation(signSetting); var priority = signSetting.Priority ?? 0; // Лимит. var limits = string.Empty; if ((signSetting.DocumentFlow == SignatureSetting.DocumentFlow.Contracts || signSetting.DocumentFlow == SignatureSetting.DocumentFlow.All) && signSetting.Limit == SignatureSetting.Limit.Amount && signSetting.Amount.HasValue && signSetting.Currency != null) { limits = string.Format("{0} {1}", signSetting.Amount.Value.ToString("N2"), signSetting.Currency.AlphaCode); } // Срок. var validTill = string.Empty; if (signSetting.ValidTill.HasValue) { validTill = signSetting.ValidTill.Value.ToShortDateString(); } // Примечание. var note = signSetting.Note; tableData.Add(this.CreateSignatureSettingsTableLine(displayValue, id, hyperlink, orderNumber, unitsAndDeps, kindsAndCategories, priority, limits, validTill, note)); } return(tableData); }
public override void BeforeExecute(Sungero.Reporting.Server.BeforeExecuteEventArgs e) { RegistrationSettingReport.ReportDate = Calendar.UserToday; // Заполнить значения по умолчанию, если отчет вызван в невизуальном режиме. if (RegistrationSettingReport.FilterDepartmentsForBusinessUnits == null) { RegistrationSettingReport.FilterDepartmentsForBusinessUnits = true; } var filterDepartment = RegistrationSettingReport.FilterDepartmentsForBusinessUnits == true; #region Описание параметров if (RegistrationSettingReport.BusinessUnit != null) { RegistrationSettingReport.ParamsDescriprion += string.Format("{0}: {1} \n", Reports.Resources.RegistrationSettingReport.BusinessUnit, RegistrationSettingReport.BusinessUnit.Name); } if (!string.IsNullOrWhiteSpace(RegistrationSettingReport.Direction)) { RegistrationSettingReport.ParamsDescriprion += string.Format("{0}: {1} \n", Reports.Resources.RegistrationSettingReport.DocumentFlow, RegistrationSettingReport.DirectionLabel); } RegistrationSettingReport.ParamsDescriprion += string.Format("{0}: {1} \n", Reports.Resources.RegistrationSettingReport.FilterDepartmentsForBusinessUnits, RegistrationSettingReport.FilterDepartmentsForBusinessUnits == true ? Reports.Resources.RegistrationSettingReport.Yes : Reports.Resources.RegistrationSettingReport.No); #endregion var sourceDataTableName = Constants.RegistrationSettingReport.SourceTableName; RegistrationSettingReport.SourceDataTableName = sourceDataTableName; var reportSessionId = System.Guid.NewGuid().ToString(); RegistrationSettingReport.ReportSessionId = reportSessionId; var units = RegistrationSettingReport.BusinessUnit != null ? new List <Company.IBusinessUnit>() { RegistrationSettingReport.BusinessUnit } : Company.BusinessUnits.GetAll().Where(u => u.Status == CoreEntities.DatabookEntry.Status.Active).ToList(); var flows = new List <Enumeration>() { DocumentFlow.Incoming, DocumentFlow.Outgoing, DocumentFlow.Inner, DocumentFlow.Contracts }; if (!string.IsNullOrWhiteSpace(RegistrationSettingReport.Direction)) { flows = flows.Where(i => i.Value == RegistrationSettingReport.Direction).ToList(); } var kinds = DocumentKinds.GetAll().Where(k => k.Status == CoreEntities.DatabookEntry.Status.Active && !Equals(k.NumberingType, DocumentKind.NumberingType.NotNumerable)).ToList(); var settings = RegistrationSettings.GetAll().Where(s => s.Status == CoreEntities.DatabookEntry.Status.Active && s.DocumentRegister.Status == CoreEntities.DatabookEntry.Status.Active).ToList(); var departments = Company.Departments.GetAll().Where(d => d.Status == CoreEntities.DatabookEntry.Status.Active).OrderBy(d => d.Name).ToList(); var separator = ";" + System.Environment.NewLine; var allDepartmentString = Reports.Resources.RegistrationSettingReport.AllDepartmentString; var otherDepartmentString = Reports.Resources.RegistrationSettingReport.OtherDepartmentString; // Строчки также используются в условной разметке для подсветки красным\курсивом. var settingNotFound = Reports.Resources.RegistrationSettingReport.SettingNotFound; var defaultSetting = Reports.Resources.RegistrationSettingReport.DefaultSetting; var registerNotFound = Reports.Resources.RegistrationSettingReport.RegisterNotFound; var tableData = new List <Structures.RegistrationSettingReport.TableLine>(); foreach (var unit in units) { foreach (var flow in flows) { foreach (var kind in kinds.Where(k => Equals(k.DocumentFlow, flow))) { var error = Equals(kind.NumberingType, DocumentKind.NumberingType.Numerable) ? settingNotFound : defaultSetting; var subSettings = settings.Where(s => Equals(s.DocumentFlow, flow) && (!s.BusinessUnits.Any() || s.BusinessUnits.Any(u => Equals(u.BusinessUnit, unit))) && s.DocumentKinds.Any(k => Equals(k.DocumentKind, kind))) .ToList(); foreach (var setting in subSettings) { var subDepartments = setting.Departments.Where(d => !filterDepartment || Equals(d.Department.BusinessUnit, unit)).ToList(); if (setting.Departments.Any() && !subDepartments.Any()) { continue; } var department = !setting.Departments.Any() ? allDepartmentString : string.Join(separator, subDepartments.Select(d => d.Department.Name)); var example = Functions.DocumentRegister.GetValueExample(setting.DocumentRegister); var line = Structures.RegistrationSettingReport.TableLine.Create(); line.BusinessUnit = unit.Name; line.DocumentFlow = GetDocumentFlowName(flow); line.DocumentFlowIndex = flows.IndexOf(flow); line.DocumentKind = kind.Name; line.RegistrationSetting = setting.Name; line.RegistrationSettingUri = Hyperlinks.Get(setting); line.Priority = setting.Priority ?? 0; line.Departments = department; line.SettingType = GetSettingType(kind, setting); line.DocumentRegister = setting.DocumentRegister.Name; line.DocumentRegisterUri = Hyperlinks.Get(setting.DocumentRegister); line.NumberExample = example; line.ReportSessionId = reportSessionId; tableData.Add(line); } // Если настроек для вида не найдено. if (!subSettings.Any() && kind.NumberingType == DocumentKind.NumberingType.Numerable) { var line = Structures.RegistrationSettingReport.TableLine.Create(); line.BusinessUnit = unit.Name; line.DocumentFlow = GetDocumentFlowName(flow); line.DocumentFlowIndex = flows.IndexOf(flow); line.DocumentKind = kind.Name; line.RegistrationSetting = error; line.Priority = -1; line.Departments = allDepartmentString; line.SettingType = GetSettingType(kind, null); line.ReportSessionId = reportSessionId; tableData.Add(line); continue; } // Если есть хоть одна настройка для всех подразделений - идём дальше. if (subSettings.Any(s => !s.Departments.Any())) { continue; } // Если нет подразделений без настроек - идем дальше var allDeparmentInUnit = departments.Where(d => Equals(d.BusinessUnit, unit)).ToList(); var settingDepartments = subSettings.SelectMany(s => s.Departments).Select(s => s.Department).ToList(); if (!allDeparmentInUnit.Except(settingDepartments).Any()) { continue; } var allDepartments = filterDepartment ? departments.Where(d => Equals(d.BusinessUnit, unit)).ToList() : departments; var registers = new List <IDocumentRegister>(); var firstDepartment = allDepartments.Except(settingDepartments).FirstOrDefault(); if (firstDepartment != null) { registers.AddRange(Functions.DocumentRegister.GetDocumentRegistersByParams(kind, unit, firstDepartment, SettingType.Registration, false)); } registers = registers.Distinct().ToList(); var regDepartment = allDepartments.Any(d => settingDepartments.Contains(d)) ? otherDepartmentString : allDepartmentString; if (!registers.Any()) { var line = Structures.RegistrationSettingReport.TableLine.Create(); line.BusinessUnit = unit.Name; line.DocumentFlow = GetDocumentFlowName(flow); line.DocumentFlowIndex = flows.IndexOf(flow); line.DocumentKind = kind.Name; line.RegistrationSetting = registerNotFound; line.Priority = -1; line.Departments = regDepartment; line.SettingType = GetSettingType(kind, null); line.ReportSessionId = reportSessionId; tableData.Add(line); } foreach (var register in registers) { var example = Functions.DocumentRegister.GetValueExample(register); var line = Structures.RegistrationSettingReport.TableLine.Create(); line.BusinessUnit = unit.Name; line.DocumentFlow = GetDocumentFlowName(flow); line.DocumentFlowIndex = flows.IndexOf(flow); line.DocumentKind = kind.Name; line.RegistrationSetting = error; line.Priority = 0; line.Departments = regDepartment; line.DocumentRegister = register.Name; line.DocumentRegisterUri = Hyperlinks.Get(register); line.SettingType = GetSettingType(kind, null); line.NumberExample = example; line.ReportSessionId = reportSessionId; tableData.Add(line); } } } } // Полная сортировка данных. tableData = tableData .OrderBy(t => t.BusinessUnit) .ThenBy(t => t.DocumentFlowIndex) .ThenBy(t => t.DocumentKind) .ThenByDescending(t => t.Priority) .ThenBy(t => t.Departments) .ToList(); for (var i = 0; i < tableData.Count; i++) { tableData[i].Id = i; } Functions.Module.WriteStructuresToTable(RegistrationSettingReport.SourceDataTableName, tableData); }
public override void BeforeExecute(Sungero.Reporting.Server.BeforeExecuteEventArgs e) { var documentsTableName = Constants.ExchangeServiceDocumentReport.SourceTableName; ExchangeServiceDocumentReport.DocumentsTableName = documentsTableName; var reportSessionId = System.Guid.NewGuid().ToString(); ExchangeServiceDocumentReport.ReportSessionId = reportSessionId; #region Параметры отчета var resources = Sungero.Docflow.Reports.Resources.ExchangeServiceDocumentReport; var parameterInfo = string.Empty; if (ExchangeServiceDocumentReport.BusinessUnit != null) { parameterInfo += string.Format("{0}: {1}\n", Resources.BusinessUnit, ExchangeServiceDocumentReport.BusinessUnit.Name); } if (ExchangeServiceDocumentReport.Department != null) { parameterInfo += string.Format("{0}: {1}\n", Resources.Department, ExchangeServiceDocumentReport.Department.Name); } if (ExchangeServiceDocumentReport.Employee != null) { parameterInfo += string.Format("{0}: {1}\n", Resources.Employee, ExchangeServiceDocumentReport.Employee.Person.ShortName ?? ExchangeServiceDocumentReport.Employee.Name); } if (ExchangeServiceDocumentReport.Counterparty != null) { parameterInfo += string.Format("{0}: {1}\n", resources.Counterparty, ExchangeServiceDocumentReport.Counterparty.Name); } parameterInfo += string.Format("{0}: {1}", resources.ExchangeService, string.Join(", ", ExchangeServiceDocumentReport.ExchangeService.Select(x => x.Name))); ExchangeServiceDocumentReport.ParametersInfo = parameterInfo; #endregion var sendFrom = ExchangeServiceDocumentReport.SendDateFrom; if (sendFrom.HasValue) { ExchangeServiceDocumentReport.SendPeriod += string.Format("{0} {1}", Sungero.Docflow.Reports.Resources.AssignmentCompletionReport.PeriodFrom, sendFrom.Value.ToString("d")); } var sendTo = ExchangeServiceDocumentReport.SendDateTo; if (sendTo.HasValue) { ExchangeServiceDocumentReport.SendPeriod += string.Format(" {0} {1}", Sungero.Docflow.Reports.Resources.AssignmentCompletionReport.PeriodTo, sendTo.Value.ToString("d")); } // Отфильтровать доступные документы. var documents = Docflow.OfficialDocuments.GetAll() .Where(d => d.ExchangeState == Docflow.OfficialDocument.ExchangeState.SignAwaited) .Where(d => d.Tracking.Any(t => t.ExternalLinkId.HasValue && !t.ReturnDate.HasValue)) .Where(d => d.Versions.Any()); // Фильтр по дате отправки. if (sendFrom.HasValue) { documents = documents.Where(d => d.Tracking.Any(t => t.ExternalLinkId.HasValue && t.DeliveryDate >= sendFrom && !t.ReturnDate.HasValue)); } if (sendTo.HasValue) { documents = documents.Where(d => d.Tracking.Any(t => t.ExternalLinkId.HasValue && t.DeliveryDate <= sendTo && !t.ReturnDate.HasValue)); } // Фильтр по НОР. if (ExchangeServiceDocumentReport.BusinessUnit != null) { documents = documents.Where(d => d.BusinessUnit == null || Equals(d.BusinessUnit, ExchangeServiceDocumentReport.BusinessUnit)); } // Фильтр по подразделению сотрудника. if (ExchangeServiceDocumentReport.Department != null) { documents = documents.Where(d => d.Tracking.Any(t => t.ExternalLinkId.HasValue && !t.ReturnDate.HasValue && Equals(t.DeliveredTo.Department, ExchangeServiceDocumentReport.Department))); } // Фильтр по сотруднику. if (ExchangeServiceDocumentReport.Employee != null) { documents = documents.Where(d => d.Tracking.Any(t => t.ExternalLinkId.HasValue && !t.ReturnDate.HasValue && Equals(t.DeliveredTo, ExchangeServiceDocumentReport.Employee))); } // Инфошки. var exchangeDocumentsInfos = Exchange.ExchangeDocumentInfos.GetAll() .Where(x => documents.Contains(x.Document)) .Where(x => x.MessageType == Exchange.ExchangeDocumentInfo.MessageType.Outgoing); // Заполнить данные для временной таблицы. var dataTable = new List <Structures.ExchangeServiceDocumentReport.ExchangeServiceDocumentTableLine>(); foreach (var document in documents) { var tableLine = Structures.ExchangeServiceDocumentReport.ExchangeServiceDocumentTableLine.Create(); tableLine.ReportSessionId = reportSessionId; // Инфо об отправки документа. var documentExchangeInfo = exchangeDocumentsInfos.Where(x => Equals(x.Document, document)).OrderByDescending(x => x.MessageDate).FirstOrDefault(); if (documentExchangeInfo == null) { continue; } // НОР. var businessUnit = document.BusinessUnit; if (businessUnit == null) { businessUnit = ExchangeCore.PublicFunctions.BoxBase.GetBusinessUnit(documentExchangeInfo.Box); } // Дофильтрация по НОР. if (ExchangeServiceDocumentReport.BusinessUnit != null && !Equals(businessUnit, ExchangeServiceDocumentReport.BusinessUnit)) { continue; } tableLine.BusinessUnitName = businessUnit != null ? businessUnit.Name : string.Empty; tableLine.BusinessUnitId = businessUnit != null ? businessUnit.Id : 0; // Получатель. var counterparty = documentExchangeInfo.Counterparty; tableLine.Counterparty = counterparty != null ? counterparty.Name : string.Empty; // Фильтр по контрагенту. if (ExchangeServiceDocumentReport.Counterparty != null && counterparty != null && !Equals(counterparty, ExchangeServiceDocumentReport.Counterparty)) { continue; } // Сервис обмена. var exchangeService = ExchangeCore.PublicFunctions.BoxBase.GetExchangeService(documentExchangeInfo.Box); tableLine.ExchangeService = exchangeService.Name; // Фильтр по сервисам обмена. var exchangeServices = ExchangeServiceDocumentReport.ExchangeService.ToList(); if (!exchangeServices.Contains(exchangeService)) { continue; } // Ответственный и его подразделение. var tracking = document.Tracking .Where(t => t.ExternalLinkId.HasValue && !t.ReturnDate.HasValue) .OrderByDescending(t => t.DeliveryDate) .FirstOrDefault(); if (tracking != null) { var employee = tracking.DeliveredTo; tableLine.Responsible = employee.Person.ShortName ?? employee.Name; tableLine.Department = employee.Department != null?string.Format("({0})", employee.Department.Name) : string.Empty; } else { tableLine.Responsible = string.Empty; tableLine.Department = string.Empty; } // Дата отправки. tableLine.SendDate = documentExchangeInfo.MessageDate.HasValue ? documentExchangeInfo.MessageDate.Value.ToUserTime().ToString("d") : "-"; // Время ожидания контрагента. tableLine.Delay = WorkingTime.GetDurationInWorkingDays(documentExchangeInfo.MessageDate.Value, Calendar.Now).ToString(); // Документ. tableLine.DocName = document.Name; tableLine.DocId = document.Id; tableLine.Hyperlink = Hyperlinks.Get(document); dataTable.Add(tableLine); } Docflow.PublicFunctions.Module.WriteStructuresToTable(documentsTableName, dataTable); }
public override void BeforeExecute(Sungero.Reporting.Server.BeforeExecuteEventArgs e) { var sourceDocument = AcquaintanceReport.Document; var sourceTask = AcquaintanceReport.Task; var calledFromDocument = sourceDocument != null; var selectedVersionNumber = this.AcquaintanceReport.DocumentVersion; // Если у документа нет тела, но есть задачи ознакомления, номер версии берем 0, иначе выбранный. var versionNumber = 0; if (selectedVersionNumber != null) { versionNumber = Convert.ToInt32(selectedVersionNumber); } var tasks = new List <IAcquaintanceTask>(); if (calledFromDocument) { // Получить задачи на ознакомление по документу. tasks = Docflow.PublicFunctions.OfficialDocument.Remote.GetAcquaintanceTasks(sourceDocument); // Фильтр по номеру версии. tasks = tasks .Where(t => t.AcquaintanceVersions.First(v => v.IsMainDocument == true).Number == versionNumber) .ToList(); } else { tasks.Add(sourceTask); versionNumber = Functions.AcquaintanceTask.GetDocumentVersion(sourceTask); sourceDocument = sourceTask.DocumentGroup.OfficialDocuments.First(); } // Провалидировать подписи версии. Sungero.Domain.Shared.IEntity version = null; if (versionNumber > 0 && sourceDocument.Versions.Any(v => v.Number == versionNumber)) { version = sourceDocument.Versions.First(v => v.Number == versionNumber).ElectronicDocument; } var validationMessages = Functions.Module.GetDocumentSignatureValidationErrors(version, true); if (validationMessages.Any()) { validationMessages.Insert(0, RecordManagement.Resources.SignatureValidationErrorMessage); AcquaintanceReport.SignValidationErrors = string.Join(System.Environment.NewLine, validationMessages); } // Шапка. var nonBreakingSpace = Convert.ToChar(160); AcquaintanceReport.DocumentHyperlink = Hyperlinks.Get(sourceDocument); AcquaintanceReport.DocumentName = Docflow.PublicFunctions.Module.FormatDocumentNameForReport(sourceDocument, versionNumber, true); // Приложения. var documentAddenda = Functions.Module.GetAcquintanceTaskAddendas(tasks); if (documentAddenda.Any()) { AcquaintanceReport.AddendaDescription = Reports.Resources.AcquaintanceReport.Addendas; foreach (var addendum in documentAddenda) { var addendumInfo = string.Format("\n - {0} ({1}:{2}{3}).", addendum.DisplayValue.Trim(), Docflow.Resources.Id, nonBreakingSpace, addendum.Id); AcquaintanceReport.AddendaDescription += addendumInfo; } } // Данные. var reportSessionId = System.Guid.NewGuid().ToString(); AcquaintanceReport.ReportSessionId = reportSessionId; var dataTable = new List <Structures.AcquaintanceReport.TableLine>(); var department = this.AcquaintanceReport.Department; foreach (var task in tasks) { var createdDate = Docflow.PublicFunctions.Module.ToShortDateShortTime(task.Created.Value.ToUserTime()); var taskId = task.Id; var taskHyperlink = Hyperlinks.Get(task); var isElectronicAcquaintance = task.IsElectronicAcquaintance == true; var taskDisplayName = isElectronicAcquaintance ? Reports.Resources.AcquaintanceReport.ElectronicAcquaintanceTaskDisplayNameFormat(createdDate) : Reports.Resources.AcquaintanceReport.SelfSignAcquaintanceTaskDisplayNameFormat(createdDate); // Фильтрация сотрудников по подразделениям. var acquainters = AcquaintanceFormReportServerHandlers.GetEmployeesFromParticipants(task); if (AcquaintanceReport.Department != null) { acquainters = AcquaintanceReport.IncludeSubDepartments == true ? acquainters.Where(x => x.IncludedIn(AcquaintanceReport.Department)) : acquainters.Where(x => Equals(x.Department, AcquaintanceReport.Department)); } foreach (var employee in acquainters) { var newLine = Structures.AcquaintanceReport.TableLine.Create(); newLine.RowNumber = 0; newLine.ReportSessionId = reportSessionId; // Задача. newLine.TaskDisplayName = taskDisplayName; newLine.TaskId = taskId; newLine.TaskHyperlink = taskHyperlink; // Сотрудник. newLine.ShortName = employee.Person.ShortName; newLine.LastName = employee.Person.LastName; if (employee.JobTitle != null) { newLine.JobTitle = employee.JobTitle.DisplayValue; } newLine.Department = employee.Department.DisplayValue; if (task.Status != Status.InProcess && task.Status != Status.Suspended && task.Status != Status.Completed) { if (employee.Status != Company.Employee.Status.Closed) { dataTable.Add(newLine); } continue; } // Задание. var assignment = AcquaintanceAssignments.GetAll() .Where(a => Equals(a.Task, task) && Equals(a.Performer, employee) && a.Created >= task.Started) .FirstOrDefault(); if (assignment == null) { if (employee.Status != Company.Employee.Status.Closed) { dataTable.Add(newLine); } continue; } newLine.AssignmentId = assignment.Id.ToString(); newLine.AssignmentHyperlink = Hyperlinks.Get(assignment); var isCompleted = assignment.Status == Sungero.Workflow.Task.Status.Completed; if (isCompleted) { // Дата ознакомления. var completed = Calendar.ToUserTime(assignment.Completed.Value); newLine.AcquaintanceDate = Docflow.PublicFunctions.Module.ToShortDateShortTime(completed); // Примечание. if (!Equals(assignment.CompletedBy, assignment.Performer)) { var completedByShortName = Employees.Is(assignment.CompletedBy) ? Employees.As(assignment.CompletedBy).Person.ShortName : assignment.CompletedBy.Name; newLine.Note += string.Format("{0}\n", completedByShortName); newLine.Note += string.Format("\"{0}\"", assignment.ActiveText); } else if (!Equals(assignment.ActiveText, Reports.Resources.AcquaintanceReport.AcquaintedDefaultResult.ToString())) { newLine.Note += string.Format("\"{0}\"", assignment.ActiveText); } } // Статус. newLine.State = Functions.Module.GetAcquaintanceAssignmentState(assignment, isElectronicAcquaintance, isCompleted); dataTable.Add(newLine); } } // Фильтр по статусу выполнения. if (AcquaintanceReport.EmployeesAcquaintanceStatus.Equals(Reports.Resources.AcquaintanceReport.ForAcquaintedPerformers)) { dataTable = dataTable.Where(d => d.State == Reports.Resources.AcquaintanceReport.AcquaintedState).ToList(); } else if (AcquaintanceReport.EmployeesAcquaintanceStatus.Equals(Reports.Resources.AcquaintanceReport.ForNotAcquaintedPerformers)) { dataTable = dataTable.Where(d => d.State != Reports.Resources.AcquaintanceReport.AcquaintedState).ToList(); } Docflow.PublicFunctions.Module.WriteStructuresToTable(Constants.AcquaintanceReport.SourceTableName, dataTable); // Подвал. var currentUser = Users.Current; var printedByName = Employees.Is(currentUser) ? Employees.As(currentUser).Person.ShortName : currentUser.Name; AcquaintanceReport.Printed = Reports.Resources.AcquaintanceReport.PrintedByFormat(printedByName, Calendar.UserNow); }
/// <summary> /// Создать задачу на обработку конфликтов синхронизации контрагентов. /// </summary> /// <param name="box">Абонентский ящик.</param> /// <param name="party">Организация из сервиса обмена.</param> /// <param name="parties">Список конфликтных контрагентов.</param> /// <returns>Задача на обработку конфликтов синхронизации контрагентов.</returns> public static ICounterpartyConflictProcessingTask Create(IBusinessUnitBox box, NpoComputer.DCX.Common.Organization party, List <Parties.ICounterparty> parties) { var task = CounterpartyConflictProcessingTasks.Create(); var dateWithUTC = Sungero.Docflow.PublicFunctions.Module.GetDateWithUTCLabel(Calendar.Now); var subject = CounterpartyConflictProcessingTasks.Resources.ConflictTaskSubjectFormat(box.BusinessUnit.Name, box.ExchangeService.Name, dateWithUTC); task.Subject = Exchange.PublicFunctions.Module.CutText(subject, task.Info.Properties.Subject.Length); task.ThreadSubject = CounterpartyConflictProcessingTasks.Resources.ConflictTaskThreadSubject; task.Assignee = box.Responsible; task.MaxDeadline = Calendar.Today.AddWorkingDays(task.Assignee, 2); if (parties.All(p => Parties.CompanyBases.Is(p) && Equals(Parties.CompanyBases.As(p).TRRC, party.Kpp)) || parties.All(p => !Parties.CompanyBases.Is(p) && string.IsNullOrWhiteSpace(party.Kpp))) { task.ActiveText = CounterpartyConflictProcessingTasks.Resources.ConflictTaskMany; foreach (var attach in parties) { task.ActiveText += string.Format("{0}{1}{2}", Environment.NewLine, Constants.BusinessUnitBox.Delimiter, Hyperlinks.Get(attach)); } } else { task.ActiveText = CounterpartyConflictProcessingTasks.Resources.ConflictTaskSingleFormat(party.Name, party.Inn, party.Kpp); if (!string.IsNullOrWhiteSpace(party.Ogrn)) { task.ActiveText += CounterpartyConflictProcessingTasks.Resources.ConflictTaskSingleOgrnFormat(Environment.NewLine, party.Ogrn); } } foreach (var attach in parties) { task.Attachments.Add(attach); } task.Save(); return(task); }
public virtual void AddToCalendar(Sungero.Domain.Client.ExecuteActionArgs e) { var meeting = MeetingsCalendar.CreateMeeting(); meeting.Summary = _obj.Name; meeting.Location = _obj.Location; var startTime = Calendar.Now; if (_obj.DateTime.HasValue) { startTime = _obj.DateTime.Value; } meeting.StartTime = startTime; var endTime = startTime.AddHours(1); if (_obj.Duration.HasValue) { endTime = startTime.AddHours(_obj.Duration.Value); } meeting.EndTime = endTime; string presidentName = string.Empty; if (_obj.President != null) { presidentName = Sungero.Parties.PublicFunctions.Person.GetSurnameAndInitialsInTenantCulture(_obj.President.Person.FirstName, _obj.President.Person.MiddleName, _obj.President.Person.LastName); presidentName = Sungero.Meetings.Meetings.Resources.HtmlChairpersonTemplateFormat(presidentName); } string secretaryName = string.Empty; if (_obj.Secretary != null) { secretaryName = Sungero.Parties.PublicFunctions.Person.GetSurnameAndInitialsInTenantCulture(_obj.Secretary.Person.FirstName, _obj.Secretary.Person.MiddleName, _obj.Secretary.Person.LastName); secretaryName = Sungero.Meetings.Meetings.Resources.HtmlSecretaryTemplateFormat(secretaryName); if (_obj.President == null) { secretaryName = string.Format("<br>{0}", secretaryName); } } string meetingNote = string.Empty; if (!string.IsNullOrWhiteSpace(_obj.Note)) { meetingNote = string.Format("<br><br>{0}", _obj.Note); } var meetingDocuments = Functions.Meeting.Remote.GetMeetingDocuments(_obj, string.Empty); var documentsList = new List <string>(); string documentsListString = string.Empty; if (meetingDocuments.Any()) { foreach (var document in meetingDocuments) { documentsList.Add(string.Format("<a href=\"{0}\">{1}</a>", Hyperlinks.Get(document), document.Name)); } documentsListString = Sungero.Meetings.Meetings.Resources.HtmlMeetingDocumentsTemplateFormat(string.Join("<br>", documentsList)); } meeting.HtmlDescription = Sungero.Meetings.Meetings.Resources.HtmlDescriptionMeetingTemplateFormat(Hyperlinks.Get(_obj), _obj.DisplayName, presidentName, secretaryName, meetingNote, documentsListString); MeetingsCalendar.ShowMeeting(meeting); }
/// <summary> /// Добвить этап в схему правила согласования. /// </summary> /// <param name="linedRoute">Схема правила.</param> /// <param name="prefix">Префикс перед заголовком.</param> /// <param name="level">Отступ от левого края: 0, 1, 2.</param> /// <remarks>Используется в отчете Печать правила согласования. Вынесено в этапы для перекрываемости.</remarks> public virtual void AddStageToRoute(List <Structures.ApprovalRuleCardReport.ConditionTableLine> linedRoute, string prefix, int level) { var tableLine = new Structures.ApprovalRuleCardReport.ConditionTableLine(); var resources = Reports.Resources.ApprovalRuleCardReport; // Исполнители / роли. Роли выделить кавычками. var performers = new List <string>(); if (_obj.Assignee != null) { performers.Add(Functions.ApprovalStage.GetRecipientDescription(_obj.Assignee)); } if (_obj.Recipients.Any()) { performers.AddRange(_obj.Recipients.Select(a => Functions.ApprovalStage.GetRecipientDescription(a.Recipient))); } if (_obj.ApprovalRoles.Any()) { performers.AddRange(_obj.ApprovalRoles.Select(a => string.Format("\"{0}\"", a.ApprovalRole.Name))); } if (_obj.ApprovalRole != null) { performers.Add(string.Format("\"{0}\"", _obj.ApprovalRole.Name)); } if (_obj.StageType == StageType.Approvers) { if (_obj.AllowAdditionalApprovers == true) { performers.Add(resources.AllowAdditionalApprovers); } } tableLine.Performers = string.Join(";" + Environment.NewLine, performers).Trim(); var parameters = new List <string>(); // Тема. if (!string.IsNullOrEmpty(_obj.Subject)) { parameters.Add(string.Format("{0}: {1}", resources.Subject, _obj.Subject.Trim())); } // Старт: Друг за другом / Одновременно. var isApprovers = _obj.StageType == StageType.Approvers; var isSimpleAssignment = _obj.StageType == StageType.SimpleAgr; if (_obj.Sequence.HasValue && (isApprovers || isSimpleAssignment)) { var sequence = ApprovalStages.Info.Properties.Sequence.GetLocalizedValue(_obj.Sequence); parameters.Add(string.Format("{0}: {1}", resources.Start, sequence.Trim())); } // Настройки. var result = Functions.ApprovalStage.GetStageSettings(_obj); if (!string.IsNullOrEmpty(result)) { parameters.Add(string.Format("{0}: {1}", resources.Settings, result.Trim())); } // Доработка. var rework = Functions.ApprovalStage.GetReworkSettings(_obj); if (!string.IsNullOrEmpty(rework)) { parameters.Add(string.Format("{0}: {1}", resources.Rework, rework)); } tableLine.Parameters = string.Join(System.Environment.NewLine, parameters); // Срок. if (_obj.StageType != StageType.Notice) { var deadline = Functions.ApprovalStage.GetDeadlineDescription(_obj, 1, Environment.NewLine, false); if (deadline == string.Empty) { deadline = "-"; } tableLine.Deadline = deadline.Trim(); } // Тип этапа. tableLine.StageType = ApprovalStages.Info.Properties.StageType.GetLocalizedValue(_obj.StageType); var ruleId = _obj.Id.ToString(); var hyperlink = Hyperlinks.Get(_obj); tableLine.RuleId = ruleId; tableLine.Hyperlink = hyperlink; tableLine.Header = ApprovalRuleCardReportServerHandlers.BreakLineAndAddPadding(_obj.Name, Constants.ApprovalRuleCardReport.StageCellWidth, level); tableLine.Level = level; tableLine.IsCondition = false; linedRoute.Add(tableLine); }
public override void BeforeExecute(Sungero.Reporting.Server.BeforeExecuteEventArgs e) { // Удалить временные таблицы. IncomingDocumentsProcessingReport.DocumentsTableName = Constants.IncomingDocumentsProcessingReport.IncomingDocumentsProcessingReportTableName; var incomingDocumentsProcessingReportShortName = "IncDocPro"; IncomingDocumentsProcessingReport.AvailableIdsTableName = Docflow.PublicFunctions.Module.GetReportTableName(incomingDocumentsProcessingReportShortName, Users.Current.Id); IncomingDocumentsProcessingReport.TasksTableName = Docflow.PublicFunctions.Module.GetReportTableName(incomingDocumentsProcessingReportShortName, Users.Current.Id, "tasks"); IncomingDocumentsProcessingReport.HyperlinksTableName = Docflow.PublicFunctions.Module.GetReportTableName(incomingDocumentsProcessingReportShortName, Users.Current.Id, "hyperlinks"); IncomingDocumentsProcessingReport.ViewDataTableName = Docflow.PublicFunctions.Module.GetReportTableName(incomingDocumentsProcessingReportShortName, Users.Current.Id, "viewDates"); Docflow.PublicFunctions.Module.DropReportTempTables(new[] { IncomingDocumentsProcessingReport.AvailableIdsTableName, IncomingDocumentsProcessingReport.TasksTableName, IncomingDocumentsProcessingReport.HyperlinksTableName, IncomingDocumentsProcessingReport.ViewDataTableName }); // Создать временную таблицу с ИД доступных задач. var availableDocumentsIds = Sungero.Docflow.IncomingDocumentBases.GetAll() .Where(d => d.RegistrationState == Docflow.OfficialDocument.RegistrationState.Registered) .Where(d => d.RegistrationDate >= IncomingDocumentsProcessingReport.BeginDate.Value) .Where(d => d.RegistrationDate <= IncomingDocumentsProcessingReport.EndDate.Value) .OrderByDescending(d => d.RegistrationDate) .Select(d => d.Id); Docflow.PublicFunctions.Module.CreateTempTableForRights(IncomingDocumentsProcessingReport.AvailableIdsTableName, availableDocumentsIds); // Костыль для передачи кода культуры в CONVERT, потому что FORMAT в SQL 2008 не работает. var culture = System.Threading.Thread.CurrentThread.CurrentCulture.Name; var cultureCode = 104; var cultureCodePG = "DD.MM.YYYY"; if (culture == "en-US") { cultureCode = 101; cultureCodePG = "MM/DD/YYYY"; } if (culture == "en-GB") { cultureCode = 103; cultureCodePG = "DD/MM/YYYY"; } IncomingDocumentsProcessingReport.ReportSessionId = System.Guid.NewGuid().ToString(); var commandParams = new string[] { IncomingDocumentsProcessingReport.AvailableIdsTableName, IncomingDocumentsProcessingReport.TasksTableName }; var commandText = Queries.IncomingDocumentsProcessingReport.TasksQuery; Functions.Module.ExecuteSQLCommandFormat(commandText, commandParams); // Указать исполнителя и дату ознакомления во времени клиента. var viewDates = new List <Structures.IncomingDocumentsProcessingReport.ViewDates>(); var viewDateCreateTableQuery = string.Format(Queries.IncomingDocumentsProcessingReport.CreateViewDateQuery, IncomingDocumentsProcessingReport.ViewDataTableName); var viewDateSelectQuery = string.Format(Queries.IncomingDocumentsProcessingReport.ViewDataQuery, IncomingDocumentsProcessingReport.TasksTableName); using (var command = SQL.GetCurrentConnection().CreateCommand()) { command.CommandText = viewDateCreateTableQuery; command.ExecuteNonQuery(); command.CommandText = viewDateSelectQuery; var reader = command.ExecuteReader(); while (reader.Read()) { var assignmentId = reader.GetInt32(0); var viewDate = reader.GetDateTime(1).ToUserTime(); viewDates.Add(Structures.IncomingDocumentsProcessingReport.ViewDates.Create(assignmentId, viewDate)); } } Docflow.PublicFunctions.Module.WriteStructuresToTable(IncomingDocumentsProcessingReport.ViewDataTableName, viewDates); var updateCommand = string.Format(Queries.IncomingDocumentsProcessingReport.UpdateViewDateQuery, IncomingDocumentsProcessingReport.TasksTableName, IncomingDocumentsProcessingReport.ViewDataTableName); Docflow.PublicFunctions.Module.ExecuteSQLCommand(updateCommand); commandParams = new string[] { IncomingDocumentsProcessingReport.AvailableIdsTableName, IncomingDocumentsProcessingReport.DocumentsTableName, IncomingDocumentsProcessingReport.TasksTableName, Sungero.RecordManagement.Reports.Resources.IncomingDocumentsProcessingReport.OnReview, Sungero.RecordManagement.Reports.Resources.IncomingDocumentsProcessingReport.Sending, Sungero.RecordManagement.Reports.Resources.IncomingDocumentsProcessingReport.WithoutExecut, Sungero.RecordManagement.Reports.Resources.IncomingDocumentsProcessingReport.OnExecution, Sungero.RecordManagement.Reports.Resources.IncomingDocumentsProcessingReport.Executed, Sungero.RecordManagement.Reports.Resources.IncomingDocumentsProcessingReport.Aborted, IncomingDocumentsProcessingReport.ReportSessionId, cultureCode.ToString(), cultureCodePG }; commandText = Queries.IncomingDocumentsProcessingReport.DataQuery; Functions.Module.ExecuteSQLCommandFormat(commandText, commandParams); var hyperlinks = new List <Structures.IncomingDocumentsProcessingReport.Hyperlinks>(); var hyperlinksCreateTableQuery = string.Format(Queries.IncomingDocumentsProcessingReport.CreateHyperlinksTableQuery, IncomingDocumentsProcessingReport.HyperlinksTableName); var docIdSelectQuery = string.Format(Queries.IncomingDocumentsProcessingReport.DocIdSelectQuery, IncomingDocumentsProcessingReport.DocumentsTableName, IncomingDocumentsProcessingReport.ReportSessionId); using (var command = SQL.GetCurrentConnection().CreateCommand()) { command.CommandText = hyperlinksCreateTableQuery; command.ExecuteNonQuery(); // Для всех строк вычислить и записать в таблицу гиперссылку. command.CommandText = docIdSelectQuery; var reader = command.ExecuteReader(); while (reader.Read()) { var docId = reader.GetInt32(0); var documentHyperlink = Hyperlinks.Get(Sungero.Docflow.IncomingDocumentBases.Info, docId); hyperlinks.Add(Structures.IncomingDocumentsProcessingReport.Hyperlinks.Create(docId, documentHyperlink)); } } Docflow.PublicFunctions.Module.WriteStructuresToTable(IncomingDocumentsProcessingReport.HyperlinksTableName, hyperlinks); updateCommand = string.Format(Queries.IncomingDocumentsProcessingReport.UpdateHyperlinksQuery, IncomingDocumentsProcessingReport.DocumentsTableName, IncomingDocumentsProcessingReport.HyperlinksTableName, IncomingDocumentsProcessingReport.ReportSessionId); Docflow.PublicFunctions.Module.ExecuteSQLCommand(updateCommand); }
public override void BeforeExecute(Sungero.Reporting.Server.BeforeExecuteEventArgs e) { if (SkippedNumbersReport.DocumentRegisterId.HasValue) { SkippedNumbersReport.DocumentRegister = DocumentRegisters.Get(SkippedNumbersReport.DocumentRegisterId.Value); } SkippedNumbersReport.CurrentDate = Calendar.Now; var documentRegister = SkippedNumbersReport.DocumentRegister; var documents = Enumerable.Empty <IOfficialDocument>().AsQueryable(); AccessRights.AllowRead(() => { documents = Docflow.OfficialDocuments.GetAll() .Where(d => d.DocumentRegister == SkippedNumbersReport.DocumentRegister) .Where(d => d.RegistrationState == RegistrationState.Registered || d.RegistrationState == RegistrationState.Reserved); }); #region Период формирования отчета и разрезы var baseDate = Calendar.UserNow; var periodOffset = SkippedNumbersReport.PeriodOffset.HasValue ? SkippedNumbersReport.PeriodOffset.Value : 0; // Признак того, что отчет запущен из диалога регистрации. var launchedFromDialog = SkippedNumbersReport.RegistrationDate.HasValue; if (launchedFromDialog) { baseDate = SkippedNumbersReport.RegistrationDate.Value; // По умолчанию для отчета из диалога регистрации берем данные за последний месяц. SkippedNumbersReport.Period = Constants.SkippedNumbersReport.Month; SkippedNumbersReport.PeriodOffset = 0; } if (SkippedNumbersReport.Period.Equals(Constants.SkippedNumbersReport.Year)) { SkippedNumbersReport.PeriodBegin = Calendar.BeginningOfYear(baseDate.AddYears(periodOffset)); SkippedNumbersReport.PeriodEnd = periodOffset == 0 ? Calendar.EndOfYear(baseDate) : Calendar.EndOfYear(baseDate.AddYears(periodOffset)); } if (SkippedNumbersReport.Period.Equals(Constants.SkippedNumbersReport.Quarter)) { SkippedNumbersReport.PeriodBegin = Docflow.PublicFunctions.AccountingDocumentBase.BeginningOfQuarter(baseDate.AddMonths(3 * periodOffset)); SkippedNumbersReport.PeriodEnd = periodOffset == 0 ? Docflow.PublicFunctions.AccountingDocumentBase.EndOfQuarter(baseDate) : Docflow.PublicFunctions.AccountingDocumentBase.EndOfQuarter(baseDate.AddMonths(3 * periodOffset)); } if (SkippedNumbersReport.Period.Equals(Constants.SkippedNumbersReport.Month)) { SkippedNumbersReport.PeriodBegin = Calendar.BeginningOfMonth(baseDate.AddMonths(periodOffset)); SkippedNumbersReport.PeriodEnd = periodOffset == 0 ? Calendar.EndOfMonth(baseDate) : Calendar.EndOfMonth(baseDate.AddMonths(periodOffset)); } if (SkippedNumbersReport.Period.Equals(Constants.SkippedNumbersReport.Week)) { SkippedNumbersReport.PeriodBegin = Calendar.BeginningOfWeek(baseDate.AddDays(7 * periodOffset)); SkippedNumbersReport.PeriodEnd = periodOffset == 0 ? Calendar.EndOfWeek(baseDate) : Calendar.EndOfWeek(baseDate.AddDays(7 * periodOffset)); } // Получить границы периода журнала регистрации. var registrationDate = launchedFromDialog ? SkippedNumbersReport.RegistrationDate.Value : SkippedNumbersReport.PeriodEnd.Value; DateTime?documentRegisterPeriodBegin = Functions.DocumentRegister.GetBeginPeriod(documentRegister, registrationDate); DateTime?documentRegisterPeriodEnd = Functions.DocumentRegister.GetEndPeriod(documentRegister, registrationDate) ?? SkippedNumbersReport.PeriodEnd.Value; // Начало расчетного периода. var periodBegin = SkippedNumbersReport.PeriodBegin; // Если отчет вызван из диалога регистрации взять "месяц назад" от даты регистрации. if (launchedFromDialog) { periodBegin = registrationDate.AddMonths(-1); } // Если начало указанного периода раньше начала периода журнала, то считать от последнего. if (documentRegisterPeriodBegin.HasValue && documentRegisterPeriodBegin > periodBegin) { periodBegin = documentRegisterPeriodBegin; } else if (!documentRegisterPeriodBegin.HasValue) { documentRegisterPeriodBegin = Calendar.SqlMinValue; } SkippedNumbersReport.PeriodBegin = periodBegin; // Конец расчетного периода. var periodEnd = launchedFromDialog ? SkippedNumbersReport.RegistrationDate.Value.EndOfDay() : SkippedNumbersReport.PeriodEnd; SkippedNumbersReport.PeriodEnd = periodEnd; var hasLeadingDocument = SkippedNumbersReport.LeadingDocument != null; var hasDepartment = SkippedNumbersReport.Department != null; var hasBusinessUnit = SkippedNumbersReport.BusinessUnit != null; // Отфильтровать документы по разрезам. if (hasLeadingDocument) { documents = documents.Where(d => Equals(d.LeadingDocument, SkippedNumbersReport.LeadingDocument)); } if (hasDepartment) { documents = documents.Where(d => Equals(d.Department, SkippedNumbersReport.Department)); } if (hasBusinessUnit) { documents = documents.Where(d => Equals(d.BusinessUnit, SkippedNumbersReport.BusinessUnit)); } #endregion #region Генерация формата номера var numberFormat = string.Empty; foreach (var item in documentRegister.NumberFormatItems.OrderBy(x => x.Number)) { var elementName = string.Empty; if (item.Element == DocumentRegisterNumberFormatItems.Element.Number) { elementName = DocumentRegisters.Resources.NumberFormatNumber; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.Year2Place || item.Element == DocumentRegisterNumberFormatItems.Element.Year4Place) { elementName = DocumentRegisters.Resources.NumberFormatYear; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.Quarter) { elementName = DocumentRegisters.Resources.NumberFormatQuarter; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.Month) { elementName = DocumentRegisters.Resources.NumberFormatMonth; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.LeadingNumber) { elementName = DocumentRegisters.Resources.NumberFormatLeadingNumber; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.Log) { elementName = DocumentRegisters.Resources.NumberFormatLog; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.RegistrPlace) { elementName = DocumentRegisters.Resources.NumberFormatRegistrPlace; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.CaseFile) { elementName = DocumentRegisters.Resources.NumberFormatCaseFile; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.DepartmentCode) { elementName = DocumentRegisters.Resources.NumberFormatDepartmentCode; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.BUCode) { elementName = DocumentRegisters.Resources.NumberFormatBUCode; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.DocKindCode) { elementName = DocumentRegisters.Resources.NumberFormatDocKindCode; } else if (item.Element == DocumentRegisterNumberFormatItems.Element.CPartyCode) { elementName = DocumentRegisters.Resources.NumberFormatCounterpartyCode; } numberFormat += elementName + item.Separator; } SkippedNumbersReport.NumberFormat = numberFormat; #endregion #region Границы индексов в выбранном периоде // Получить минимальный индекс по документам в периоде (при ручной регистрации мб нарушение следования индексов). var firstDocumentIndex = Functions.DocumentRegister.GetIndex(documents, periodBegin, periodEnd, false); // Получить индекс документа из предыдущего периода. var previousIndex = 0; if (periodBegin != documentRegisterPeriodBegin) { previousIndex = Functions.DocumentRegister.FilterDocumentsByPeriod(documents, documentRegisterPeriodBegin, periodBegin.Value.AddDays(-1).EndOfDay()) .Where(d => !firstDocumentIndex.HasValue || d.Index < firstDocumentIndex).Select(d => d.Index).OrderByDescending(a => a).FirstOrDefault() ?? 0; } if (firstDocumentIndex == null) { firstDocumentIndex = previousIndex + 1; } var firstIndex = firstDocumentIndex < previousIndex ? firstDocumentIndex : previousIndex + 1; // Получить первый индекс документа следующего периода. var nextIndex = periodEnd != documentRegisterPeriodEnd? Functions.DocumentRegister.GetIndex(documents, periodEnd.Value.AddDays(1).BeginningOfDay(), documentRegisterPeriodEnd, false) : null; // Если в следующем периоде ещё нет документов, то взять текущий индекс журнала. var leadingDocumentId = hasLeadingDocument ? SkippedNumbersReport.LeadingDocument.Id : 0; var departmentId = hasDepartment ? SkippedNumbersReport.Department.Id : 0; var businessUnitId = hasBusinessUnit ? SkippedNumbersReport.BusinessUnit.Id : 0; if (nextIndex == null) { nextIndex = Functions.DocumentRegister.GetCurrentNumber(documentRegister, registrationDate, leadingDocumentId, departmentId, businessUnitId) + 1; } // Получить индекс по зарегистрированным документам (при ручной регистрации мб нарушение следования индексов). var lastDocumentIndex = Functions.DocumentRegister.GetIndex(documents, periodBegin, periodEnd, true) ?? nextIndex - 1; var lastIndex = lastDocumentIndex >= nextIndex ? lastDocumentIndex : nextIndex - 1; // Для случая когда нет документов в периоде. if (lastIndex < firstIndex) { lastIndex = firstIndex - 1; } #endregion // Отфильтровать документы по найденным границам индексов и по периоду журнала регистрации. // Допускать документы с номером не соответствующим формату (Index = 0). documents = documents .Where(d => !documentRegisterPeriodBegin.HasValue || d.RegistrationDate >= documentRegisterPeriodBegin) .Where(d => !documentRegisterPeriodEnd.HasValue || d.RegistrationDate <= documentRegisterPeriodEnd) .Where(l => l.Index >= firstIndex && l.Index <= lastIndex || (l.Index == 0 && l.RegistrationDate <= SkippedNumbersReport.PeriodEnd && l.RegistrationDate >= SkippedNumbersReport.PeriodBegin)); // Заполнить маску для гиперссылки. if (documents.Count() > 0) { var link = Hyperlinks.Get(documents.First()); var index = link.IndexOf("?type="); SkippedNumbersReport.hyperlinkMask = link.Substring(0, index) + "?type=DocGUID&id=DocId"; } else { SkippedNumbersReport.hyperlinkMask = string.Empty; } #region Вычислить пропущенные индексы // Создать временную таблицу для списка номеров "подряд". var skipsTableName = Constants.SkippedNumbersReport.SkipsTableName; SkippedNumbersReport.SkipsTableName = skipsTableName; var skipedNumberList = new List <string>(); var skipedNumbers = new List <Structures.SkippedNumbersReport.SkippedNumber>(); var reportSessionId = Guid.NewGuid().ToString(); SkippedNumbersReport.ReportSessionId = reportSessionId; // Заполнить таблицу номеров. var month = documentRegisterPeriodBegin.Value.Month < 10 ? string.Format("0{0}", documentRegisterPeriodBegin.Value.Month) : documentRegisterPeriodBegin.Value.Month.ToString(); var day = documentRegisterPeriodBegin.Value.Day < 10 ? string.Format("0{0}", documentRegisterPeriodBegin.Value.Day) : documentRegisterPeriodBegin.Value.Day.ToString(); var startDate = string.Format("{0}{1}{2}", documentRegisterPeriodBegin.Value.Year, month, day); month = documentRegisterPeriodEnd.Value.Month < 10 ? string.Format("0{0}", documentRegisterPeriodEnd.Value.Month) : documentRegisterPeriodEnd.Value.Month.ToString(); day = documentRegisterPeriodEnd.Value.Day < 10 ? string.Format("0{0}", documentRegisterPeriodEnd.Value.Day) : documentRegisterPeriodEnd.Value.Day.ToString(); var endDate = string.Format("{0}{1}{2}", documentRegisterPeriodEnd.Value.Year, month, day); var queryText = string.Format(Queries.SkippedNumbersReport.GetSkippedIndexes, SkippedNumbersReport.DocumentRegister.Id.ToString(), (firstIndex - 1).ToString(), (lastIndex + 1).ToString(), hasBusinessUnit.ToString(), businessUnitId.ToString(), hasDepartment.ToString(), departmentId.ToString(), hasLeadingDocument.ToString(), leadingDocumentId.ToString(), documentRegisterPeriodBegin.HasValue.ToString(), startDate, endDate); // Получить интервалы пропущеных индексов журнала в периоде. // Key - начало интервала, Value - окончиние интервала. var skippedIndexIntervals = new Dictionary <int, int>(); using (var command = SQL.GetCurrentConnection().CreateCommand()) { command.CommandText = queryText; var result = command.ExecuteReader(); while (result.Read()) { skippedIndexIntervals.Add((int)result[1], (int)result[0]); } result.Close(); } // Заполнить отчет данными для пропущенных индексов. foreach (var interval in skippedIndexIntervals) { var intervalStart = interval.Key; var intervalEnd = interval.Value; // Три и более подряд идущих пропущеных индексов должны быть собраны в одну строку. var intervalLength = intervalEnd - intervalStart + 1; if (intervalLength >= 3) { skipedNumbers.Add(Structures.SkippedNumbersReport.SkippedNumber.Create(Docflow.Reports.Resources.SkippedNumbersReport.NumbersAreSkipped, string.Format("{0}-{1}", intervalStart.ToString(), intervalEnd.ToString()), intervalStart, reportSessionId)); skipedNumberList.Add(string.Format("{0}-{1}", intervalStart.ToString(), intervalEnd.ToString())); continue; } for (var i = intervalStart; i <= intervalEnd; i++) { skipedNumbers.Add(Structures.SkippedNumbersReport.SkippedNumber.Create(Docflow.Reports.Resources.SkippedNumbersReport.NumberIsSkipped, i.ToString(), i, reportSessionId)); skipedNumberList.Add(i.ToString()); } } #endregion Functions.Module.WriteStructuresToTable(skipsTableName, skipedNumbers); // Получить 8-10 первых пропущенных номеров строкой. Для остальных указать общее количество. var skipedNumberCount = skipedNumberList.Count; var maxDisplayedNumberCount = 10; var minHiddenNumberCount = 3; var displayedValuesCount = skipedNumberCount; if (skipedNumberCount >= (maxDisplayedNumberCount + minHiddenNumberCount)) { displayedValuesCount = maxDisplayedNumberCount; } else if (skipedNumberCount > maxDisplayedNumberCount) { displayedValuesCount = skipedNumberCount - minHiddenNumberCount; } SkippedNumbersReport.SkipedNumberList = string.Join(", ", skipedNumberList.ToArray(), 0, displayedValuesCount); var hiddenSkipedNumberCount = skipedNumberCount - displayedValuesCount; if (hiddenSkipedNumberCount > 0) { var numberLabel = Functions.Module.GetNumberDeclination(hiddenSkipedNumberCount, Resources.SkippedNumbersReportNumber, Resources.SkippedNumbersReportNumberGenetive, Resources.SkippedNumbersReportNumberPlural); SkippedNumbersReport.SkipedNumberList += string.Format(Sungero.Docflow.Reports.Resources.SkippedNumbersReport.And, hiddenSkipedNumberCount, numberLabel); } // Создать таблицу для доступных пользователю документов. var availableDocuments = new List <Structures.SkippedNumbersReport.AvailableDocument>(); var previousDocDate = Calendar.SqlMinValue; foreach (var document in documents.ToList().OrderBy(x => x.Index)) { var numberOnFormat = document.Index != null && document.Index != 0; var canRead = document.AccessRights.CanRead(); var inCorrectOrder = (previousDocDate <= document.RegistrationDate || !numberOnFormat) && (document.RegistrationDate >= SkippedNumbersReport.PeriodBegin && document.RegistrationDate <= SkippedNumbersReport.PeriodEnd); availableDocuments.Add(Structures.SkippedNumbersReport.AvailableDocument.Create(document.Id, numberOnFormat, canRead, inCorrectOrder, reportSessionId)); if (numberOnFormat && inCorrectOrder) { previousDocDate = document.RegistrationDate.Value; } } SkippedNumbersReport.AvailableDocumentsTableName = Constants.SkippedNumbersReport.AvailableDocumentsTableName; Functions.Module.WriteStructuresToTable(SkippedNumbersReport.AvailableDocumentsTableName, availableDocuments); }
public override void BeforeExecute(Sungero.Reporting.Server.BeforeExecuteEventArgs e) { // Задать минимальную и максимальную даты. Формат yyyy-MM-dd нужен для правильного парсинга на ru и en локализациях. DocumentReturnReport.MinDeliveryDate = DateTime.Parse("1753-01-01"); DocumentReturnReport.MaxDeliveryDate = DateTime.Parse("9999-12-31"); // Отфильтровать доступные документы. var documents = Docflow.OfficialDocuments.GetAll() .Where(d => d.IsReturnRequired.HasValue) .Where(d => d.Tracking.Any(l => (!l.ReturnDate.HasValue || l.ReturnResult == Docflow.OfficialDocumentTracking.ReturnResult.AtControl) && l.ExternalLinkId == null)); // Фильтр по дате выдачи. if (DocumentReturnReport.DeliveryDateFrom.HasValue) { documents = documents.Where(d => d.Tracking.Any(l => l.DeliveryDate >= DocumentReturnReport.DeliveryDateFrom && !l.ReturnDate.HasValue)); } if (DocumentReturnReport.DeliveryDateTo.HasValue) { documents = documents.Where(d => d.Tracking.Any(l => l.DeliveryDate <= DocumentReturnReport.DeliveryDateTo && !l.ReturnDate.HasValue)); } // Фильтр по НОР. if (DocumentReturnReport.BusinessUnit != null) { documents = documents.Where(d => Equals(d.BusinessUnit, DocumentReturnReport.BusinessUnit)); } // Фильтр по подразделению сотрудника. if (DocumentReturnReport.Department != null) { documents = documents.Where(d => d.Tracking.Any(l => Equals(l.DeliveredTo.Department, DocumentReturnReport.Department) && !l.ReturnDate.HasValue)); } // Фильтр по сотруднику. if (DocumentReturnReport.Employee != null) { documents = documents.Where(d => d.Tracking.Any(l => Equals(l.DeliveredTo, DocumentReturnReport.Employee) && !l.ReturnDate.HasValue)); } var reportSessionId = System.Guid.NewGuid().ToString(); DocumentReturnReport.ReportSessionId = reportSessionId; // Заполнить данные. var dataTable = new List <Structures.DocumentReturnReport.DocumentReturnTableLine>(); foreach (var document in documents) { // Заполнить информацию о выдачах документа. var tracking = document.Tracking.Where(l => (!l.ReturnDate.HasValue || l.ReturnResult == Docflow.OfficialDocumentTracking.ReturnResult.AtControl) && l.ExternalLinkId == null); var docHyperlink = Hyperlinks.Get(document); foreach (var location in tracking) { var tableLine = Structures.DocumentReturnReport.DocumentReturnTableLine.Create(); tableLine.ReportSessionId = reportSessionId; tableLine.DocId = document.Id; tableLine.DocName = document.Name; tableLine.OriginalOrCopy = location.IsOriginal.Value ? Reports.Resources.DocumentReturnReport.Original : Reports.Resources.DocumentReturnReport.Copy; tableLine.Hyperlink = docHyperlink; // Заполнить информацию по дате выдаче и просрочке. var today = Calendar.UserToday; tableLine.DeliveryDate = location.DeliveryDate.Value.ToString("d"); var returnDeadline = location.ReturnDeadline; tableLine.ScheduledReturnDate = returnDeadline.HasValue ? returnDeadline.Value.ToString("d") : "-"; var scheduledReturnDate = returnDeadline ?? today.AddDays(1); tableLine.OverdueDelay = Docflow.PublicFunctions.Module.CalculateDelay(scheduledReturnDate, today, location.DeliveredTo); // Заполнить информацию о сотруднике. var employee = location.DeliveredTo; tableLine.FullName = employee.Person.ShortName ?? employee.Name; tableLine.DepId = employee.Department.Id; tableLine.DepName = employee.Department.Name; dataTable.Add(tableLine); } } Docflow.PublicFunctions.Module.WriteStructuresToTable(Constants.DocumentReturnReport.SourceTableName, dataTable); }
public override StateView GetDocumentSummary() { var documentSummary = StateView.Create(); var documentBlock = documentSummary.AddBlock(); // Краткое имя документа. var documentName = _obj.DocumentKind.Name; if (!string.IsNullOrWhiteSpace(_obj.RegistrationNumber)) { documentName += Docflow.OfficialDocuments.Resources.Number + _obj.RegistrationNumber; } if (_obj.RegistrationDate != null) { documentName += Docflow.OfficialDocuments.Resources.DateFrom + _obj.RegistrationDate.Value.ToString("d"); } documentBlock.AddLabel(documentName); // Типовой/Не типовой. var isStandardLabel = _obj.IsStandard.Value ? ContractBases.Resources.isStandartContract : ContractBases.Resources.isNotStandartContract; documentBlock.AddLabel(string.Format("({0})", isStandardLabel)); documentBlock.AddLineBreak(); documentBlock.AddLineBreak(); // Контрагент. documentBlock.AddLabel(string.Format("{0}:", ContractBases.Resources.Counterparty)); if (_obj.Counterparty != null) { documentBlock.AddLabel(Hyperlinks.Get(_obj.Counterparty)); if (_obj.Counterparty.Nonresident == true) { documentBlock.AddLabel(string.Format("({0})", _obj.Counterparty.Info.Properties.Nonresident.LocalizedName).ToLower()); } } else { documentBlock.AddLabel("-"); } documentBlock.AddLineBreak(); // Содержание. var subject = !string.IsNullOrEmpty(_obj.Subject) ? _obj.Subject : "-"; documentBlock.AddLabel(string.Format("{0}: {1}", ContractBases.Resources.Subject, subject)); documentBlock.AddLineBreak(); // Сумма договора. var amount = this.GetTotalAmountDocumentSummary(_obj.TotalAmount, _obj.Currency); var amountText = string.Format("{0}: {1}", _obj.Info.Properties.TotalAmount.LocalizedName, amount); documentBlock.AddLabel(amountText); documentBlock.AddLineBreak(); // Срок действия договора. var validity = "-"; var validFrom = _obj.ValidFrom.HasValue ? string.Format("{0} {1} ", ContractBases.Resources.From, _obj.ValidFrom.Value.Date.ToShortDateString()) : string.Empty; var validTill = _obj.ValidTill.HasValue ? string.Format("{0} {1}", ContractBases.Resources.Till, _obj.ValidTill.Value.Date.ToShortDateString()) : string.Empty; var isAutomaticRenewal = _obj.IsAutomaticRenewal.Value && !string.IsNullOrEmpty(validTill) ? string.Format(", {0}", ContractBases.Resources.Renewal) : string.Empty; if (!string.IsNullOrEmpty(validFrom) || !string.IsNullOrEmpty(validTill)) { validity = string.Format("{0}{1}{2}", validFrom, validTill, isAutomaticRenewal); } var validityText = string.Format("{0}:", ContractBases.Resources.Validity); documentBlock.AddLabel(validityText); documentBlock.AddLabel(validity); documentBlock.AddLineBreak(); documentBlock.AddEmptyLine(); // Примечание. var note = string.IsNullOrEmpty(_obj.Note) ? "-" : _obj.Note; var noteText = string.Format("{0}:", ContractBases.Resources.Note); documentBlock.AddLabel(noteText); documentBlock.AddLabel(note); return(documentSummary); }
/// <summary> /// Сводка по документу. /// </summary> /// <returns>Сводка.</returns> public override StateView GetDocumentSummary() { var documentSummary = StateView.Create(); var block = documentSummary.AddBlock(); // Краткое имя документа. var documentName = _obj.DocumentKind.Name; if (!string.IsNullOrWhiteSpace(_obj.RegistrationNumber)) { documentName += Docflow.OfficialDocuments.Resources.Number + _obj.RegistrationNumber; } if (_obj.RegistrationDate != null) { documentName += Docflow.OfficialDocuments.Resources.DateFrom + _obj.RegistrationDate.Value.ToString("d"); } block.AddLabel(documentName); block.AddLineBreak(); block.AddEmptyLine(); // Контрагент. block.AddLabel(string.Format("{0}: ", _obj.Info.Properties.Counterparty.LocalizedName)); if (_obj.Counterparty != null) { block.AddLabel(Hyperlinks.Get(_obj.Counterparty)); if (_obj.Counterparty.Nonresident == true) { block.AddLabel(string.Format("({0})", _obj.Counterparty.Info.Properties.Nonresident.LocalizedName).ToLower()); } } else { block.AddLabel("-"); } block.AddLineBreak(); // Содержание. var subject = !string.IsNullOrEmpty(_obj.Subject) ? _obj.Subject : "-"; block.AddLabel(string.Format("{0}: {1}", _obj.Info.Properties.Subject.LocalizedName, subject)); block.AddLineBreak(); // Сумма. var amount = this.GetTotalAmountDocumentSummary(_obj.TotalAmount, _obj.Currency); var amountText = string.Format("{0}: {1}", _obj.Info.Properties.TotalAmount.LocalizedName, amount); block.AddLabel(amountText); block.AddLineBreak(); // Оплатить до. var paymentDeadline = _obj.PaymentDueDate.HasValue ? _obj.PaymentDueDate.Value.ToString("d") : "-"; var paymentDeadlineText = string.Format("{0}: {1}", _obj.Info.Properties.PaymentDueDate.LocalizedName, paymentDeadline); block.AddLabel(paymentDeadlineText); block.AddLineBreak(); block.AddEmptyLine(); // Примечание. var note = !string.IsNullOrEmpty(_obj.Note) ? _obj.Note : "-"; block.AddLabel(string.Format("{0}: {1}", _obj.Info.Properties.Note.LocalizedName, note)); return(documentSummary); }
/// <summary> /// Добавить гиперссылку на номенклатуру дел к строке. /// </summary> /// <param name="source">Исходная строка.</param> /// <returns>Строка, дополненная ссылкой на номенклатуру дел.</returns> public virtual string AppendCaseFilesHyperlinkTo(string source) { return(string.Format("{0}{1}{2}", source, Environment.NewLine, Hyperlinks.Get(CaseFiles.Info))); }