예제 #1
0
        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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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();
        }
예제 #4
0
 /// <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);
        }
예제 #6
0
        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);
        }
예제 #8
0
        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);
        }
예제 #9
0
        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);
        }
예제 #10
0
        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);
        }
예제 #11
0
        /// <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);
        }
예제 #12
0
        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);
        }
예제 #13
0
        /// <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);
        }
예제 #14
0
        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);
        }
예제 #16
0
        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);
        }
예제 #18
0
        /// <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);
        }
예제 #19
0
 /// <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)));
 }